IP协议

时间:2024-04-14 16:19:35

IP地址

目前的IP版本有4和6。

目前最流行的就是IPv4,有十进制和二进制两种表示方法。分别是:

点分四组十进制。每一组范围是[0~255],如:255.255.255.255

二进制。如:11111111 11111111 11111111 11111111

 

IPV4被分为五大类:ABCDE

A类为:点分四组中的第一组地址范围为0~127的IP地址。已二进制来看就是“首位为0” 1.0.0.1~127.255.255.255

B类:128~191.二进制首位为10 172.16.0.0~191.255.255.255

C类:192~223.二进制首位为110 192.0.0.0~223.255.255.255

D类:224~239.二进制首位为1110 224.0.0.0~239.255.255.255

E类:240~255.二进制首位为1111 240.0.0.0~255.255.255.255

 

子网掩码

在ip地址传播的时候,可以根据二进制首位的格式判断其属于第几类网,也就爱能判断其网络号有多少位。

但ip地址本身并没有包含任何关于子网划分的信息,所以光凭ip地址无法知道“其是如何划分子网的”。

于是就出现了子网掩码,和ip地址配套着出现,用来说明“该ip地址的子网ID是那几位数”。

 

ip地址: 128.32.1.14 对应二进制:10000000 00100000 00000001 00001110

子网: 128.32.1.0

掩码地址: 255.255.255.0 对应二进制:11111111 11111111 11111111 00000000

子网标识符 128.32.1.0 对应二进制:10000000 00100000 00000001 00000000

 

前缀(CIDR)

因为现有IPV4地址已经耗尽,所以制定了一个前缀方案。

即:将ip地址的某些位固定住,剩余的为可设置为0和1的任意组合。(比如值固定住第一位,那么后面又能有好多种组合出来的ip)。

CIDR是没有分类只说的(也就是说带有前缀的ip地址,不属于ABCDE里面的任何一类)。

之前ABC的网络号被限制为8位、16位、24位

而CIDR的网络号由前缀来控制,如222.80.18.18/25,其中“/25”表示其前面地址中的前25位代表网络号,其余位数代表主机ID。

写法是在现有的点分四组后面加上"/前缀"

 

IP协议

IP报文格式如下:

IP协议

IP首部分为两个部分,固定部分和可变部分;固定部分20个字节

版本号:4个bit,用来标识IP版本号。这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6。目前使用的IP协议版本号是4。

首部长度:4个bit。标识包括选项在内的IP头部字段的长度。

服务类型:8个bit。服务类型字段被划分成两个子字段:3bit的优先级字段和4bit TOS字段,最后一位置为0。4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小花费。4bit中只能将其中一个bit位置1。如果4个bit均为0,则代表一般服务。

总长度:16个bit。接收者用IP数据报总长度减去IP报头长度就可以确定数据包数据有效负荷的大小。IP数据报最长可达65535字节。

标识:16个bit。唯一的标识主机发送的每一份数据报。接收方根据分片中的标识字段是否相同来判断这些分片是否是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加1。

标志:3个bit。用于标识数据报是否分片。第1位没有使用,第2位是不分段(DF)位。当DF位被设置为1时,表示路由器不能对数据包进行分段处理。如果数据包由于不能分段而未能被转发,那么路由器将丢弃该数据包并向源发送ICMP不可达。第3位是分段(MF)位。当路由器对数据包进行分段时,除了最后一个分段的MF位被设置为0外,其他的分段的MF位均设置为1,以便接收者直到收到MF位为0的分片为止。

片偏移:13个bit。在接收方进行数据报重组时用来标识分片的顺序。用于指明分段起始点相对于报头起始点的偏移量。由于分段到达时可能错序,所以位偏移字段可以使接收者按照正确的顺序重组数据包。当数据包的长度超过它所要去的那个数据链路的MTU时,路由器要将它分片。数据包中的数据将被分成小片,每一片被封装在独立的数据包中。接收端使用标识符,分段偏移以及标记域的MF位来进行重组。

