数据转发过程概述
前言:
只有深入理解数据在各个不同设备的转发过程,才能够对网络进行正确的分析检测。
学习目标:
掌握数据封装和解封装过程
处理数据转发过程中的基本故障
数据在同一网络和不同网络传输,转发过程分为本地转发和远程转发。两者数据转发原理基本一样的,遵循TCP/IP协议簇。
下面以主机A为例,访问服务器A的web服务,且已建立TCP连接
(一)传输层层面封装:
TCP封装
知名端口:(0-1023)
动态端口:(1024-65535)
当建立TCP连接后,开始对应用层数据进行封装。首先执行数据相关加密和压缩操作,然后进行传输层封装。Web应用基于传输层的TCP协议传输数据。
使用TCP进行报文封装,首先填充源端口,目的端口字段,初始序列号,确认序列号,标识位,窗口字段以及校验和字段。源端口号主机A随机选择1027端口,目的端口为服务器A的TCP知名端口80
(二)网络层层面封装
IP封装
IP头部详细介绍:
https://blog.youkuaiyun.com/GREYICES/article/details/98779953
主机A完成传输层封装,一般进行网络层数据封装,使用IP封装时,需明确IP报文源和目的地址,且IP报文大于网络最大传输单元(MTU),则该报文有可能在传输中被分片。
MTU详解:
https://blog.youkuaiyun.com/Wengzhengcun/article/details/84287324
TTL字段用来减少网络环路造成的影响。协议字段Protocol标识传输层使用协议,如使用TCP,则为0X06。
查找路由
- 每个主机维护各自的路由表项,主机A发送数据前检查能否到达目的端,是通过查找路由来完成的。
- 本例中,主机A有一条到达“任何网络”的路由,它发往其他网络的数据都通过IP地址为10.1.1.1接口跳到网关10.1.1.254。
(三)数据链路层层面封装:
ARP
- 接下来,数据包要封装成帧,需要下一跳MAC地址,也就是网关MAC地址,主机首先查询ARP缓存表,本例中ARP缓存表存在网关MAC地址表项。
- 如果没有查到,会通过发送ARP请求获取网关MAC地址。
以太网封装
- 主机A封装数据帧时,遵循IEEE 802.3或Ethernet_II 标准,Ethernet_II帧头类型字段填充为
0X0800,表示IP协议。并填充上源和目的的MAC地址。
(四)数据转发过程:(数据链路层往返封装与解封装,网络层处理)
数据帧转发过程
主机工作在半双工状态,用CSMA/CD来检测链路是否空闲。如果空闲,主机A还会将一个前导码(Preamble)和一个帧首定界符(SFD)附加帧头上。
前导码作用是使接受设备进行同步并做好接受数据帧的准备,包括7个字节的1,0交替代码,即101010…10共56位。
帧首定界符是长度为1个字节的10101011二进制序列,是使接收端对帧第一位定位。
本例中,数据帧发送到共享以太网。此网络所有设备都会收到。
- 收到帧后,首先进行FCS校验,未通过直接丢弃,然后再看MAC地址。
- 如果目的MAC地址与自己不同,丢弃。相同继续处理,处理过程中帧头帧尾会被剥去(解封装),剩下数据报文根据帧头类型字段值送到网络层对应协议模块处理。
数据包转发过程
RTA收到数据报文后,网络层进行处理,首先根据IP头部检验和字段检查IP头部完整性。
根据目的IP查看路由表,确定是否能够将数据包转发到目的端。
RTA还会对TTL值进行处理
报文不能超过MTU值,否则将会被分片。
网络层处理完成后,报文将送到数据链路层重新进行封装,成为一个新的数据帧,该帧头部封装新的源MAC地址和目的MAC地址。如果不知道下一跳MAC地址,将使用ARP来获得。
(五)数据链路层的解封装:
数据帧的解封装
RTB继续以服务器A的MAC地址作为目的MAC继续转发。在一个网络中,两台服务器都会受到数据帧,只有服务器A的数据帧发现目的MAC地址为自己的MAC地址,会继续处理该数据帧。
服务器收到该帧,通过FCS校验,根据帧中类型字段判别上层协议即网络层协议,解封装后交给网络层IP协议进行处理。
(六)网络层的解封装:
数据包解封装
首先会通过检验和字段验证报文头的完整性。
服务器A检查数据包目的IP地址,发现与自己IP相同。
如果数据传输中发生分片,在目的端会重新组合,标识字段标识属于同一数据源的分片报文,偏移量是该分片在原分片组的相对位置。
标志字段只有两位有意义,最低位为1,表示后面还有分片,为0表示已经是最后一个数据片,中间一位为1表示不能分片,为0表示允许分片。所有分片被目的端全部接受后才进行重新组合。
协议字段表示上层是哪种协议(下一个报头并非一定是传输层协议,也可能是网络层的ICMP报文,也是用IP协议进行封装,协议字段0x01)
(七)传输层的解封装:
数据段解封装
- IP报文头被剥离后,发送到传输层进行处理,此例中使用TCP,且已经通过三次握手进行链接,TCP查看目的端口号为80,用于表示处理该数据的应用层协议为HTTO协议,TCP处理完头部信息后将此数据段头部剥离,将剩余的应用程序数据发送给HTTP协议进行处理。
总结
数据在进行二层和三层封装之前,主机需要了解哪些信息
主机在封装数据包之前,必须要知道目的端IP地址。在封装数据帧之前,必须要知道去往目的网络的路由以及下一跳的MAC地址。
当数据帧发送到非目的主机时,非目的主机将如何处理
如果主机接收到一个不是发往自己的数据帧,在检验帧头中的目的MAC地址之后会丢弃该帧。
传输层如何能够准确的将数据交给特定应用
传输层会检查TCP或UDP报文头中的目的端口号,以此来识别特定应用。
当两台主机同时访问服务器HTTP服务,该服务器如何区分数据属于哪个会话
服务器可以只通过源IP地址识别两台主机的HTTP流量,另外TCP报文头中包含的源端口也可以被用来区分同一台主机通过不同的浏览器发起的不同的会话。例如,两个来自源IP为10.1.1.1的HTTP流量使用的目的端口号都是80,但源端口号为1028和1035。
- IP报文头被剥离后,发送到传输层进行处理,此例中使用TCP,且已经通过三次握手进行链接,TCP查看目的端口号为80,用于表示处理该数据的应用层协议为HTTO协议,TCP处理完头部信息后将此数据段头部剥离,将剩余的应用程序数据发送给HTTP协议进行处理。