高性能服务器之ip协议详解(2)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 高性能服务器之ip协议详解(2),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

IP的重要两点

IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导iP分片和重组,以及指定部分通信行为。

IP数据报的路由和转发:IP数据报的路由和转发发生在除目标机器之外的所有主机
和路由器上,它们决定数据报是否应该被转发以及如何被转发

IP服务的特点

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。
无状态(stateless〉是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。比如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到。而且最重要的是只要收到IP数据报,就会将其数据部分(TCP报文段、UDP数据报或者ICMP报文)上交给上层协议。无状态服务的优点也很明显:简单、高效。我们无须为保持通信的状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。在网络协议中,无状态是很常见的,比如UDP协议和HTTP协议都是无状态协议。以HTTP协议为例,一个浏览器的连续两次网页请求之间没有任何关联,它们将被Web服务器独立地处理。
无连接(connectionless)是指P通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。
不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力(best effort)。

IPv4头部

IPv4的头部结构

在这里插入图片描述
4位版本号(version)指定IP协议的版本。对IPv4来说,其值是4。其他IPv4协议的扩展版本(如SIP协议和PIP协议),则具有不同的版本号。
4位头部长度(header length)标识该IP头部有多少个32 bit字(4字节)。因为4位最大能表示15,所以I头部最长是60字节。
8位服务类型(Type Of Service,TOS)包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要。比如像ssh和 telnet这样的登录程序需要的是最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。
16位总长度( total length)是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。
16位标识(identification)唯一地标识主机发送的每一个数据报。其初始值由系统随机生成﹔每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值
3位标志字段的第一位保留。第二位(Don’t Fragment,DF)表示**“禁止分片**”。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。
13位分片偏移〈fragmentation offset)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个P分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。
斤拥们一丁合连的侧移但)s
8位生存时间(Time To Live,TTL)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
IPv4最后一个选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。可用的IP选项包括:
记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们就可以跟踪数据报的传递路径。
时间截(timestamp),告诉每个路由器都将数据报被转发的时间(或时间与IP地t对〉填人IP头部的选项部分,这样就可以测量途经路由之间数据报传输的时间。
松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。
**严格源路由选择(**strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。

IP分片

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

长度为1501字节的IP数据报被拆分成两个IP分片,第一个IP分片长度为1500字节,第二个P分片的长度为21字节。每个IP分片都包含自己的P头部(20字节),且第一个IP分片的IP头部设置了MF标志,而第二个I分片的P头部则没有设置该标志,因为它已经是最后一个分片了。原始IP数据报中的ICMP头部内容被完整地复制到了第一个IP分片中。第二个IP分片不包含ICMP头部信息,因为P模块重组该ICMP报文的时候只需要一份ICMP头部信息,重复传送这个信息没有任何益处。1473字节的ICMP报文数据的前1472字节被I模块复制到第一个P分片中,使其总长度为1500字节,从而满足MTU的要求:而多出的最后1字节则被复制到第二个分片中。
在这里插入图片描述

IP路由

IP模块基本流程

在这里插入图片描述

当IP模块接收到来自数据链路层的数据报时,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。
如果该IP数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报。如果该数据报的头部中目标P地址是本机的某个IP地址,或者是广播地址,即该数据报是发送给本机的,则IP模块就根据数据报头部中的协议字段来决定将它派发给哪个上层应用(分用)。如果IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。
数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。我们将在后面讨论数据报转发的具体过程。
IP数据报应该发送至哪个下一跳路由(或者目标机器),以及经过哪个网卡来发送,就是I路由过程,即图中“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发往相同的下一跳路由器(或者目标机器)。我们将在后面讨论IP路由过程。
IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文、TCP报文段和UDP数据报)的IP数据报。

IP路由表

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
192.168.179.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

在这里插入图片描述
0.0.0.0的解释

那么路由表是如何按照P地址分类的呢?
2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址(比如代码清单2-2所示的路由表中的第二项)。如果找到,就使用该路由项:没找到则转步骤3。
1)查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到则转步骤2。
2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址(比如代码清单上图所示的路由表中的第二项)。如果找到,就使用该路由项:没找到则转步骤3

路由表的更新

[root@localhost ~]# route add -host 192.168.179.187 dev ens33
[root@localhost ~]# route del -net 192.168.122.0  netmask 255.255.255.0
[root@localhost ~]# route del default
[root@localhost ~]# route add default gw 192.168.179.187 dev ens33
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         localhost.local 0.0.0.0         UG    0      0        0 ens33
192.168.179.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
localhost.local 0.0.0.0         255.255.255.255 UH    0      0        0 ens33

第1行表示添加主机192.168.1.109(机器Kongming20)对应的路由项。这样设置之后,所有从ernest-laptop 发送到Kongming20的IP数据报将通过网卡eth0直接发送至目标机器的接收网卡。第2行表示删除网络192.168.1.0对应的路由项。这样,除了机器Kongming20外,测试机器ernest-laptop将无法访问该局域网上的任何其他机器(能访向到Kongming20是由于执行了上一条命令)。第3行表示删除默认路由项,这样做的后果是无法访问因特网。第4行表示重新设置默认路由项,不过这次其网关是机器Kongming20(而不是能直接访问因特网的路由器)!经讨上述修改后的路由夷如下.

IP转发

前文提到,不是发送给本机的IP数据报将由数据报转发子模块来处理。路由器都能执行数据报的转发操作,而主机一般只发送和接收数据报,这是因为主机上 /proc/sys/net/ipv4/ip_forward内核参数默认被设置为0。我们可以通过修改它来使能主机的数据报转发功能

echo 1>/proc/sys/net/ipv4/ip_forward

1)检查数据报头部的TTL值。如果TTL值已经是0,则丢弃该数据报。
2)查看数据报头部的严格源路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址。如果不是,则发送一个ICMP源站选路失败报文给发送端。
3)如果有必要,则给源端发送一个ICMP重定向报文,以告诉它一个更合理的下一跳路由器。
4)将TTL值减1。
5)处理IP头部选项。
6)如果有必要,则执行P分片操作。

重定向

ICMP重定向报文

在这里插入图片描述
(1)引起重定向的P数据报(原始IP数据报〉的源端IP地址。
(2)应该使用的路由器的IP地址。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129718.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!