生存时间:8个bit。TTL域防止丢失的数据包在无休止的传播。该域包含一个8位整数,此数由产生数据包的主机设定。TTL值设置了数据报可以经过的最多的路由器数。TTL的初始值由源主机设置(通常为32或64),每经过一个处理它的路由器,TTL值减1。如果一台路由器将TTL减至0,它将丢弃该数据包并发送一个ICMP超时消息给数据包的源地址。

协议:8个bit。用来标识是哪个协议向IP传送数据。ICMP为1,IGMP为2,TCP为6,UDP为17,GRE为47,ESP为50。

首部检验和:根据IP首部计算的校验和码。

源地址:IP报文发送端的IP地址

目的地址:IP报文接收端的IP地址

选项:是数据报中的一个可变长的可选信息。选项字段以32bit为界,不足时插入值为0的填充字节。保证IP首部始终是32bit的整数倍。

 

报文结构:

IP协议

 

 

分片

 

一个以太帧最大为1518字节 (14字节以太首部,20字节IP首部,UDP8/TCP20,因此IP包每次最大为1500==MTU。去掉协议头UDP有效数据1472字节,TCP为1460字节。还有最后的4字节CRC)

但是一个IP数据报则可能会有8192字节,超过以太帧的最大限制,那么这时就需要IP分片,分批进行传输。

发送方会在IP层将要发送的数据分成多个数据包分批发送,而接收方则将数据按照顺序再从新组织起来,等接收到一个完整的数据报之后,然后再提交给上一层传输层。

一个IP数据报的每个分片都具有自己的IP头部信息,它们都具有相同的标识值,但是具有不同的位偏移,且除了最后一个分片外,其他分片都将设置MF标志。此外,每个分片的IP头部的总长度字段将被设置为该分片的长度

 

TCP/UDP

一般来说TCP的IP报文不会进行分片,只有UDP才会进行IP分片。

MTU是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节。一个IP数据报在以太网中传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x2.5时)为576,那么如果不设置,则MSS的默认值就为536个字节。很多时候,MSS的值最好取512的倍数。TCP报文段的分段与重组是在运输层完成的。

到了这里有一个问题自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。

再来看UDP数据报,由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP(在网络层中)同样会出现IP分片情况。

总结:UDP不会分段,就由IP来分。TCP会分段,当然就不用IP来分了!

 

偏移量的计算

方法为:已经“装载”好的分片字节数/8(偏移量就是某片在原分组的相对位置,所以8个字节作为偏移单位。)

分片1偏移量为:0(0=0/8,因为该偏移量之前没有装载过任何分片,自然也就是0除以8了)

分片2偏移量为:175(175=1400/8,由于分片1已经装载好了1400字节,所以此分片的位置就在1400字节之后,也就用1400除以8了)

分片3偏移量为:350(350=2800/8,目前已经装好了两个分片也就是2800字节已经装载完了,那么分片3自然就跟在2800字节之后了,也就是用2800除以8)

 

IP报文重组

IP报文分片后进行重组,只能在目标主机进行重组。

IP报文分片重组时,采用了一组重组定时器,片重组的控制主要根据数据首部中的标识、标志、偏移字段进行重组。

分片重组策略如下:

(1)第一个分片的偏移值时0

(2)将第一个分片携带的数据长度除以8,结果就是第二个分片的偏移值

(3)将第一个和第二个分片携带数据的总长度除以8,结果就是第二个分片的偏移值

(4)继续以上过程。直到之后分片的MF标志位为0

 

IP报文校验

  1. IP报文校验和计算方式

(1)为了计算一份数据报的IP检验和,首先需要把检验和字段置为0

(2)对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成)

PS:路由器收到IP报文,然后转发之后,是需要对TTL(Time to Live)字段减一,那么这样的话IP报文校验和数值也需要进行相应改变

  1. IP报文不对数据校验原因

上层传输层是端到端的协议,进行端到端的校验比进行点到点的校验开销小。

  1. IP报文对IP首部校验原因

IP首部属于IP层协议的内容,上层协议无法处理。

IP首部的部分字段在点到点的传递过程中是不断变化的,只能在每个中间点重新形成校验数据,在相邻点完成校验。

 

参考:

https://www.cnblogs.com/red-code/p/7132023.html

https://blog.****.net/ever_peng/article/details/80054212