首页 > 代码库 > tco/iP协议族——IP工作原理及实例详解(下)

tco/iP协议族——IP工作原理及实例详解(下)



IP协议详解

上一篇文章文章主要介绍了IP服务的特点,IPv4头部结构IP分片,并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程。本文主要介绍IP路由,IP转发,重定向和IPv6头部结构。

IP路由

IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。为了理解IP路由过程,我们先简要分析IP模块的基本流程。

IP模块工作流程

从右往左分析上图,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。

如果该IP数据报的头部设置了源站选路选项,则IP模块调用数据报来转发子模块来处理该数据包。如果该IP数据报的头部目标IP地址是本地的某个IP地址,或者是广播地址,即该数据是发送给本机的,则IP模块就根据数据报头部中的协议字段来决定将它派发给哪个上层应用(分用)。如果IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。

数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。

IP数据报应该发送至哪一下一跳路由,以及经过哪个网卡来发送,就是IP路由过程,即图中“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发往相同的下一跳路由器。

IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报之外,还包括封装了本机上层数据(ICMP报文,TCP报文和UDP报文)的IP数据报。

图中的虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议或者route命令调整路由表,使之更新最新的网络拓扑结构,成为IP路由策略。

路由机制

我们可以使用route命令或netstat命令查看路由表。在chen123上执行route命令,输出内容如下:

Kernel IP routing table

Destination    Gateway        Genmask        Flags Metric Ref   Use Iface

default        192.168.73.2   0.0.0.0        UG   0     0       0 eth0

192.168.73.0   *              255.255.255.0  U    1     0       0 eth0

该路由表包含两项,每一项都包含8个字段。

第一项的目标地址是default,即所谓的默认路由项。该项包含一个“G”标志,说明路由下一跳目标是网管,其地址是192.168.73.2。另一个路由项的目标地址是192.168.73.0,它指的是本地局域网。该路游项的网管地址为*,说明不需要路由中转,可以直接发送给目标机器。

IP路由机制分为三个步骤:

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

  2. 查找路由表中和数据报的目标IP地址具有相同网路IP的网络IP地址。如果找到,就使用该路由项(即上面路由表中的第二项);没找到转步骤3.

  3. 选择默认路由选项,这通常意味着数据报的下一跳路由是网关。

路由表更新

route命令可以修改路由表,举例如下:

chen123@ubuntu:~$ sudo route add -host 192.168.73.130dev eth0

chen123@ubuntu:~$ sudo route del -net 192.168.73.0netmask 255.255.255.0

chen123@ubuntu:~$ sudo route del default

chen123@ubuntu:~$ sudo route add default gw192.168.73.130

第一行添加主机192.168.73.130对应的路由项,这样设置之后,所有从chen123发送li123的数据报将通过网卡eth0直接发送到目标机器的接收网卡。第二行表示删除网络192.168.70.0对应的路由项。第三行删除默认路由项,这样做的后果是无法访问因特网。第四行表示重新设置默认路由项,不过这次其网关li123。经过修改,其输出如下

chen123@ubuntu:~$ route

Kernel IP routingtable

Destination    Gateway        Genmask      Flags Metric  Ref      UseIface

default        192.168.73.130  0.0.0.0         UG   0     0       0 eth0

192.168.73.130 *              255.255.255.255 UH   0     0       0 eth0

这个路由表中,第一个路由项是主机路由项,所以他被设置了“H”标志。

通过route或其他工具手动修改路由表是静态的路由更改方式。对于大型的路由器,通常通过BGPRIPOSPF等协议来发现路径,并更新自己的路由表,这种方式是动态的,自动的。

IP转发

主机一般只发送和接收数据报,这是因为主机/proc/sys/net/ipv4/ip_forward内核参数默认被设置为0,我们可以通过修改它来使主机有数据转发功能。举例如下:

li123上以root身份执行

root@ubuntu:/home/li123# sudoecho 1 > /proc/sys/net/ipv4/ip_forward

在上面命令执行前,在chen123上执行如下命令

root@ubuntu:/home/chen123# pingwww.baidu.com

输出

ping: unknownhostwww.baidu.com

修改ip_forward后,结果输出

PING www.a.shifen.com (115.239.211.110) 56(84) bytesof data.

From 192.168.73.130: icmp_seq=1 Redirect Host(Newnexthop: 192.168.73.130)

64 bytes from 192.168.73.130: icmp_seq=1 ttl=128time=12.4 ms

64 bytes from 192.168.73.130: icmp_seq=2 ttl=128time=21.7 ms

64 bytes from 192.168.73.130: icmp_seq=3 ttl=128time=23.7 ms对于IP数据报转发的系统(主机或路由器),数据报转发子模块对期望转发恩德数据报执行如下操作:

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

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

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

  4. TTL值减1

  5. 处理IP头部选项

  6. 如果有必要,则执行IP分片操作

重定向

ICMP重定向报文的数据部分含义很明确,它给接收方提供了如下两个信息:

1.引起重定向的IP数据报的源端IP地址

2.应发使用的路由器的IP地址

接收主机根据这两个信息就可以判定引起重定向的IP数据报应该使用哪个路由器来转发,并且以此更新路由表。

/proc/sys/net/ipv4/conf/all/accept_redirects内核参数指定是否允许发送ICMP重定向报文,而/proc/sys/net/ipv4/conf/all/send_redirects内核参数指定是否允许接收ICMP重定向报文。

IPv6头部结构

IPv6128位来表示IP地址,是的IP地址总量达到了2128次方个。IPv6地址用十六进制字符串表示,如FE80:0000:0000:0000:1234:5678:0000:0012


参考Linux高性能服务器编程

转载请注明出处,谢谢~~