[JAVAee]IP数据包的组包与分包

目录

数据包是什么?

数据包的结构

数据包/分组与分组交换

分包是什么?为什么需要分包呢?

组包是什么?

分包组包过程中和哪些 IP 报头字段有关联?


本篇文章主要围绕三个问题来展开:

  1. 为什么要分包?
  2. 分包组包过程中和哪些 IP 报头字段有关联
  3. 组包时如何保证数据的顺序和完整性?

数据包是什么?

数据包是TCP/IP协议上通信传输中的数据单位,简称为'包',也可以叫为'分组'.

数据包主要作用与第三层网络层中,起始地与目的地都是网络层.在第三层的分组传输中.

像我们平时上网,其实就是数据包的交换.当我们访问网站的时候,会向服务器发送一个包进行请求,服务器在接受到请求后并作出响应,如果服务器允许我们的访问则会返回相应的数据包给我们.网页上呈现出的内容就是这样传输过来被我们看到的.

数据包的结构

一个数据包主要分成两个部分,控制信息与负载.控制信息则是表头部分,装载着'五元组'之类的信息,表明了数据的来处与去处的信息.而负载则是本身要传输的数据本身.

数据包/分组与分组交换

通信双方以分组为单位、使用存储-转发机制实现数据交互的通信方式,被称为分组交换.

分组交换能够提升存储空间的利用.

而分组交换中的基本单位就是一个分组(数据包).

分包是什么?为什么需要分包呢?

每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit).

IP协议在传输数据包的时候,如果一个完整的数据长度大于MTU的时候,就会讲一个数据包分成若干份进行传输.这个过程就叫做分包/分片.被分出来的每一个数据包中的包头还会含有原数据包的五元组和其他报头信息,还会有一个偏移量.偏移量主要用来在传输过后数据包的组包过程中给数据排序使用.

分包除了可以让数据在一定规格内传输,还因为一个较大的数据包会占用较多的带宽,容易造成网络的拥塞.而分包可以在一定程度上减轻这种情况,提高传输效率.

组包是什么?

在数据包进行分包后,目标主机收到的就不是一个完整的数据包了,而是许多小的数据包.将这些被分包过后的数据包进行组装恢复成为原来完成的IP数据包的过程就成为组包

分包组包过程中和哪些 IP 报头字段有关联?

IP报头为:

[JAVAee]IP数据包的组包与分包_第1张图片

对于分包,通俗的话来说就是讲一支完整的队伍拆成固定人数的小组进行通过.

对于传输的小组中的人员,在经过时要检查小组中的人员是否与原来发出的人员一致,这时就要通过校验和来检验数据包在传输的过程中是否遭到了破坏.

在传输过程中,发送端发送的完整数据包肯定不止一个,每发送一个数据包,在报头处的标识符就会+1.对于分片/分包后的数据包,在目标主机中该怎么知道哪一些分片后的数据包该放在一堆呢?就通过标识符来辨别这个小组是哪一个大队伍的.

对于目标主机来说,不知道对方传来的数据包总的规格是多少,被分成了多少包.这时就可以通过标记位来辨别.对于被分片/分包后的数据包们,只有最后一位的数据包的标记位的最后一位为0,其余的数据包的标记位的最后一位都为1.1表示为,后面还有同一个队伍的数据包要到达.0则表示我是这一组的末尾咯,后面已经没有本组的数据包了.

既然传输过去的数据都是这些,那么对于原来数据最重要的就是这些分段数据的顺序了.只有每一小段的数据的顺序都对的上才能重新在目标主机中恢复成原来的模样.对应上了报头中的片偏移.

简单总结为:

  1. 校验和
  2. 标识符
  3. 标记位
  4. 片偏移

其实这也回答了 "组包时如何保证数据的顺序和完整性?"的问题.

你可能感兴趣的:(tcp/ip,网络,服务器)