TCP/IP协议簇和底层协议配合,保证了数据能够实现端到端的传输。数据传输过程是一个非常复杂的过程,例如数据在转发的过程中会进行一系列的封装和解封装。
所以网络工程师,深入地了解数据在各种不同设备上的转发过程,才能够对网络在进行正确地分析和检测。
数据包在相同网段内或者不同网段之间转发所依据的原理基本一致。
数据可以在同一网络内或者不同网络间传输,数据转发过程也分为本地转发和远程转发,但是两者的数据转发原理基本一致,都是遵循TCP/IP协议簇。
本示例中,主机A需要访问服务器A的Web服务,并且嘉定两者之间已经建立了TCP连接。
TCP封装
主机A会对待发送的应用数据首先执行加密和压缩等相关操作,之后进行传输层封装。Web应用是基于传输层的TCP协议传输数据的。主机A使用TCP进行报文封装时,必须填充源端口和目的端口字段,初始序列号和确认序列号字段,标识位,窗口字段以及校验和字段。此例中数据段的源端口号为主机A随机选择的1027号端口,目的端口号为服务器A的TCP知名端口80。
IP封装
主机A完成传输层封装后,一般会进行网络层数据封装,在使用IP进行封装的时候,需要明确IP报文的源和目的地址,如果IP报文的大小大于网络的最大传输单元(MTU),则该报文有可能在传输过程中被分片(分片是IP层)。
生存时间(TTL)字段用来减少网络环路造成的影响。ARG3系列路由器产生的数据包,默认TTL值为255.路由器转发一个数据包时,该值会被减1,如果路由器发现该值被减为0,会丢弃该数据包。这样,即使网络中存在环路,数据包也不会在网络上一直被转发。
协议字段标识了传输层所用的协议。本例子中,传输层使用的是TCP协议,所以该字的填充值为0x06
。
查找路由
主机A必须要拥有到达目的地的路由。
每个主机都会独立维护各自的路由表项。主机A在发送数据前需要先检查是否能够到达目的端,这个过程是通过查找路由来完成的。在此示例中,主机A拥有一条到达『任何网络』(在IP编址部分已经简要介绍过)的路由,它发往其他网络的数据都会通过IP地址为10.1.1.1
的接口转发到下一跳,即网关10.1.1.254
。
ARP
通过ARP缓存表找到下一跳的MAC地址。
如果表项中没有下一跳的MAC地址,主机A会发送ARP请求。
接下来,由于数据包要被封装成数据帧,所以主机A需要获取下一跳的MAC地址,也就是网关的MAC地址。主机首先会查询ARP缓存表。
本例中,主机A的ARP缓存表中存在网关MAC地址的表项。
如果没有查找到网关的MAC地址表项,主机A会通过发送ARP请求来获取网关的MAC地址。
以太网封帧
主机A在链路层封装数据帧的时候,会遵循IEEE 802.3或者Ethernet_II标砖,Ethernet_II帧头的类型字段填充为0x0800
,以表示网络层使用的是IP协议。源MAC地址为主机A的MAC地址,目的MAC地址为网关路由器E0/0接口的MAC地址。
数据帧转发过程
主机工作在半双工状态下,所以会使用CSMA/CD来检测链路是否空闲。
前导码(Preamble)用于使接收者进入同步状态,定界符(SFD)用于指示帧的开始。
前导码是包括了7个字节的二进制1
,0
交替的代码,即1010...10
共56位。帧首定界符是长度为1个字节的1010...
二进制序列,它的作用是使接受端对帧的第一位进行定位。
同一个冲突域里的设备都会接受到主机A发送的数据帧。
只有网关(RTA)会处理该数据帧,并基于转发。
本例中,主机A发送数据帧到共享以太网,此网络中的所有设备都会受到该帧。设备收到帧之后,首先会进行FCS校验。如果FCS校验未能通过,则帧被立即丢弃。对于通过了FCS校验的帧,设备会检查帧中的目的MAC地址。如果帧中的目的MAC地址与自己的MAC地址不同,设备将丢弃帧,如果相同,则会继续处理。处理过程中,帧头帧尾会被剥去(就是解封装),生效的数据报文会被根据帧头中的类型字段的值来送到网络层中的对应协议模块去处理。
数据包转发过程
网关检查是否具有到达目的网络的路由条目。
如果存在转发路径,则为数据包添加一个新的二层帧头和帧尾,并继续转发。
RT-A收到此数据报文后,网络层会对该报文进行处理。RT-A首先根据IP头部信息中的校验和字段,检查IP数据报文头部的完整性,然后根据目的IP地址查看路由表,确定是否能够将数据包转发到目的端。RT-A还必须对TTL的值进行处理。另外,报文大小不能超过MTU值。如果报文大小超过MTU值,则报文将被分片。
网络层处理完成后,报文将被送到数据链路层重新进行封装,称为一个新的数据帧,该帧的头部会封装新的源MAC地址和目的MAC地址。如果当前网络设备不知道下一跳的MAC地址,将会使用ARP来获得。