一:一个IP数据包包含的内容
版本字段:这个ip包里的IP地址是ipv4还是ipv6,0100表示IPv4,如果为0110表示IPv6
首部长度字段:表示IP首部的总长度,其中包括选项字段(如果有)。该字段的表示的长度单位为32bit(4 bytes),因此首部长度最大为15(1111)*32bit=60bytes。在没有选项时,该字段的值为5,表示普通的IP包头长度20bytes。
优先级与服务类型:8bit的服务器类型(TOS)字段,其中前3个bit表示优先权(现在已经忽略该字段),随后的4个bit表示服务类型,按顺序分别表
示为最小时延、最大吞吐量、最高可靠性、最小费用四种。这个4个bit中最多只能有1个bit置位,如果全是0则表示一般服务。最有1个bit为未用位,必须置0。
总长度:
6个bit的总长度字段表示整个IP数据包的长度,以字节为单位。所以IP数据报的最大长度为16个1=65535bytes。
此处的总长度字段与MTU是密切相关的,MTU表示IP数据报的最大传输单元的大小,我们知道一般默认的MTU值为1500,也就是说单个IP数据报的最大长度为1500bytes。常规的无选项的IP包头长度为20bytes,可以通过MTU计算出DATA数据字段的最大长度为1480bytes。不仅如此,MTU还与TCP协议报头中的MSS有关联,MSS表示TCP数据报的最大传输长度,常规的TCP报头长度为20bytes,又因为TCP报头是封装在IP包头上的,所以MSS一般为1460bytes=MTU1500-IP包头20-TCP报头20。(其中关于MSS字段的详细解释请参见《TCP协议文档》)。由于默认MTU为1500bytes,所以网卡发送的数据帧的大小为1518bytes,多了18bytes分别为:目的MAC(6bytes)、源MAC(6bytes)、type(2bytes)、CRC(4bytes)
分片:默认MTU为1500bytes,所以网卡发送的数据帧的大小为1518bytes,但是超过了1500bytes,即会切片
标识:
16bit的标识字段唯一的标识主机发送的每一份数据报,由主机生成具有唯一性。通常每发送一份报文该值加1。该值在数据包分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值,把该值相同的分片收集到一起重组。
标志:
3bit的标识字段每一位都有特定的含义,该字段主要用来分片和重组。第1个bit为保留位(Reserved Bit),一般置位0。第2个bit为不分片位(Don’t Fragment),该位在置1时表示不分片。第3个bit为更多片位(More Fragment),该位表示后面是否还有更多的分片,置位1时表示后面还有,所以除了最后一片报文,其他分片报文该位全部置。
段偏移量:
一个分片最长为1480,从0开始,如图
TTL(生成时间)
8bit的生成时间字段表示该IP数据包可以经过的路由器的最大数量。最大为256表示可以穿越256台路由,该字段采用减法的方式赋值,比如在开始时8个bit全部置位1,每经过一台路由器该字段的值减1。如果该字段的值减到了0还没有送达目的地,那么该IP数据包将被丢弃。最初设计这个字段是为了防止IP报文在网络中循环无限传输,占用带宽等问题。
协议(Protocol):
8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。
首部校验和(Header Checksum)
16bit的首部校验和字段用来使接收端检验收到的报文是否正确。该字段只对IP首部计算校验和不包含后面的数据字段。原因是IP的上层协议比如ICMP、IGMP、TCP、UDP协议的各自首部中均含有同时覆盖首部和数据的校验和。
选项(Option)
一般不使用该字段,该字段的值以32bit为单位,不足时以0补充。