网络编程教程(二)IP协议详解

一、IP服务特点

1.无状态

        无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立的。这种服务的缺点是无法处理重复、乱序的IP数据包,而优点就是快速和高效。

2.无连接

        无连接是指IP通信双方都不长久地维持对方的任何信息。因此,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

3.不可靠

        不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力。

二、IPv4头部结构

1.IP头部

网络编程教程(二)IP协议详解

2.头部字段含义

字段 含义
版本号 IPv4的版本号是4,IPv6的版本号是6
头部长度 字段长度为4bit,最大值为15,所以头部长度最大为15*4=60byte
服务类型 最小费用、最大吞吐量、最延时和最高可靠性,目前这个字段不使用
总长度 整个IP数据包(头部+上层数据)长度,最大为2^16-1=65535字节
标识 唯一标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其
值就加1.该值在数据报分片时被复制到每个分片中,因此一个数据报的所有分片都具有
相同的标识值。
标志 3位标志,第一位保留,第二位标识禁止分片,第三位标识更多分片。
TTL 生存时间,是数据报到达目的地之前允许经过的路由器跳数。当TTL值减为0时,路由器
将丢弃数据报,并向源端发送一个ICMP差错报文,TTL值可以防止数据报陷入路由循环。
协议类型 用来区分上层协议,ICMP是1,TCP是6,UDP是17.    
头部校验和 由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏
源端IP地址 数据报的发送端
目的端IP地址 数据报的接收端
可选项 可变长的可选信息,最多包含40字节。IP选项包括如下:
记录路由:告诉数据报途径的所有路由器将自己的IP地址填入IP头部选项部分,从而实现跟踪数据报的传递路径
时间戳:告诉每个路由器都将数据包被转发的时间填入IP头部的选项部分,从而实现测量路由之间数据报传输时间
源路由:源路由分为松散源路由和严格源路由,松散源路由是指指定一个路由器IP地址列表,数据报发送过程中必须经过其中
                所有路由器;严格源路由是指给定一组路由器IP地址列表,数据报发送过程中必须且仅仅只能经过这些路由器。
       

三、IP分片

1.什么时候发生IP分片

        我们从上面的IP字段中可以看出IP数据报的最大长度为65535字节,而数据链路层的MTU为1500字节(以以太网为例),这个时候需要我们进行IP数据报进行分片,以便其可以在物理介质中传输。

2.分片发生的位置

        分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。

3.如何处理分片

        IP头部中有三个字段为IP的分片和重组提供足够的信息:数据报标识、标志和片偏移。一个IP数据报的每个分片都有自己的IP头部,它们具有相同的标识值,但具有不同的片偏移。并且除了最后一个分片外,其他分片都将设置为MF标志。此外,每个分片的IP头部的总长度字段将被设置为该分片的长度。
    

四、IP路由

1.IP模块处理流程

        当IP模块接收来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误以后解析其头部分析。如果IP数据报的头部设置了源站路由选项,则IP模块调用数据包转发子模块来处理该数据报。如果该IP数据报是发送给本机的,则直接将该数据报派发给相应的上层协议处理模块(分用)。如果不是发送给本机的,则根据路由表进行转发。、

2.路由机制

        IP数据报根据路由表来决定传送给哪一个路由器,选择过程如下:
        (1)查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,否则转(2).
        (2)查找路由表中和数据报的目标IP地址具有相同网络ID的网络IP地址。如果找到,就使用该路由项;没找到就转步骤(3).
        (3)选择默认路由项,这通常意味着数据报的下一跳路由是网关。

五、相关协议

1、BGP协议

          BGP是一种不同自治系统的路由器之间进行通信的外部网关协议。BGP与RIP和OSPF的不同之处在于BGP使用TCP作为其传输层协议。两个运行BGP的系统之间建立一条TCP连接,然后交换整个路由表。

2、OSPF协议        

        OSPF是另一个内部网关协议。与采用距离向量的RIP协议不同的是,OSPF是一个链路状态协议。距离向量的意思是RIP发送的报文包含一个距离向量。每个路由器根据它所接收到邻站的这些距离来更新自己的路由表。
        在一个链路状态协议中,路由器并不与其邻站交换距离信息。它采用的是每个路由器主动地测试与其邻站相连链路的状态,将这些信息发送给它的其他邻站,而邻站将这些信息在自制系统中传播出去。每个路由器接收这些链路状态信息,并建立起完整的路由表。