IP头部报文:

IP报文头解析 Java_tcp/ip

第一行:

  1. version — 版本:占4比特; IP协议的版本,目前的IP协议版本号为4;
  2. Header length — 头部长度:占4比特; 固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
  3. DS Field — 服务分区:占8比特; 其中的前3位表示报文的优先级,后面的几位分别表示要求更低时延、更高的吞吐量、更高的可靠性、更低的路由代价等。
  4. Total Length — 总长度:占16比特; IP报文的总长度。报头的长度和数据部分的长度之和。注意这里的单位为字节,而不是4字节,所以一个IP报文的的最大长度为65535个字节。

第二行:

  1. Identification — 标识:占16比特; 通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
  2. Flags — 标志:占3比特; IR、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“后续还需要分片”,为0表示这是最后一片。
  3. Fragment Offset — 片偏移:占13比特; 指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量

第三行:

  1. Time to Live — 生存时间:占8比特; 简称TTL,该字段表明当前报文还能生存多久。每经过1ms或者一个网关,TTL的值自动减1,当生存时间为0时,报文将被认为目的主机不可到达而丢弃。
  2. Protocol — 协议:占8比特; 指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
  3. Header Checksum — 首部校验和:占16比特; 用于检验IP报文头部在传播的过程中是否出错,检查IP报头的完整性。

第四行:
Source IP Address:源IP地址

第五行:
Destination IP Address:目标IP地址

IP的分片:

  • 概述:把大的报文剪裁切割成无数个小的报文;
  • 为什么要分片:在网络中传输数据的时候,对每个报文长度是有要求的,最多只能传一个MTU—最大传输单元;
  • MTU:最大传输单元:
  • 根据链路类型来决定的
  • 一个报文中所能包含的最大数据量
  • 经过了网络层,传输层,数据链路层的数据进行封装后的值
  • 以太网类型的MTU值是1500

在IPv4的头部信息中有3个字段专门为IP分片服务的:

IP报文头解析 Java_计算机网络_02

  • 标识(占16位):
    用于目的主机将数据报的各个分片重装成原来的数据包。当数据报分片时,第一个是随机数,后面分一次就加一;这样,目的主机就可以正确的将标识字段值相同的各数据报分片重装成原来的数据包。
  • 标志(占3位):
    该字段目前只有后两位有意义。
  • 第一位:
  • 没有任何意义。
  • 第二位:DF(More Fragment)
  • 代表这个报文是否被分片了 ;0 代表已经被分片,1代表还未被分片。
  • 第三位:MF(Don’t Fragment)
  • MF代表是否为最后一片报文;0 代表是最后一片报文,1代表还有下一片报文要分。
  • 片偏移(占13位):
    片偏移以8字节为单位; 如果在分片的时候不小心丢失,就可以根据片偏移来查找后重发。
  • 实例:

有一数据报总长度4820,字节,首部20字节,数据4800字节。某一网络能传送的数据报的最大长度是1420字节(注意不一定是以最大传输单元1500字节分片的!),该如何分片?

IP报文头解析 Java_计算机网络_03