IP协议

IP服务的特点

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

无状态:指IP通信双方不同步传输数据的状态信息,因此所有的IP数据报的发送、传输和接收都是相互独立、没有上下文关系。它的缺点就是无法处理乱序和重复的IP数据报。

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

不可靠:指IP协议不能保证IP数据报准确地到达接收端。发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而不会重传。

IPv4头部结构 

1-1. 4位版本号(version)指定IP协议的版本。对于IPv4来说,其值是4。

1-2. 4位头部长度(header length)标识该IP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。

1-3. 8位服务类型(Type Of Service,TOS)包括一个3位的优先权字段(现已被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,根据需要来设置。比如ssh和telnet这样的登录程序需要的是最小延时服务,而文件传输ftp则需要最大吞吐量的服务。

1-4. 16位总长度(total length)是指整个IP数据报的长度,以字节位单位,因此IP数据报最大长度为65535字节。但由于MTU 的限制,长度超过MTU的数据报都将被分片传输。接下来的3个字段描述了如何实现分片。

2-1. 16位标识(identification)唯一地标识主机发送的每一个数据报。其初始值由系统随机生成:每发送一个数据报,其值就加1。数据报分片时被复制到每个分片中,同一个数据报的所有分片都具有相同的标识值。

2-2. 3位标志字段的第一位保留。第二位(DF)表示“禁止分片”,如果设置了就表示IP模块不对数据报进行分片。第三位(MF)表示“更多分片”,除了数据报最后一个分片外,其他分片都要置1.

2-3. 13位分片偏移(fragmentation offset)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。每个IP分片的数据部分必须是8的整数倍(保证IP分片拥有合适的偏移值)

3-1. 8位生存时间(Time to Live,TTL)是数据报到达目的地之前允许经过的路由器跳数(常见的值是64)。每经过一个路由,该值就被减1。当TTL值减为0时,路由器将丢弃数据报,向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环。

3-2. 8位协议(protocol)用来区分上层协议。/etc/protocols文件中定义了上层协议对应的protocol字段的值。ICMP是1,TCP是6,UDP是17。

3-3. 16位头部校验和(header checksum)由发送端填充,接收端使用CRC算法以检验IP数据报头部在传输过程中是否损坏。

4-1(5-1). 32位源端IP地址和目的IP地址用来标识数据报的发送端和接收端。

6-1. 选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为IP头部最长60字节,前面还有20字节的固定部分。IP选项包括:

    记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可以跟踪数               据报的传递路径。

    时间戳(timestamp),告诉每个路由器都将数据报被转发的时间填入IP头部的选项部分。

    松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程必须经过其中所有的路由器。

    严格路由选择(strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。

IP分片

当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能在中转路由器上,而且可能在传输过程中被多次分片,只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。

以太网帧的MTU是1500字节,它携带的IP数据报的数据部分最多是1480字节(IP头部占用20字节)。

每个IP分片都包含自己的IP头部(20字节),且除了最后一个IP分片,其他的IP分片头部都设置了MF标志。

IP层传递给数据链路层的数据可能是一个完整的IP数据报,也可能是一个IP分片,它们统称为IP分组(packet)。

IP路由

IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。

1. IP模块工作流程

①IP模块收到来自数据链路层的IP数据报时,对该数据报的头部做CRC校验,确认无误之后开始分析其头部的具体信息。

②如果该IP数据报设置了源站选路选项,则IP模块调用数据报转发子模块来处理该数据报。

③如果该IP数据报的头部中目标IP是本机的某个IP地址,或者是广播地址,即该数据报是发给本机的,则IP模块就根据数据报头部中的协议字段将它派发给对应的上层协议。

④如果不是发给本机的,则调用数据报转发子模块来处理该数据报。

⑤数据报转发子模块先检测是否允许转发,如果不允许,将该数据报丢弃。如果允许,就将该数据报交给输出子模块

IP数据报应该转发给哪个下一跳路由,以及经过哪个网卡来发送,就需要IP路由过程。

2.路由机制

①查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到就转步骤②。

②查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址。如果找到,就使用该路由项,没找到就转步骤③。

③选择默认路由项,则通常意味着下一跳路由是网关。

3.路由表更新

route命令可以修改路由表。

 

第1行表示添加主机192.168.1.109对应的路由项。

第2行表示删除网络192.168.1.0对应的路由项。

第3行表示删除默认路由项,后果是无法访问因特网。

第4行表示重新设置默认路由项,其网关是机器192.168.1.109(不能直接访问因特网的路由器)

--------------------------------------------------------------------------------------------------------------------------

通过route命令或其他工具手动修改路由表,是静态的路由更新方式。对于大型的路由器,通常通过BGP(Border Gateway Protocol,边际网关协议)、

RIP(Routing Information Protocol,路由信息协议)、OSPF等协议来发现路径,更新自己的路由表。(动态的、自动的更新方式)

IP转发

对于允许IP数据报转发的主机,数据报子模块将对希望转发的数据报进行以下操作:

  1)检查数据报头部的TTL值。如果TTL值已经为0,则丢弃该数据报。

  2)查看数据报头部的严格源路路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否为本机的某个IP地址。如果不是,发送一个ICMP源站选路失败报文给发送端。

  3)如果有必要,给源端发送一个ICMP重定向报文,来告诉它一个更合理的下一跳路由器。

  4)将TTL值减1。

  5)处理IP头部选项。

  6)如果有必要,执行IP分片操作。

posted on 2018-01-10 11:29  Itsad  阅读(486)  评论(0编辑  收藏  举报

导航