我们当今使用电子设备都离不开网络,通过网络我们可以聊天、玩游戏、看电影都操作。
网络的本质就是交换数据。
本文我们就来看下数据是如何在网络中传输的。
计算机网络模型
现在有两种计算机网络模型,分别为OSI七层模型和TCP/IP四层模型
OSI将计算机网络分为了7层,TCP/IP将计算机网络分为了4层
计算机网络书中为了更好的解释运行原理,将TCP/IP模型改变成了五层模型,将TCP/IP四层模型中的网络接口层分为了数据链路层和物理层。
本文也采用五层模型来解释数据在网络中的传输流程。 TCP/IP五层模型从上到下分为五层,下层为上层提供服务。 1、应用层 应用层是最顶层,直接为用户提供各种各样的传输功能,比如超文本传输协议HTTP用于网页浏览、电子邮件传输协议SMTP用于邮件传送等。 2、传输层 应用层的提供的传输功能多种多样,传输层会对应用层的数据进行包装,通过引入端口号来唯一标识一种传输功能,并且保证数据传输的流量控制、差错控制。 3、网络层 网络层又是对传输层的包装,网络层引入IP地址的逻辑地址信息,将数据在网络中传输。 4、数据链路层 5、物理层
传输流程详解
本文以一个数据包的传输为例,来说明传输流程。我们就以一个HTTP请求数据包为例子来说明。
发送数据的计算机叫做源计算机,接收数据的计算机叫做目标计算机。
应用层 首先一个HTTP数据包在应用层中大概包含以下信息,比如HTTP协议的版本号、各种字段属性值、最后是包含的要发送的实际数据。
传输层
传输层对应着有UDP和TCP两种协议,HTTP采用的是TCP协议,因为TCP能够提供差错控制。
每一种应用层协议都对应着一个端口号,接着应用层会将HTTP数据包委托给传输层来进一步包装。
TCP对HTTP报文的包装如下,
传输层会为将HTTP数据包包装上源端口号和目的端口号等信息。
目的端口号是为了在数据包到达目的计算机的时候让其了解需要将数据包交给什么应用层协议进行处理。
源端口号是为了让目标计算机想要返回数据的时候,知道给源计算机的哪个应用层协议发送数据。
端口号是最重要的信息,序号、确认序列号等信息是为了保证可靠传输的,后续的文章我们会专门分析TCP的可靠传输、流量控制等特性。
这里我们在额外说一下,HTTP报文的头部信息占用的字节大小是固定的,后面的具体数据占用的空间是不定的,会随着传输数据的多少而改变。
数据链路层规定的最大传输单元MTU不能超过1500字节,如果HTTP报文的大小超过了MSS = (MTU-N)(因为传输层、IP层会依次进行封装,也会占用空间 N 字节,HTTP报文的最大传输大小应该是MTU-N),
超过了怎么办呢?TCP会对HTTP报文进行拆解,将HTTP报文拆分成多个满足传输要求的报文并包装,这些报文之间是有先后顺序的,TCP对这些报文进行顺序编号,保证数据的正确读写。
网络层 传输层包装好信息后,会进入网络层。
网络层会为其加入源IP和目标IP等信息。 源IP 指的是源计算机的IP 目标IP 指的是目标计算机的IP
数据链路层 在数据链路层中会在数据包中加入发送方MAC地址和接收方MAC地址。 发送方MAC地址 就是源计算机的MAC地址。 接收方MAC地址 并不是目标计算机的MAC地址。而是数据包的下一跳的MAC地址。
重点:
重点:
重点:
接收方MAC地址怎么获取到呢?
首先源计算机中存在一个路由表,其主要包含以下信息:
1、目标网络地址 Destination 当前路由器可以直接或者间接到达的目标网络
2、Use Iface 目标网络地址对应的转发接口,从该接口将数据包转发出去
3、下一跳IP地址 GateWay 如果为空,说明目标网络地址和当前路由器或者计算机直接相连,通过对应的接口转发就到达了数据包对应的目标网络。
如果不为空,就代表数据包下一步转发到的路由器IP地址。每个路由器端口都对应着一个IP地址和MAC地址。也是通过对应的接口进行转发
4、子网掩码 Fenmask 目标网络地址对应的子网掩码,当目标IP地址和子网掩码&运算后,如果等于目标网络,就说明该目标地址与数据包对应的目标地址相等,可以从对应的接口转出
如果不存在对应的目标网络,就通过默认路由转发出去。默认路由的目标网络为0.0.0.0,子网掩码也为0.0.0.0。
ARP请求
我们需要查看路由表中是否存在对应的目标网络,获得其GateWay,然后查看ARP缓存表,ARP缓存表中存的是IP地址与MAC地址的对应记录。 如果ARP缓存表中存在对应的目标网络,就将其MAC地址填入到接收方MAC地址中,并通过对应的接口转发出去。
如果ARP缓存表中不存在对应的目标网络,源计算机就会发出ARP请求,ARP请求就是将自己的IP地址和希望得到的MAC地址的目标计算机的IP地址包装成数据包通过广播发出去,当目标计算机接收到这个数据包后会将源IP地址取出来,将自己的MAC地址包装成数据包发送回去。这样源计算机就能获得到对应的MAC地址了,并将其IP地址和MAC的地址加入到ARP缓存表中。
通过ARP缓存表或者ARP请求可以获得对应的MAC地址,将其填入到接收方MAC地址中,这样就将IP数据包包装完毕了,称之为帧 物理层 利用网卡将数据通过二进制流写入到网线或者光纤当设备中。
交换机 数据包首先会发送到交换机中,交换机工作在MAC层,是一个二层网络设备。
交换机中有一个MAC缓存表,会存储MAC地址和对应的转发端口号。
交换机在接收到数据包后,会取出接收方MAC地址,查看其是否存在缓存,如果存在缓存,就通过其对应的端口号将数据包发送出去。
如果不存在,就向所有端口号发出数据包。
交换机中的MAC地址是怎么缓存的呢? 当数据包通过端口进入交换机时,会将对应的发送方MAC地址和进入的端口号写入到缓存中。
路由器——路由转发
数据包出了交换机就算是出了家门了,开始进入路由器。
数据包通过端口进入路由器,执行以下步骤: 1、 路由器首先会检查数据包的接收方MAC地址是否等于路由器端口的MAC地址,如果等于就接收,如果不等于就抛弃。 2、 路由器去除头部的MAC包装,暴露出IP地址信息,取出目标IP地址,然后查看路由表。
取出路由表中的记录与目标IP地址挨个进行检验,检验过程如下:
将记录中的子网掩码与目标IP地址进行&运算,如果等于记录中的目标网络,说明存在当前路由器可以到达目标IP地址,就通过记录中对应的 端口转发出去。
在转发出去之前需要包装MAC地址信息等。 发送方MAC地址: 将路由器输出端口的MAC地址填入发送方MAC地址。 接收方MAC地址: 利用ARP缓存表或者是ARP请求获取下一跳地址的MAC地址, 下一跳地址就是对应着下一个经过的路由器端口IP地址,接收方MAC地址就对应着下一个经过的路由器的端口MAC地址。
3、 如果路由表中不存在对应的目标地址,那么就会通过默认路由发出去,默认路由的目标地址和子网掩码都是 0.0.0.0,MAC的包装和上述一样。
从路由转发的过程来看,源IP地址和目标IP地址一直不变,发送方MAC地址和接收方MAC地址一直在变。
到达目标计算机 就这样通过路由器的不断转发,数据包就到达了目标计算机。
目标计算机在收到数据包后会将数据包从下层往上层拆封。
1、 首先是数据链路层,目标计算机会将MAC包装信息去除,取出接收方MAC地址,查看是否和自己的MAC地址一致,如果不一致,就抛弃。
2、 接着是网络层,将IP包装信息去除,取出目标IP地址,查看是否与自己的IP地址一致,如果不一致,就抛弃。
3、 接着是运输层,会取出目标端口号,通过端口号获取对应的进程,将数据包交给对应的进程。比如HTTP数据包的目标端口号是80,就会交给HTTP进程,HTTP会调用其业务逻辑,将返回的数据包装成数据包通过源IP地址发送给源计算机。
总结
通过上述流程我们看出,数据包首先会在源计算机中从上到下挨个封装信息,然后通过IP地址和MAC地址在交换机和路由器中转发,最终来到目标计算机,目标计算机对数据包从下到上挨个拆封验证,最终通过端口号见数据包交付给对应的进程。
|