💻 一文读懂两台计算机之间是如何通信的
前言
计算机网络的知识点非常杂乱且琐碎,非常容易让人产生畏惧心理。其实计网通篇研究的核心就是不同计算机之间的通信过程,👍 本文将从小白的角度,讲解两台计算机之间是如何精确的找到对方的位置并发送和接收消息的,以帮助读者从宏观角度把握计算机网络的体系结构。
1. 五层协议参考模型
所谓通信协议就是通信双方都必须要遵守的通信规则。如果没有网络通信协议,计算机的数据将无法发送到网络上,更无法到达对方计算机,即使能够到达,对方也未必能读懂。有了通信协议,网络通信才能够发生。
一般我们用五层协议参考模型来进行计算机网络的学习:
应用层
运输层
网络层
数据链路层
物理层
上述各层的作用会在下文详细讲解,我们首先要明白为什么要分层:
协议的实现是很复杂的。因为协议要把人读得懂的数据,如网页、电子邮件等加工转化成可以在网络上传输的信号,需要进行的处理工作非常多。
两个系统中实体间的通信是一个十分复杂的过程。为了减少协议设计和调试过程的复杂性,网络协议通常都按结构化的层次方式来进行组织,每一层完成一定功能,每一层又都建立在它的下层之上。不同的网络协议,其层的数量、各层的名字、和功能不尽相同。
👍 也就是说,每一层都是在下一层的基础上,通过层间接口向上一层提供一定的服务,而把 “这种服务是如何实现的” 细节对上层加以屏蔽。
❓ 那么,我们将一个大型网络体系分成了若干个层,各个层之间是如何进行通信的呢?
1)对等层之间通信(不同开放系统中的相同层次之间的通信,对等层实体之间的信息交换):OSI 标准为每一层的通信都严格定义了 协议数据单元 PDU 的格式。 对等层之间的通信是目的,对等层实体的协作保证该层功能和服务的实现
2)相邻层之间通信(相邻的上下层之间的通信,属于局部问题):相邻层之间的通信是手段,保证对等层实体之间的通信得以实 施
⭐ 假设网络协议分为若干层,那么 A、B 两节点通信,实际是节点 A 的第 n 层与节点 B 的第 n 层进行通信,故协议总是指某一层的协议,例如物理层协议、传输层协议、应用层协议。每一相邻层协议间有一接口,下层通过该接口向上一层提供服务。
2. 物理层
两台计算机之间要进行通信,必然需要传输介质/物理媒介来连接两台计算机,这样,我们才能把数据传输过去。传输介质分为:
导向型传输介质:
非导向型传输介质:
⭐ 也就是说,物理层的作用就是实现计算机之间的数据传送,这个数据其实是比特流,物理层需要尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么,即实现比特流的透明传输。
3. 数据链路层
物理层只是简单的把计算机连接起来并在上面传输比特流,它还是存在着很多问题的:
1)物理连接是有差错和不可靠的
2)物理设备之间可能存在传输速度不匹配问题
也就是说仅仅靠物理层是无法保证数据传输的正确性的。
⭐ 这样,数据链路层的主要作用就是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。在物理层提供服务的基础上,数据链路层还肩负着为网络层提供服务的责任,其最基本的服务是将来自网络层的 IP 数据报封装成帧,可靠的传输到相邻结点的目标网络层。
① 封装成帧
首先了解一下为什么需要封装成帧:前面说了,物理层它只是简单的把计算机连接起来并在上面传输比特流(0、1 序列),如果这些 0,1 组合的传送毫无规则的话,计算机是解读不了的。因此,我们需要制定一套规则来进行 0、1 的传送,让计算能够读懂这些序列。
⭐ 封装成帧就是:发送端的数据链路层接收到上层网络层传过来的 IP 数据报后,在其前后部分添加首部、尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
把一台计算的的数据通过物理层和链路层发送给另一台计算机,究竟是谁发给谁的,计算机与计算机之间如何区分,你总得给他们一个唯一的标识吧?
于是,MAC 地址出现了 👇
② MAC 地址
MAC 地址就是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
❓ 那么,一台计算机它是如何知道另一台计算机的 MAC 地址的呢?这是网络层的 ARP 地址解析协议做的事情,详见下文 👇
4. 网络层
在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。
在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称数据报。
① IP 协议
IP 协议用于屏蔽下层物理网络的差异,为上层提供统一的 IP 数据报。
IP 协议定义的地址,我们称之为 IP 地址。IP 数据报中含有发/收方的 IP 地址。
IP 协议提供无连接的、不可靠的、尽力的数据报投递服务
1)无连接的投递服务
2)不可靠的投递服务
3)尽力投递服务
② ARP 地址解析协议
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 协议做的事情,在应用层我们会详细讲解。
5. 传输层
通过物理层、数据链路层以及网络层的互相作用,我们已经把数据成功从计算机 A 传送到计算机 B 了,可是,计算机 B 里面有各种各样的应用程序,计算机 B 该如何知道这些数据是给哪个应用程序的呢?
所以,我们在从计算机 A 传数据给计算表 B 的时候,还得指定一个端口(Port),以供特定的应用程序来接受处理。即 IP 地址 + 端口号就可以唯一确定某个主机上的某个应用进程
⭐ 也就是说,网络层的功能是建立主机到主机的通信,而传输层的功能就是建立端口到端口的通信(也可以说是进程到进程之间的通信)
传输层最常见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
1)用户数据报协议 UDP(User Datagram Protocol)
2)传输控制协议 TCP(Transmission Control Protocol)
6. 应用层
应用层最接近于用于,它的任务就是通过应用进程间的交互来完成特定网络应用。
应用层协议定义的是应用进程间的通信和交互的规则。由于传输层传来的数据五花八门,有 html 格式的,有 mp4 格式等等,所以对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。
由于本文的关键就是讲解计算机之间的通信,所以其他协议我们就不讲了,只讲解一下 DNS 协议是如何将域名转化为 IP 地址的。
DNS 域名解析协议
域名系统 Domain Name System 缩写 DNS,是因特网的一项核心服务,它作为可以将域名和 IP 地址相互映射的一个分布式数据库 (这里的分布式数据库是指,每个站点只保留它自己的那部分数据),能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 地址。
域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。
大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。
域名解析方式:
递归查询
迭代查询
基本原理:
1)首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表;
2)若没有命中,则继续搜索操作系统的 DNS 缓存;
3)若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是递归查询);
4)若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行迭代查询(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
4)本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
5)操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
6)至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
总结
🎉 计算机之间的通信过程至此完毕,当然,里面很多的细节并没有详细叙述,计算机网络的知识点比较杂乱,本篇只作为大家构建计算机网络知识体系的开篇之旅,后续会讲解更多细节部分。
😁 下方扫码关注公众号「飞天小牛肉」(专注于分享计算机基础、Java 基础和面试指南的相关原创技术好文,帮助读者快速掌握高频重点知识,有的放矢),与小牛肉一起成长、共同进步
🎉 并向大家强烈推荐我维护的 Gitee 仓库 「CS-Wiki」(Gitee 推荐项目,目前已 0.9k star。面向全栈,致力于构建完善的知识体系:数据结构、计算机网络、操作系统、算法、数据库、设计模式、Java 技术栈、机器学习、深度学习、强化学习等),相比公众号,该仓库拥有更健全的知识体系,欢迎前来 star,仓库地址 CS-Wiki(Gitee 推荐项目,0.9k star)
版权声明: 本文为 InfoQ 作者【飞天小牛肉】的原创文章。
原文链接:【http://xie.infoq.cn/article/071f4642321b349229a8cd844】。文章转载请联系作者。
评论 (1 条评论)