【达哥讲网络】第2集:不一样的报文封装和解封装原理剖析

上集我们介绍了计算机网络体系结构,在TCP/IP体系结构中分为了五层。其实之五层中最低的三层是用来标识接口的,物理层标识的是接口的物理特性、数据链路层标识的是接口的数据链路层地址,网络层标识的是接口的网络层地址。最上面两层是用来标识应用的,传输层标识的是应用报文传输时所用的通道类型(TCP通道还是UDP通道),应用层标识的是应用报文类型,即是何种网络服务对应的应用。

这里涉及到一个问题,那就是报文是直接发送和接收的吗?当然不是,否则报文就不知传送给哪台设备了,接收设备也无法辨别这报文是否是传给自己的。正如我们寄信件,必须要写明寄信人和收信人详细地址一样,否则信件无法寄出去。报文的传输也是要有详细的源端和目的端地址,接收端设备只有通过比对报文中的目的地址与自己的地址一致后才会接收。那这个地址又是如何给报文加上去,接收设备又是如何识别这些地址的呢?这就涉及到本课程所说的“封装”和“解封装”了。

所谓“封装”就是报文从设备接口发出时加装产生该报文的对应协议的协议头的过程,是在发送端进行的,“解封装”就是设备接口接收报文时去掉原报文中所加装的协议头的过程,是在接收端进行的,是封装的逆过程。在整个体系结构中,除了最低的物理层不会进行封装、解封装外,其它各层都需要对报文进行封装、解封装。

1. 封装原理

封装是在报文发送端设备进行的,报文发送时在体系结构中自高层向低层依次进行传送,每经过一层(除物理层外)都要在上层传送来的报文的最外面加装对应层所使用的协议的头部,这就是报文封装,也称“协议封装”。报文在各层经过封装后形成对应的报文单元,应用层的报文单元为“数据报”、传输层的报文单元为“数据段”、网络层为的报文单元为“数据包”,数据链路层的报文单元为“数据帧”,物理层的报文单元为“比特”。这样一来,当报文传输到最低的物理时,除了真正的数据部分外,还加装了多个协议头。

现假设有一用户主机通过以太网IP网络从应用层发出一个远程的Web服务器访问请求,则它在发送端的封装过程如下(参照下图流程):

 (1)首先Web访问请求报文要在应用层加装HTTP头部(因为Web访问使用的是HTTP协议),形成HTTP数据报,然后继续向下面的传输层传递。

(2)当从传输层继续向下面的网络层传递该HTTP数据报时,又要在该数据报的最外面(在HTTP头部前)加装TCP头部(因为HTTP采用的是TCP作为传输层协议),形成HTTP数据段,然后继续向下面的网络层传递。

(3)当从网络层继续向下面的数据链路层传送该HTTP数据段时,又要在该数据段的最外面(TCP头部前)加装IP头部,形成HTTP数据包,然后继续向下面的数据链路层传送。

(4)当从数据链路层继续向下面的物理层传递该HTTP数据包时,又要在该数据包的最外面(在IP头前)加装以太网协议的头部,形成HTTP数据帧,然后以比特流的方式一位位地向对端设备进行传输。

这样就完成了一个应用数据报文在源端的完整封装过程。

从以上封装流程可以看出,其实它与我们平时寄信时填邮寄地址是类似的。在填写邮寄地址时,写在地址最前面的是寄信人、收信人所在的最大地址,如某省或者某国,后面依次紧跟的是逐渐细化的小地址,如某市、区(县)、街道、小区、楼/房号。在发送端报文自高向低所经过的每一层(除物理层外)加装的这些协议头其实就是报文在各层中对应的“地址”,包括源地址和目的地址,源地址用于接收端获知发送者地址,以便进行应答,目的地址用于接收端识别报文是否是发给自己的。

在理解报文封装原理时,要注意以下几点:

  • 报文封装总是在发送端设备上进行,对报文所能封装的最高层次取决于发送接口支持的最高层次。

报文如果在传输过程中没有经过重封装,则仅发生在始发设备上,中间节点设备仅对报文进行转发,如数据帧在同一IP网段中传输时,通常整个数据帧都是不会发生任何变化的,包括里面封装的各层协议头。但如果报文经过重封装,则在要进行重封装的设备的发送接口需要对报文再次进行封装。如IP报文在另一个IP网段传输时会对数据链路层协议进行重封装。

另外,前面说了,数据链路层和网络层都是用来标识接口的,而且都有对应的地址标识。根据接口所支持的最高层次分为二层接口(最高支持数据链路层)和三层接口(最高支持网络层)。二层接口在对始发报文仅可进行数据链路层协议(如以太网协议)封装,三层接口可以最高支持网络层协议(如IP协议)封装,同时会进行数据链路层协议封装。

  • 在报文传送过程,不是报文中的每层协议头都会一直保持不变。

