2层数据帧去掉14字节的帧头和4字节的帧尾(帧校验序列)后剩下的就是IP数据报

其中数据字段代表4、5层数据,本文只讨论3层数据报头部。

版本

占4bit,一般有2个值,0b0100代表ipv4,0b0110代表ipv6

首部长度

占4bit,此字段标识了IP数据报头部的总长度,最短为20字节,最长包括可选项40字节,一共60字节。

此字段的1代表4字节,也就是最长为0b1111。15 * 4 = 60字节

优先级与服务类型

服务类型(TO S)(8 bit)字段包括一个3 bit的优先权子字段(取值可以从000-111所有值),4 bit的TO S子字段和1 bit未用位但必须置0。4 bit的TO S分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。

此字段一般运用在运营商的路由器上。


数据报分片

现在的防火墙为了应对DDOS攻击,一般都设置了标志位0b010过滤,也就是不在3层进行分片而在5层分片。

总长度

总长度是指IP数据报数据部分的总长度,不包含头部。

此处假设数据报头部为20字节,也就是没有启用可选项。

一个数据帧最长为1518字节,去掉帧头和帧尾后剩1500字节(MTU),总长度字段占16bit,也就是数据报的数据部分最长为216-1=65535字节。但数据帧的数据部分最大只有1500字节,所以数据报会被分片传输。

被分片的数据是数据字段的所有数据,其中包括4、5层头部,一律视为数据,4层的端口号在到达目的地之前没有任何意义,IP数据报头部不会被分片,每个片段都必须有一个IP头部。

也就是说一个数据报片段包含20字节的头部,和1480字节的数据。

标识符

占16bit,源地址随机生成的,一个数据报的所有分片具有相同的标识,目标主机收到数据报后通过它最数据报进行重组。

标志位

占3个bit,第一个bit位始终置为0(保留)

第二个bit位为DF(Don’t Fragment),意思是不能分片的数据报,当且仅当DF=0时才允许分片

第三个bit位为MF(More Fragment),如果还有后续的数据报片段,则置为1,如为0则表示为最后一个片段。

如果标志位为0b010,那么标识符和段偏移量也就不需要了,全部置为0。因为不需要分片也不需要重组,这就是一个完整的数据报

段偏移量

占13bit,用来表示数据报片段的偏移量,当且仅当数据报头部为20字节时,它的值永远是0或1480的倍数。


TTL

Time To Live,占8bit,每经过一个路由器就减去1,防止数据报在网络上无限循环,一般unix系统的TTL为100以下,微软系列为100以上,通过tracert命令可以追踪路由器,大致判断出目标主机的操作系统类型。

协议号

占8bit,这个字段和2层帧头中的类型有区别,2层帧头中的类型是识别3层的IP或ARP协议,而协议号字段除了识别4层协议还识别3层的ICMP协议。

取值(十进制):

  • 1 ICMP

  • 6 TCP

  • 17 UDP

首部校验和

在2层已经校验过数据帧的完整性,此处校验IP数据报首部是为了防止被篡改。