1.7 数据转发过程

TCP/IP 协议簇和底层协议配合,保证了数据能够实现端到端的传输。

1、数据转发过程概述

1.7 数据转发过程

数据可以在同一网络内或者不同网络间传输,数据转发过程也分为本地转发和远程转发,但两者的数据转发原理是基本一样的,都是遵循 TCP/IP 协议簇。

2、TCP 封装(传输层)

1.7 数据转发过程

当主机建立了到达目的地的 TCP 连接后,便开始对应用层数据进行封装。
上图中,主机 A 首先会对待发送的应用数据执行加密和压缩等相关操作,之后进行传输层封装。Web 应用是基于传输层的 TCP 协议传输数据的。主机 A 使用 TCP 进行报文封装时,必须填充源端口和目的端口字段,初始序列号和确认序列号字段、标识位、窗口字段以及校验和字段。此例中数据段和源端口号为主机 A 随机选择的 1027 号端口,目的端口号为服务器 A 的 TCP 知名端口 80。

3、IP 封装(网络层)

1.7 数据转发过程

主机 A 完成传输层封装后,一般会进行网络层数据封装,在使用 IP 进行封装时,需要明确 IP 报文的源地址和目的地址。如果 IP 报文的大小大于网络的最大传输单元(MTU),则该报文有可能在传输过程中被分片。
生存时间(TTL,Time To Live)字段用来减少网络环路造成的影响。某些路由器产生的数据包,默认 TTL 值为 255(128/64)。路由器转发一个数据包时,该值会被减 1,如果路由器发现该值被减为 0,就会丢弃该数据包。这样,即使网络中存在环路,数据包也不会在网络上一直被转发。
协议字段标识了传输层所使用的协议。本例中,传输层使用的是 TCP 协议,所以该字段填充值是 0x06。

4、查找路由

1.7 数据转发过程

上图中,主机 A 必须要拥有到达目的地的路由。
每个主机都会独自维护各自的路由表项。主机 A 在发送数据前,要先检查是否能够到达目的端,这个过程是通过查找路由来完成的。
此例中,主机 A 拥有一要到达“任何网络”的路由,它发往其它网络的数据都会通过 IP 地址为 10.1.1.1 的接口转发到下一跳,即网关 10.1.1.254。

5、ARP(OSI: 数据链路层 & TCP/IP: 网络层)

1.7 数据转发过程

接下来,由于数据包要被封装成数据帧,所以主机 A 需要获取下一跳的 MAC 地址,也就是网关的 MAC 地址。主机首先会查询 ARP 缓存表。本例中,主机 A 的 ARP 缓存表中存在网关 MAC 地址的表项。
如果没有查找到网关的 MAC 地址表项,主机 A 会通过发送 ARP 请求来获取网关的 MAC 地址。
概括:首先通过 ARP 缓存表找到下一跳的 MAC 地址,如果表项里没有下一跳的 MAC 地址,主机会发送 ARP 请求来获取。

6、以太网封装(数据链路层)

1.7 数据转发过程

主机 A 在链路层封装数据帧时,会遵循 IEEE802.3 或 Ethernet_II 标准,Ethernet_II 帧头中的类型字段填充为 0x0800,以表示网络层使用的是 IP 协议。源 MAC 地址为主机 A 的 MAC 地址,目的 MAC 地址为网关路由器 E0/0 接口的 MAC 地址。

7、数据帧转发过程

1.7 数据转发过程

主机工作在半双工状态下,所以会使用 CSMA/CD 来检测链路是否空闲。如果链路空闲,主机 A 会将一个前导码(Preamble)和一个帧首定界符(SFD)附加到帧头然后进行传输。前导码的作用是使接收设备进行同步并做好接收数据帧的准备。前导码是包括了 7 个字节的二进制“1”、“0”交替的代码,即 1010...10 共 56 位。帧首定界符是长度为 1 个字节的 10101011 二进制序列,它的作用是使接收端对帧的第一位进行定位。

1.7 数据转发过程

主机发送数据帧到共享以太网(同一冲突域),此网络中的所有网络设备都会收到该帧。设备收到帧后,首先会进行 FCS 校验。如果 FCS 校验未能通过,则帧被立即丢弃。对于通过了 FCS 校验的帧,设备会检查帧中的目的 MAC 地址。如果帧中的目的 MAC 地址与自己的 MAC 地址不同,设备将丢弃该帧;如果相同,则会继续处理。处理过程中,帧头帧尾会被剥去(即解封装),剩下的数据报文会根据帧头中的类型字段的值送到网络层中的对应协议模块处理。
只有网关(图中的RTA)会处理该数据帧,并继续转发。

8、数据包转发过程

1.7 数据转发过程

RTA 收到此数据报文后,网络层会对该报文进行处理。RTA 首先根据 IP 头部信息中的检验和字段,检查 IP 数据报头的完整性,然后根据目的 IP 地址查看路由表,确定是否能够将数据包转发到目的端。RTA 还必须对 TTL 的值进行处理。另外,报文大小不能超过 MTU 值。如果报文大小超过 MTU 值,则报文将被分片。
网络层处理完成后,报文将被送到数据链路层重新进行封装,成为一个新的数据帧,该帧的头部会封装新的源 MAC 地址和目的 MAC 地址。如果当前网络设备不知道下一跳的 MAC 地址,将会使用 ARP 来获得。
概括:
网络检查是否具有到达目的网络的路由条目。
如果存在转发路径,则为数据包添加一个新的二层帧头和帧尾,并继续转发。

9、数据帧解封装

1.7 数据转发过程

服务器 A 处于一个共享以太网中(同一冲突域),两台服务器都会收到 RTB 发送的数据帧。该帧的目的 MAC 地址与服务器 B 的接口 MAC 地址不匹配,所以会被服务器 B 丢弃。
服务器 A 成功收到该帧,并通过 FCS 检验。服务器 A 将利用帧中的类型字段来识别在网络层处理数据的协议。该示例中,服务器 A 会将解封装后的此数据交给网络层的 IP 协议来进行处理。

10、数据包解封装

1.7 数据转发过程

服务器 A 通过 IP 协议来处理该报文,首先会通过校验和字段来验证报文头的完整性,然后检查 IP 报文头中的目的 IP 地址是否与自己当前的 IP 地址匹配,如果匹配,服务器 A 剥掉数据包的 IP 头部后,送往上层协议 TCP 继续进行处理。
如果在源与目的之间的数据传输期间,数据发生了报文分片,则报文会被目的端重新组合。标识字段用于标识属于同一数据源的分片报文,偏移量表示该分片在原分组中的相对位置。标志字段目前只有两位有意义,标志字段最低位为 1,表示后面还有分片,为 0 表示这已经是最后一个数据片;中间一位为 1 表示不能分片,为 0 表示允许分片。所有的分片报文必须被目的端全部接收后才会进行重新组合。
协议字段表示此数据包携带的上层数据是哪种协议的数据。需要注意的是,下一个报头并非总是传输层报头。例如,ICMP 报文也是使用 IP 协议封装,协议字段值是 0x01。

11、数据段解封装

1.7 数据转发过程

当 IP 报文头被处理完并剥离后,数据段会被发送到传输层进行处理。此例中,传输层协议使用的是 TCP,且发送端和接收端已经通过三次握手建立了连接。传输层收到该数据段后,TCP 协议会查看并处理该数据段头部信息,其中目的端口号为 80,用于表示处理该数据的应用层协议为 HTTP 协议。TCP 处理完头部信息后会将数据段头部进行剥离,然后将剩下的应用数据发送到 HTTP 协议进行处理。

12、Q&A

Q:数据在进行二层和三层封装之前,主机需要了解哪些信息?
A:主机在封装数据包之前,必须要知道目的端的 IP 地址。在封装数据帧之前,必须要知道去往目的网络的路由和下一跳的 MAC 地址。

Q:当数据帧发送到非目的主机时,非目的主机将会如何处理?
A:如果主机收到一个不是发往自己的数据帧,在检验帧头中的目的 MAC 地址后会丢弃该帧。

Q:传输层如何能够准确地将数据交给特定应用?
A:传输层会检查 TCP 或 UDP 报文头部的目的端口号,以此来识别特定应用。

Q:当两台主机同时访问服务器的 HTTP 服务,该服务器如何区分数据属于哪个会话?
A:服务器可以只通过源 IP 地址识别两台主机的 HTTP 流量,另外 TCP 报文头中包含的源端口也可以被用来区分同一台主机通过不同的浏览器发起的不同会话。例如,两个来自源 IP 地址为 10.1.1.1 的 HTTP 流量使用的目的端口号都是 80,但源端口号分别是 1028 和 1035。

分享