一个 IP 数据报由首部和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
报头固定部分:
版本:占用4比特,当前IP的版本是IPv4,IP协议的下一个重要版本是IPv6。
头部长度:以4B为一个单位的报头的长度;占用4位, 报头20-60B。
服务类型:8位,用来获得更好的服务。只有在使用区分服务(DiffServ)时,这个字段才起作用。在一般的情况下都不使用这个字段。
总长度:占 16 位,指首部和数据之和的长度,单位为1B,因此数据报的最大长度为 65535 字节。实际上,总长度不能超过最大传送单元 MTU。
标识(identification):占16位,每产生一个数据报,通过一个计数器赋值给标识字段。但IP是无连接服务,不存在按序接收,该字段是为了处理分片报文段合并,当数据报长度超过MTU值时进行分片,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
标志(flags):占3位,但只有2位有意义。 🧠按字典序“先D后M”
片偏移:占13位。指出某片在原分组中的相对位置。也就是说,相对用户数据字段的起点(是数据字段首字节在原始分组的数据部分的相对位置),该片在整个数据报中的相对位置。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。
生存时间(TTL:Time-to-live):占8位,TTL最大值255 。表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。TTL最初存的是存活秒数,后来改为跳数限制(每转发一次跳数限制减1)。当TTL值减少到0就丢弃这个数据报,不再转发。可通过灵活修改TTL值来达到跟踪数据报传送路径(==tracert跟踪路由命令==)
协议:占8位。指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。它是网络层与传输层的粘合点,实现IP协议的多路复用和分解。(TCP的ID为6 UDP的ID为17 OSPF的ID为89)
首部检验和:占16位。这个字段==只检验数据报的首部==,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
源地址:占32位。
目的地址:占32位。(记住源地址和目的地址在报头的位置和相对顺序,先源IP后目的IP,不包括可变部分的话,是在报头末尾)
报头可变部分: