1 网际协议 IP 简介

IP 协议提供不可靠的、无连接的数据包传输

不可靠指的是从客户端发到目标端的数据包对方可能会收不到

无连接指的是发送的每个数据包都是独立的没有状态的,所以出现后发送的数据包比先发送的数据包到达目标端也是正常的

2 IP 数据包首部

IP 数据包首部

IP 数据包中的数据以大端模式在网络中传输,比如前四个字节 0~31,先传 0~7,然后是 8~15,以这个顺序传完 31 位。

2.1 版本 4 位

目前常用的 IP 数据包的版本是 4 和 6,也称为 IPv4 和 IPv6。

2.2 首部长度 4 位

下图中黄色区域便是首部长度表示的长度

首部长度 4 位

IP 数据包中的首部的单位是 4 字节,所以当首部长度为 1 时,其实表示的是 4 个字节。由于其只有 4 位,所以最大是 0b1111,也就是 15,这意味着 IP 首部的最大长度为 60 个字节,其中 20 个字节是固定的,剩余的为可选项。

根据上图可以看到,在没有选项的情况下,IP 首部的长度就是固定的 20 个字节

下图为一个 ping 包的数据,其中首部长度为 5,5 * 4 也就是 20 个字节,蓝色框住的部分就是 IP 首部,长度刚好为 20 个字节

IP 数据包首部

2.3 8 位服务类型 TOS

似乎应用层的协议可以设置这个,使用方式暂不明确。

2.4 总长度(字节数)16 位

总长度

总长度的单位为字节,表示的含义为首部长度加上数据包的长度,也就是下面黄色区域的部分的长度。

总长度

下图是抓的一个 ping 的数据包,可以看到 IP 包中写的 length 是 84,图中黑框框住的整个就是 IP 数据包,一行是 16 个字节,16 * 5 + 4 = 84 个字节。

ping 的数据包

2.5 16 位标识

2.6 3 位标志

IP 数据包首部

2.6.1 reserved bit

// todo 这个标识位暂时不知道起什么作用

2.6.2 don’t fragment

这个标识为如果位 1,则说明没有分片包了

2.6.3 more fragments

这个标识为如果不为 1,则说明后面还有分片包

2.7 片偏移 13 位

2.8 8 位生存时间(TTL)

TTL:Time to live

TTL 生存时间字段设置了数据报可以经过的最多的路由器。它指定了数据报的生存时间。TTL 的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减去 1,当该字段的值位 0 时,数据报就被丢弃,并发送 ICMP 报文通知源主机。

2.9 协议号 8 位

如下图中的 0x06 便表示的 TCP 协议:

TCP 协议

如下图中的 0x11 便表示的 UDP 协议:

UDP 协议

2.10 16 位首部校验和

2.10.1 发送方计算校验和

先将校验和全部置为 0,然后对首部中的每个 16 bit 进行二进制反码求和,将计算的结果填在原先的校验和的位置。

2.10.2 接收方计算校验和

接收方接收到数据包,由于数据包中已经放置了发送方放置的校验和,那么接收方在通过 16 bit 二进制反码求和运算过后,如果得到的结果不全为 1,则表示数据包在传输的过程中出现了错误,IP 层会丢弃收到的数据包,并且不产生差错报文。

2.11 IP 数据报的选项字段

选项字段一直都是以 32 bit 作为界限,也就是 4 字节,在必要的时候插入 0 填充字节,以保证 IP 首部始终是 32 bit 的整数倍。

参考资料

  1. TCP-IP 详解:第三章 网际协议
  2. 深入理解 TCP 协议:从原理到实战