因为数据链路层中的地址只能用于在同一IP网段中寻址,所以当报文跨IP网段传输时,又要重装进行数据链路层封装,以当前接口的数据链路层地址作为源地址,到达下一个IP网段的网关接口的IP地址作为目的地址。通常情况下,报文中的IP地址、传输层端口、应用服务在整个报文传送过程中是不变的。但也不是绝对的,因为报文在网络传输过程中可能又要进行新的协议封装,如IPSec协议就可能对原始IP数据包进行封装,添加新的IP头部,其中的源IP地址和目的IP地址都会改变,还要添加AH或ESP头部等,这些具体可以参见笔者编写的华为ICT官方教材——《华为VPN学习指南》(第二版)。

  • 报文在同一层中不一定只封装一个协议头。

体系结构的每一层都包括许多协议,而这些协议又可能被划分到不同的子层,这样一来,报方经过该层时就可能要经过多次封装。同一层中的各子层同样按照封装的顺序进行封装,高子层发出的报文要经过低子层的协议封装,低子层的协议报文无需经过高子层的协议封装。

如在网络层中,ICMP、IGMP、OSPF等协议会于IP协议之上,所以这些协议始发的报文都要在网络层至少经过两次封装,一次是这些协议自身的封装,另一次是经过IP封装,加装IP头部。而同样位于网络层的ARP协议,因其位于IP协议子层之下,所以ARP报文无需经过IP封装,没有IP头部。

在数据链路层中的协议也分子层,如VLAN、QinQ协议位于以太网协议之上,所以VLAN、QinQ帧要经过以太网协议封装,加装以太网协议头。L2TP位于PPP协议之上,所以L2TP报文在数据链路层要经过两次封装(然后再经过UDP和IP封装),一次是L2TP自身协议封装,一次是PP协议封装。MPLS俗称2.5层协议,即位于网络层与报文链路层之间,在以太网中,MPLS报文也要经过太网协议封装,具体参见笔者编写的华为ICT官方教材——《华为MPLS技术学习指南》(第二版)。

 

2. 解封装原理

报文封装是发送端对报文添加对应层所使用的协议的协议头,继续向下层传送,发生在体系结构中的高4层(除最低的物理层外)。报文解封装是报文封装的逆过程,是在接收端进行的,当报文要继续向上层传送时,就要去掉报文中在本层中的协议头,使得上层协议头在报文的最外面。这样做的目的是,当报文继续向上层传送时,上层就可以根据最外层协议头获取本层地址信息,然后进行相应的转发。解封装发生可能在任何一个接收端接口上发生,但是仅发生支持三层或以上层次的设备上,因为解封装也仅从数据链路层开始,直到应用层。

接收端在通过传输介质接收到比特流后,要进行帧组装,把一个个比特流重新组装成一个个完整的帧,还发送端原始的数据帧。当帧中包括网络层协议头,且接口支持网络层协议时,会继续向网络层传送,这时要去掉数据链路层头部,使网络层协议头在最外面,也就还原为原始的数据包。当数据包中包括传输层协议头,且设备支持传输层协议时,这时又要去掉网络层协议头,使传输层协议头在最外面,也就是还原为原始的数据段。当数据段中包括应用层协议头,且设备支持应用层协议时,这时又要去掉传输层协议头,使应用层协议头在最外面,也就是还原为原始的数据报。在应用层再去掉应用层协议头,最终还原原始的应用数据。通常只有主机才同时支持传输层和应用层。

下面同样以源端发送一个Web请求为例介绍在目的端Web服务器上所进行的报文解封装为例进行介绍。它在目的端的解封装过程如下(参照下图流程)。

(1)当报文到达了Web服务器(通常是一台主机)上时,在物理层所接收的是报文的一个个比特流,然后进行数据链路层进行帧组装,这样就又还原出在发送端一样的HTTP数据帧,从帧头中的目的地址字段可以获知该帧是发给自己的,需要接收并进行处理。

因为帧的数据部分包括网络层的IP头部,且Web服务器的接口是三层接口,支持IP协议,所以需要继续向网络层传送。传送时把本数据链路层协议的头部去掉,还原为原始的HTTP数据包向网络层传送。

(2)网络层在收到HTTP数据包后,从IP头部的目的地址字段中获知该数据包是发给自己的,需要接收并进行处理。因为数据包的数据部分包括了TCP头,于是又去掉数据包中本层的网络层IP头,还原为原始的HTTP数据段向传输层传送。

(3)传输层收到HTTP数据段后,从TCP头部的目的端口字段可以获知正与自己开启的Web服务对应,需要继续上送到应用层。于是去掉HTTP数据段中本层的TCP头,还原为原始的HTTP数据报向应用层传送。

(4)当HTTP数据报到了应用层后,获取HTTP协议头部信息后,把真正的数据部分上层到对应的Web服务功能模块进行处理。

这样就完成了一个应用数据报文在目的端的完整解封装过程。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶乡浪子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值