html
🎁 本文已收录于 CS-Wiki(Gitee 官方推荐项目,现已 0.9k star)git
计算机网络的知识点很是杂乱且琐碎,很是容易让人产生畏惧心理。其实计网通篇研究的核心就是不一样计算机之间的通讯过程,👍 本文将从小白的角度,讲解两台计算机之间是如何精确的找到对方的位置并发送和接收消息的,以帮助读者从宏观角度把握计算机网络的体系结构面试
所谓通讯协议就是通讯双方都必需要遵照的通讯规则。若是没有网络通讯协议,计算机的数据将没法发送到网络上,更没法到达对方计算机,即便可以到达,对方也未必能读懂。有了通讯协议,网络通讯才可以发生。算法
通常咱们用五层协议参考模型来进行计算机网络的学习:数据库
应用层后端
运输层浏览器
网络层缓存
数据链路层服务器
物理层网络
上述各层的做用会在下文详细讲解,咱们首先要明白为何要分层:
协议的实现是很复杂的。由于协议要把人读得懂的数据,如网页、电子邮件等加工转化成能够在网络上传输的信号,须要进行的处理工做很是多。
两个系统中实体间的通讯是一个十分复杂的过程。为了减小协议设计和调试过程的复杂性,网络协议一般都按结构化的层次方式来进行组织,每一层完成必定功能,每一层又都创建在它的下层之上。不一样的网络协议,其层的数量、各层的名字、和功能不尽相同。
👍 也就是说,每一层都是在下一层的基础上,经过层间接口向上一层提供必定的服务,而把 “这种服务是如何实现的” 细节对上层加以屏蔽。
❓ 那么,咱们将一个大型网络体系分红了若干个层,各个层之间是如何进行通讯的呢?
1)对等层之间通讯(不一样开放系统中的相同层次之间的通讯,对等层实体之间的信息交换):OSI 标准为每一层的通讯都严格定义了 协议数据单元 PDU的格式。 对等层之间的通讯是目的,对等层实体的协做保证该层功能和服务的实现
2)相邻层之间通讯(相邻的上下层之间的通讯,属于局部问题):相邻层之间的通讯是手段,保证对等层实体之间的通讯得以实 施
⭐ 假设网络协议分为若干层,那么 A、B 两节点通讯,实际是节点 A 的第 n 层与节点 B 的第 n 层进行通讯,故协议老是指某一层的协议,例如物理层协议、传输层协议、应用层协议。每一相邻层协议间有一接口,下层经过该接口向上一层提供服务。
两台计算机之间要进行通讯,必然须要传输介质/物理媒介来链接两台计算机,这样,咱们才能把数据传输过去。传输介质分为:
导向型传输介质:
双绞线:适用于近距离
同轴电缆(抗干扰性强):适用于远距离
光纤:带宽远远大于其余传输媒体
非导向型传输介质:
无线电波
微波
红外线、激光
⭐ 也就是说,物理层的做用就是实现计算机之间的数据传送,这个数据实际上是比特流,物理层须要尽量屏蔽掉具体传输介质和物理设备的差别, 使其上面的数据链路层没必要考虑网络的具体传输介质是什么,即实现比特流的透明传输。
物理层只是简单的把计算机链接起来并在上面传输比特流,它仍是存在着不少问题的:
1)物理链接是有差错和不可靠的
2)物理设备之间可能存在传输速度不匹配问题
也就是说仅仅靠物理层是没法保证数据传输的正确性的。
⭐ 这样,数据链路层的主要做用就是增强物理层传输原始比特流的功能,将物理层提供的可能出错的物理链接改形成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。在物理层提供服务的基础上,数据链路层还肩负着为网络层提供服务的责任,其最基本的服务是未来自网络层的 IP 数据报封装成帧,可靠的传输到相邻结点的目标网络层。
首先了解一下为何须要封装成帧:前面说了,物理层它只是简单的把计算机链接起来并在上面传输比特流(0、1 序列),若是这些 0,1 组合的传送毫无规则的话,计算机是解读不了的。所以,咱们须要制定一套规则来进行 0、1 的传送,让计算可以读懂这些序列。
⭐ 封装成帧就是:发送端的数据链路层接收到上层网络层传过来的 IP 数据报后,在其先后部分添加首部、尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
把一台计算的的数据经过物理层和链路层发送给另外一台计算机,到底是谁发给谁的,计算机与计算机之间如何区分,你总得给他们一个惟一的标识吧?
因而,MAC 地址出现了 👇
MAC 地址就是链路层地址,长度为 6 字节(48 位),用于惟一标识网络适配器(网卡)。计算机之间的数据传送,就是经过 MAC 地址来惟一寻找、传送的。
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑广泛存在无线网络适配器和有线网络适配器,所以就有两个 MAC 地址。
❓ 那么,一台计算机它是如何知道另外一台计算机的 MAC 地址的呢?这是网络层的 ARP 地址解析协议作的事情,详见下文 👇
在 计算机网络中进行通讯的两个计算机之间可能会通过不少个数据链路,也可能还要通过不少通讯子网。
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。
在 TCP/IP 体系结构中,因为网络层使用 IP 协议,所以分组也叫 IP 数据报 ,简称数据报。
IP 协议用于屏蔽下层物理网络的差别,为上层提供统一的 IP 数据报。
IP 协议定义的地址,咱们称之为 IP 地址。IP 数据报中含有发/收方的 IP 地址。
IP 协议提供无链接的、不可靠的、尽力的数据报投递服务
1)无链接的投递服务
发送端可于任什么时候候自由发送数据,而接收端永远不知道本身会在什么时候从哪里接收到数据。每一个数据报独立处理和传输, 一台主机发出的数据报序列,可能取不一样的路径, 甚至其中的一部分数据报会在传输过程当中丢失;
2)不可靠的投递服务
IP 协议自己不保证数据报投递的结果。 在传输的过程当中,数据报可能会丢失、重复、延迟和乱序等, IP协议不对内容做任何检测,也不将这些结果通知收发双方; I 数据报的丢失,经过路由器发 ICMP报文
告知; 必要时,由高层实体(如TCP)负责差错恢复动做。
3)尽力投递服务
执行数据报的分段和封装,以适应具体的传输网络, 由最终结点的IP模块进行合段处理
不一样物理网络对传输的帧 /分组的体积有不一样的规定; 当数据报长度 > MTU(最大传输单元 MTU—Maximun Transfer Unit )时,需对数据报分段 。
OK,有了上面 IP 协议的知识,咱们来说解一台计算机它是如何知道另外一台计算机的 MAC 地址的,这就是网络层的 ARP 地址解析协议作的事情。
网络层实现主机之间的通讯,而链路层实现具体每段链路之间的通讯。所以在通讯过程当中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
⭐ ARP(Address Resolution Protocol )协议就能够实现由 IP 地址获得 MAC 地址。
每一个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
若是主机 A 知道主机 B 的 IP 地址,可是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 经过广播的方式发送 ARP 请求分组(该分组携带本身的 IP 地址 和 MAC 地址 以及 目标主机的 IP 地址),主机 B 收到该请求后会发送 ARP 响应分组 给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
💡 对应的,RARP 协议能够实现由 MAC地址转化为 IP 地址
❓ 那么,咱们如何知道对方计算机的 IP 地址呢,这是 DNS 协议作的事情,在应用层咱们会详细讲解。
经过物理层、数据链路层以及网络层的互相做用,咱们已经把数据成功从计算机 A 传送到计算机 B 了,但是,计算机 B 里面有各类各样的应用程序,计算机 B 该如何知道这些数据是给哪一个应用程序的呢?
因此,咱们在从计算机 A 传数据给计算表 B 的时候,还得指定一个端口(Port),以供特定的应用程序来接受处理。即 IP 地址 + 端口号就能够惟一肯定某个主机上的某个应用进程
⭐ 也就是说,网络层的功能是创建主机到主机的通讯,而传输层的功能就是创建端口到端口的通讯(也能够说是进程到进程之间的通讯)
传输层最多见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不一样就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
1)用户数据报协议 UDP(User Datagram Protocol)
UDP 在传送数据以前不须要先创建链接,远程主机在收到 UDP 报文后,不须要给出任何确认。虽然
UDP 不提供可靠交付,但在某些状况下 UDP 确是一种最有效的工做方式(通常用于即时通讯),比
如: QQ 语音、 QQ 视频 、直播等等
2)传输控制协议 TCP(Transmission Control Protocol)
TCP 提供面向链接的服务。在传送数据以前必须先创建链接,数据传送结束后要释放链接。
TCP 不提供广播或多播服务。因为 TCP 要提供可靠的,面向链接的传输服务(TCP 的可靠体如今 TCP 在传递数据以前,会有三次握手来创建链接,并且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会断开链接用来节约系统资源。这不只使协议数据单元的首部增大不少,还要占用许多处理机资源。TCP 通常用于文件传输、发送和接收邮件、远程登陆等场景。
应用层最接近于用于,它的任务就是经过应用进程间的交互来完成特定网络应用。
应用层协议定义的是应用进程间的通讯和交互的规则。因为传输层传来的数据五花八门,有 html 格式的,有 mp4 格式等等,因此对于不一样的网络应用须要不一样的应用层协议。在互联网中应用层协议不少,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。咱们把应用层交互的数据单元称为报文。
因为本文的关键就是讲解计算机之间的通讯,因此其余协议咱们就不讲了,只讲解一下 DNS 协议是如何将域名转化为 IP 地址的。
域名系统 Domain Name System 缩写 DNS,是因特网的一项核心服务,它做为能够将域名和 IP 地址相互映射的一个分布式数据库 (这里的分布式数据库是指,每一个站点只保留它本身的那部分数据),可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的 IP 地址。
域名具备层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS 可使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。
大多数状况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须本身处理超时和重传从而保证可靠性。
域名解析方式:
递归查询
迭代查询
基本原理:
1)浏览器搜索本身的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表;
2)若没有,则搜索操做系统的 DNS 缓存;
3)若没有,则操做系统将域名发送至本地域名服务器(递归查询方式),本地域名服务器查询本身的 DNS 缓存,查找成功则返回结果,不然,经过如下方式迭代查找:
本地域名服务器向根域名服务器发起请求,根域名服务器返回 com 域的顶级域名服务器的地址;
本地域名服务器向 com 域的顶级域名服务器发起请求,返回权限域名服务器地址
本地域名服务器向权限域名服务器发起请求,获得 IP 地址
4)本地域名服务器将获得的 IP 地址返回给操做系统,同时本身将 IP 地址缓存起来
5)操做系统将 IP 地址返回给浏览器,同时本身也将 IP 地址缓存起来
至此,浏览器已经获得了域名对应的 IP 地址。
🎉 计算机之间的通讯过程至此完毕,固然,里面不少的细节并无详细叙述,计算机网络的知识点比较杂乱,本篇只做为你们构建计算机网络知识体系的开篇之旅
博主东南大学研究生在读,利用课余时间运营一个公众号『 飞天小牛肉 』,2020/12/29 日开通,专一分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操做系统 + Linux)、Java 基础和面试指南的相关原创技术好文。本公众号的目的就是让你们能够快速掌握重点知识,有的放矢。但愿你们多多支持哦,和小牛肉一块儿成长 😃
并推荐我的维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已 0.9k star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~ 😊