【Linux网络编程】IP协议格式,解包步骤
目录
解析步骤
1.版本字段(大小:4比特位)
2.首部长度(大小:4比特位)(单位:4字节)
🍜细节解释:
3.服务类型(大小:8比特位)
位TOS字段
4.数据报长度:总长度(大小:16比特)(单位:字节)
5. 16位标识(大小:16比特)
6. 3位标记(大小:3比特)
第1位
第2位(不分片标志位)(DF:don’t fragment)
第3位(更多分片标志位)(MF:more fragments)
7. 13位片偏移(大小:13比特)(单位:8字节)
8. 8位生存时间(TTL)
9. 8位协议
10. 16位首部校验和
11. 32位源IP,32位目的IP
12.数据区域
解析步骤
对于IP,每次先去看前二十个字节。也就是说这二十字节里面的东西是固定的,每个IP报头都是如此,不会改变。
前二十个字节就包含除了选项部分(如果存在)和数据区域。选项部分的大小,数据区域的大小是可以改变的。
然后选项的有无,数据区域的大小根据首部长度,数据报长度(总大小,单位字节)推算出来。
也就是下面的推算关系。
选项 | 首部长度 |
数据区域大小 | 数据报长度减去手部长度 |
1.版本字段(大小:4比特位)
IP的版本现在有IPv4还有IPv6。
所以这四位要么是4(二进制为:0100),要么是6(二进制为:0110)。
所以每个IP地址前面要么填0100(表示IPv4),要么填0110(表示IPv6)。
题外话:
虽然IPv6比IPv4要好,但是目前主要还是IPv4。
IPv6在我国发展的比较好,IPv4的主导是外国的,IPv4和操作系统有关,操作系统也是外国主导的。所以IPv4不可能迅速变更到IPv6。
2.首部长度(大小:4比特位)(单位:4字节)
首部长度主要是去看选项的,看有没有选项,如果有选项,选项的大小又是多少?
首部长度------》选项有无,选项大小
🍜细节解释:
首部长度是占四个比特位的,表示的范围是0~15。但是最起码报头都有20字节,那么这是怎么表示的呢?
原来首部长度的的单位是4字节。
所以现在能表示的范围就是0~15*4=60字节。所以最大就能表示60字节了。
60字节,减去固定的20字节,那么选项的最大就是占40字节。(二进制首部长度:1111)
最起码要20字节。(二进制首部长度:0101)
3.服务类型(大小:8比特位)
前3位是优先级字段,已经废用。
然后就是4位TOS字段+最后一位保留字段。最后的保留字段被设置为0.
位TOS字段
🍛第1位:最小延迟。
🍛第2位:最大吞吐量。
🍛第3位:最高可靠性。
🍛第4位:最低成本。
上面的最小延迟,最高可靠性,最低成本基本都能理解。那就解释一下最大吞吐量。
最大吞吐量是描述网络状态的。单位时间内传输的数据量。单位是比特/s,字节/s,或者每秒数据包数。
4.数据报长度:总长度(大小:16比特)(单位:字节)
这里的单位是字节,在报头长度那里的单位是4字节。
最大能表示65,535字节(16位无符号整数的最大值)。
然后减去报头的最大值(60字节),所以数据区域的最大值就是(65475字节)。
这个被设计就是来看数据区域有多大。因为会有很多个IP,有粘包问题。为了让每个IP都能被正确解包,就要看数据区域有多大。
5. 16位标识(大小:16比特)
IP协议允许数据报进行分片。
在数据链路层,IP可能会被分片。去适应链路的最大传输单位(MTU)。
然后在对方网络层的时候,要能合并,就要进行区分哪些时一起的,然后进行拼接。
6. 3位标记(大小:3比特)
第1位
目前还没有被使用,被设置为0。
第2位(不分片标志位)(DF:don’t fragment)
如果是1,就表示数据报不能进行分片。如果数据报超过了链路的最大传输单位(MTU),这时候就会给发送方反馈数据报过大的信息。
如果是0,就表示数据报能被分片。
第3位(更多分片标志位)(MF:more fragments)
如果是1,表示后面还有很多的分片。
如果是0,表示是这个数据报的最后一个分片。
7. 13位片偏移(大小:13比特)(单位:8字节)
当IP数据报进行分片以后,在对方IP进行合并的时候,就要知道这是该数据报的哪一个部分。应该拼接在哪里,从哪里开始拼接。
用偏移量也能达到这个目的。
13位偏移量的单位是8字节。所有每个都是8的整数倍。
8. 8位生存时间(TTL)
实现是一个计数器,当计数器值为0,就丢弃这个IP数据报。并向发送方回馈超时信息。
每次经过一个路由器,它的值就会减1。
这个设计避免了网络环回的问题。因为如果网络换回,数据报一直在路由器之间跳来跳去,一直没有结束,也到不了目标主机。就会影响网络。
WIndows系统一般设置为128.
Linux系统Unix一般设置为64.
9. 8位协议
它的作用就是来区分上层用的什么协议,TCP还是UDP还是ICMP。
TCP为6,UDP是17,ICMP(1)。
10. 16位首部校验和
这个是看IP数据报头在传输的过程中是否发送错误。
它是采用反码求和的方式。如果对方把接受的报头反码求和,看是不是等于这个数,如果对得上,就基本是对的。
它的具体计算方式是:
每个16位比特为一组,然后反码求和。
11. 32位源IP,32位目的IP
用来表示发生方的IP,和接受方的IP。
标识发送方和接收方。
这个也不难理解。有了源IP,目的IP,就能进行路径选择。
A类(
0.0.0.0
到127.255.255.255
):用于大型网络。B类(
128.0.0.0
到191.255.255.255
):用于中型网络。C类(
192.0.0.0
到223.255.255.255
):用于小型网络。D类(
224.0.0.0
到239.255.255.255
):用于多播。E类(
240.0.0.0
到255.255.255.255
):保留用于未来使用
12.数据区域
用来携带上层的数据。