IP 数据报首部分析

来来来, 爷们. 不是一直说纸上得来终觉浅么. 今咱就抓个数据报具体看一看真实网络中的 IP 报首部.

操作方法很简单, 使用wireshark进行抓包. 抓包后随便找个包看一下就行, 毕竟所有通信的包都需要经过网络层.(同时, wireshark会对协议的相关信息给出标识, 更方便我们查看)

image-20201025151613589

其中数据链路层的首部信息在整个数据的最前面, 其后跟着的是网络层, 传输层, 最后剩下的是传输的数据内容. 这个很好理解, 数据从上到下, 每过一层, 都会添加对应的头部信息, 先过传输层就先加上咯.

咱们今儿个主要就看看 IP 协议的首部内容. 走着…

image-20201025151644505

要查看指定字段在其中的位置, 左键点击一下, 数据内容就会高亮了. 好贴心哦.

简单介绍一下各个字段的意思:

  • 协议版本号(4b): 标识当前 IP 协议的版本号.
  • 首部长度(4b): 标识首部长度. 单位是/4B. 也就是首部最长15*4=60B
  • 区分服务(8b):
  • 总长度(16b): 首部+数据的长度. 因为 TCP 的首部是在传输层加上的, 所以传输层的首部也会被认为是数据的一部分. IP 层可传输的数据长度为 65535-60=65475B. 不过一般碍于各设备 MTU 的不同, 都会被分段传输​
  • 标识(16b): 当数据包被分组时, 用于标识不同的分组. 方便接收方对数据包进行重组
  • 标志(3b): 用于一些特殊标志
  • 片偏移量(13b): 当数据包超出长度后, 会分组传输. 此字段标识数据的偏移量. 单位是/8B
  • 生存时间(8b): 数据包在网络中的寿命, 经过 n 跳之后就不再转发了
  • 协议(8b): 标识当前包的数据部分协议
  • 校验和(8b): 用于校验在网络传输中是否失真. 仅校验首部
  • 源地址(32b): 数据包的源IP地址
  • 目标地址(32b): 数据包的目标 IP 地址
  • 可选内容: 一些其他的可选字段

对于网络层协议来说, 每增加一个字段, 都会影响整体的传输速度. 所以当初设计协议的时候, 定是经过了一再斟酌, 最终才保留了这些不可获取的字段.

协议版本号

标识当前协议的版本, 目前主要用来区分 IPV4和 IPV6.

若此字段缺失, 则无法区分不同版本 IP 协议

首部长度

因为协议的首部存在可选字段, 所以需要添加字段用来指明首部的长度. 以4B 为一个单位应该也是经过多次探讨的了. 当首部为20b 时, 则没有使用可选字段.

若此字段缺失, 无法正确识别协议首部结尾.

区分服务

标识此数据包在传输过程中的一些要求服务.

  • 1-3位: 标识数据包重要性. 在网络分组传输种, 较为重要的包会优先传输. 如一个语音通话的数据包, 和一个文件下载的数据包, 明显前者更为优先.
  • 4位: 0(正常延迟), 1(想要较低的延迟)
  • 5位: 1(想要高流量)
  • 6位: 1(要高可靠性)
  • 7位: 也是拥塞控制相关的.
  • 8位: 1(网络拥塞预警)

总长度

用于对识别当前数据报的结尾.

标识

因为数据在网络层会被分片, 所以增加标识分片所在分组.

若此字段缺失, 则无法对数据包进行正确重组.

标志

  • 第一位: 保留
  • 第二位: 0(可以分段), 1(不能分段)
  • 第三位: 0(当前是最后一个分段), 1(后面还有更多的分段)

偏移量

当接收方接收到多个数据分段时, 进行重组的依据. 该字段占13b, 单位是8B. 也就是说 IP 协议传输数据超过: (2^14-1)*8=131064B≈123kb. 不过一个网络层的包也不会这么大.

而网络层对数据包进行分段是依据 MTU 计算的. MTU 则是其自动协商, 取链路最小值.

若此字段缺失, 则接收方无法对数据包进行正确重组.

生存时间

就是你在使用ping命令时, 显示的ttl. 此值每经过一次转发, 就会减一. 当减到0的时候, 该数据包就被丢弃了.

若此字段缺失, 当出现在网络中不存在的目标, 导致数据包在网络中循环传输时永远都不会消失. 而这样的数据一多, 则整个网络都会变得拥堵.

协议

标明数据部分的协议, 用于正确识别数据包上层协议, 并将数据正确转交给指定进程.

搜一下: IP 协议号, 随便打开一个可以看到所有的协议.

若此字段缺失, 则网络层无法将数据正确上交.

校验和

接收方校验在物理传输过程中, 协议首部是否存在损坏. 数据部分不做检查.

若此字段缺失, 则接收方无法缺失接收的数据与发送的数据是否一致.

源地址

用于标识数据包的源地址.

目标地址

用于标识数据包的目标地址.

可选内容

方便后面对协议的扩充. 现在已有的如:

  • 记录路径: 每个路由器都记下其IP 地址
  • 记录时间戳: 每个路由都记下其IP 与时间
  • 等等

感觉可选内容在使用中很少用到, 我抓了各种包, 暂时还没有碰到过有使用的.


协议在设计的时候真的是省吃俭用啊, 平常开发时用到的数据都是以字节为单位的, 人家网络层协议是以位为单位使用的.

后面再看TCP首部的时候, 也可以如此查看其在传输过程种的真正模样.

爷们, 希望你看到这里了…

订阅评论
提醒