IP首部

IP 网际协议(Internet Protocol, IP)

IP数据报首部的格式。

首部最小20个字节,最大60个字节。最小时就是只有固定部分(每个单位32bit,也就是4个字节,共5行,就是20个字节),一个单位指的是一行。
IP首部_第1张图片
wireshark抓包分析

版本
IP首部_第2张图片在数据传输时,发送方和接收方的IP版本是一致,如果不是,那么数据包就会被丢弃。

首部长度
IP首部_第3张图片服务类型

type of service (TOS) 服务类型
IP首部_第4张图片
总长度
IP首部_第5张图片Total Length:表示IP数据报文的总长度,也就是说这个IP数据报文的数据总共有多少个字节,其中包括了IP数据报文的首部和数据部分。总长度占16位(即16-31位),指的是首部部分和数据部分的长度,单位为字节,IP数据报文的最大长度为2的16次方 - 1,也就是65535字节,所以总长度不能超过最大传输单元MTU。

其中首部部分占用20 - 60字节,如果以首部占用60字节来算,那么在传输数据时,最大能传输65535 - 60 = 65475字节的数据(MSS)了。上图中我们抓的包的总长度为为40字节,首部长度为20字节,也就是说我们抓的这个数据报传递的实际数据为20字节大小。

另外,要注意MTU和MSS之间的一些小区别:MTU包括了数据报文的首部和数据部分,而MSS只包括数据部分。

标识
IP首部_第6张图片占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
同一个数据报的各个分片的标识是一样的
同一个数据报的各个分片的标识是一样的
同一个数据报的各个分片的标识是一样的

标志
IP首部_第7张图片标志(flags)占用3位(即16 - 18),这三位分别是:R,D,M三位,第一位是保留位,没有被使用,目前只有后两个比特有意义。

R:标志字段中的第一位是一个保留位,现在还没有使用,可能将来会用到这位

D:标志字段中间的一位是 DF (Don’t fragment),表示传输的数据不允许分片。一般DF = 1的话,表示数据一次性传输过去,不允许分片。

M:标志字段的最低位是 MF (More fragment)。代表数据是否分片,如果MF位值为1,表示后面还有数据,还没有传输完毕,相当于数据分片,分批次传输,如果MF = 0表示最后一个分片或者只有一个分片。

这三位同一时刻也是只能有一个位的值能设置为1
这三位同一时刻也是只能有一个位的值能设置为1
这三位同一时刻也是只能有一个位的值能设置为1

片偏移
IP首部_第8张图片片偏移(Fragment offset)占用13位:每次分片传输的数据之间的偏移距离,也就是某分片的数据在原数据中的相对位置,一般偏移以8字节为单位。比如:在网络层传输的ip数据报总长度最大不能超过65535字节,如果超过了,要么对ip数据报进行分片传输,否则将丢弃。

那么问题来了,为什么是以8字节为单位?
  它是由IP头部格式中的“总长度(16bit)”和“偏移(13bit)”两个字段所决定的。总长度定义了IP包的最大长度为2^16 =64KB,偏移说明了IP分片时它最多能表示2^13 个偏移单位,这样偏移单位就是总长度除以偏移量得出片偏移单位(即2^16 / 213=23,即为8字节了)。

通常,我们要发送一个非常大的数据,由于受网络传输的限制,一次性发不过去,就需要对数据进行分片传输,把数据发送到目的地后再把数据重新组装起来是根据偏移量来计算重组的。
IP首部_第9张图片因为偏移量是以8字节为偏移单位,对于分片1来说从0字节开始算,偏移量为0 / 8 = 0,对于分片2来说从1400字节开始算,偏移量为1400 / 8 = 175,对于分片3来说是从2800开始算,偏移量为2800 / 8 = 350。
片偏移为0表示这可能是第一个分片,也有可能是这个数据报文不支持分片
片偏移为0表示这可能是第一个分片,也有可能是这个数据报文不支持分片
片偏移为0表示这可能是第一个分片,也有可能是这个数据报文不支持分片
另外,这些数据包分片的ip首部大部分都是一样的,因为它们都属于同一数据报文,对于数据进行重组就需要参考片偏移和标识这两个重要的字段,需要注意的是,片偏移是根据某一数据片的开始位置来计算的。

生存时间
IP首部_第10张图片生存时间(Time To Live,简称TTL ),占用8个bit位,表示数据报在网络传输过程中的生存时间,目的是防止无法交付的数据包在网络中出现路由环路,最初是秒作为单位,但为了方便,现在都用“跳数”作为TTL的单位。也就是说数据报每经过一个路由器就是一跳,其TTL值就减 1。

而一般生存时间是有操作系统来设置的,有的是32、64、128、255。从上图可以看出数据经过64-54=10跳路由。
主机A给主机B发送一个数据报文时,该数据报文在网络中会有一个TTL生存时间字段,就是数据报文每经过一台路由器,TTL字段值就会减1,当路由器收到数据报文后TTL字段值减1后为0的话,那么该路由器就会把数据报丢弃并向主机A发回一个ICMP超时报文,这种机制有效的防止了路由环路,也就是解决了数据报在路由器之间一直转圈的问题。

协议
IP首部_第11张图片常用的协议和对应的协议字段值

1	ICMP
2	IGMP
4	IP
6	TCP
8	EGP
9	IGP
17 	UDP
41 	IPv6
50 	ESP
89	OSPE

首部校验和
IP首部_第12张图片首部检验和字段占用16个bit位,只检验数据报的首部部分,并不包括数据部分,因为数据报每经过一个路由器都要重新计算一下首部校验和(一些字段,如生存时间,标志,片偏移等都可能发生变化),这里不采用 CRC 检验码而采用简单的计算方法,校验数据报在传输过程中是否被篡改或数据报被破坏。

validation disabled表示wireshark软件把首部校验和这个功能关闭了。
  如果[Checksum Status: Good ]中是good则表示校验和是正确的,如果是bad表示是校验和是存在问题的,可能数据出现损坏或被篡改。

在IP中只检验数据报的首部部分,并不包括数据部分
在IP中只检验数据报的首部部分,并不包括数据部分
在IP中只检验数据报的首部部分,并不包括数据部分

源地址
IP首部_第13张图片
目的地址
IP首部_第14张图片可选字段
 IP 首部的可变部分就是一个选项字段,一般用于支持排错、测试以及安全等措施,内容很多。选项字段的长度可变,从 1 个比特到 32个比特不等,取决于所选择的项目,增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这也就增加了每一个路由器处理数据报的开销,而实际上这些选项很少被使用。

你可能感兴趣的:(随笔)