Linux高性能服务器编程(二):ip协议详解

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

无状态:IP通信双方不同步传输数据状态信息,所有数据报的发送、传输和接收都是相互独立、没有上下文关系的。这就是IP协议一个缺点所在。但是无状态服务也有其优点,就是简单、高效。我们不需要为了维持一个通信状态而花费一些内核资源。在网络协议中,无状态是很常见的。

无连接:简单来说,就是不需要维持如tcp一样的通话连接。因此每次上层协议是发送数据的时候,都要指明ip地址。

不可靠:就是说数据报不一定能准确地发送到目的ip,只能尽它最大的努力,皮一下的话就什么都没得了。比如某个路由器发现某个数据报在网络上存活的时间太长,就会消灭掉,并且返回一个ICMP的超时错误。不管怎么样,发送端的IP协议只要发现发送失败就会返回失败信息,不会试图去重新传递(懒)

IPV4的头部结构

 4位版本号(vision):指定IP协议的版本,对于IPV4来说,就是4 。

4位头部(header length):决定IP头部有多少个32bit字(4字节),因为4位最大是15,所以IP头部最多是60字节。

TOS(type of service):包含一个3位的优先权字段(现在已经被忽略),一位保留字段(0),剩下四位分别表示:1.最小延时 2.最大吞吐量 3.最高可靠性 4.最小费用 ->最多只能有一位置位1,根据实际需要选择。

16位总长度: 指整个ip数据报的长度,最长为(2^16-1)字节。

16位标识(identification):标记数据报,初始值随机,每多一个就+1

8位协议(protocol):用来区分上层协议,例如ICMP是1,TCP是6。

16位检校和(header checknum):由发送端提供,接收端根据这个数值判断数据报是否有损坏。

8位生存时间(time to live):数据报到达目的地前允许经过的路由器跳数,每经过一个路由器,这个数-1.

13位片偏移(flagmentation offset):分片相对于原始ip的偏移。

3位标志字段:第一位保留,第二位是否设置分片,第三位是否更多分片。除了数据报最后一个分片,其它分片第三位都为1.

前面说了IP头部,我们发现有很多选项是关于IP分片的,那什么是分片呢?

当数据报长度超过帧的MTU时,就会发生分片行为。可能发生在发送端,也可能发生在中转路由器上。可能在传输过程中多次分片,只在最终目标机器的内核中重新组装。

16位标识、3位标志和13位片位移为数据报的分片提供了足够的信息。每个分片都具有头部且相同的标识,不同的是片位移。每个分片IP头部的总长度字段会被设置为该分片的长度。

例:

 因此这个ip变成了两个分片,第一个分片长度为1500,第二个分片长度为21 (头部长度为20)。

注:原始数据的ICMP头部被完整地复制到了第一个分片中,而第二个分片头部不包含ICMP内容。

IP路由

前面提到过,IP协议的一个重要作用就是寻找数据报的路由,即决定发送数据报到路由器的途径。

最好的开始时间是以前,其次是现在。
原文地址:https://www.cnblogs.com/dragonsbug/p/13618064.html