《Linux高性能服务器编程》——2.4 IP路由

2.4 IP路由

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

2.4.1 IP模块工作流程

IP模块基本工作流程如图2-3所示。

我们从右往左来分析图2-3。当IP模块接收到来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。

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

数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。我们将在后面讨论数据报转发的具体过程。

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

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

图2-3中的虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议或者route命令调整路由表,使之更适应最新的网络拓扑结构,称为IP路由策略。我们将在后面简单讨论它。

2.4.2 路由机制

要研究IP路由机制,需要先了解路由表的内容。我们可以使用route命令或netstat命令查看路由表。在测试机器ernest-laptop上执行route命令,输出内容如代码清单2-2所示。

该路由表包含两项,每项都包含8个字段,如表2-2所示。

代码清单2-2所示的路由表中,第一项的目标地址是default,即所谓的默认路由项。该项包含一个“G”标志,说明路由的下一跳目标是网关,其地址是192.168.1.1(这是测试网络中路由器的本地IP地址)。另外一个路由项的目标地址是192.168.1.0,它指的是本地局域网。该路由项的网关地址为*,说明数据报不需要路由中转,可以直接发送到目标机器。

那么路由表是如何按照IP地址分类的呢?或者说给定数据报的目标IP地址,它将匹配路由表中的哪一项呢?这就是IP的路由机制,分为3个步骤:

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

2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址(比如代码清单2-2所示的路由表中的第二项)。如果找到,就使用该路由项;没找到则转步骤3。

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

因此,对于测试机器ernest-laptop而言,所有发送到IP地址为192.168.1.*的机器的IP数据报都可以直接发送到目标机器(匹配路由表第二项),而所有访问因特网的请求都将通过网关来转发(匹配默认路由项)。

2.4.3 路由表更新

路由表必须能够更新,以反映网络连接的变化,这样IP模块才能准确、高效地转发数据报。route命令可以修改路由表。我们看如下几个例子(在机器ernest-laptop上执行):

$ sudo route add –host 192.168.1.109 dev eth0
$ sudo route del -net 192.168.1.0 netmask 255.255.255.0
$ sudo route del default
$ sudo route add default gw 192.168.1.109 dev eth0

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

Kernel IP routing table
Destination   Gateway       Genmask           Flags   Metric   Ref  Use Iface
Kongming20    *             255.255.255.255   UH      0        0    0   eth0
default       Kongming20    0.0.0.0           UG      0        0    0   eth0

这个新的路由表中,第一个路由项是主机路由项,所以它被设置了“H”标志。我们设计这样一个路由表的目的是为后文讨论ICMP重定向提供环境。

通过route命令或其他工具手工修改路由表,是静态的路由更新方式。对于大型的路由器,它们通常通过BGP(Border Gateway Protocol,边际网关协议)、RIP(Routing Information Protocol,路由信息协议)、OSPF等协议来发现路径,并更新自己的路由表。这种更新方式是动态的、自动的。这部分内容超出了本书的讨论范围,感兴趣的读者可阅读参考资料1。

时间: 2024-10-03 13:59:06

《Linux高性能服务器编程》——2.4 IP路由的相关文章

《Linux高性能服务器编程》——导读

前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的知识,基本没有自己的观点,甚至连一点自己的总结都没有.反观大师们的经典书籍,整本书只专注于一个问题,而且对每个技术细节的描述都是精雕细琢.最关键的是,我们在阅读这些经典书籍时,似乎是在用心与一位编程高手交流,这绝对是一种享受. 我们把问题缩小到计算机网络编程领域.关于计算机网络编程的相关书籍,不得不

《Linux高性能服务器编程》——第1章 TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议

第1章 TCP/IP协议族 现在Internet(因特网)使用的主流协议族是TCP/IP协议族,它是一个分层.多协议的通信体系.本章简要讨论TCP/IP协议族各层包含的主要协议,以及它们之间是如何协作完成网络通信的. TCP/IP协议族包含众多协议,我们无法一一讨论.本书将在后续章节详细讨论IP协议和TCP协议,因为它们对编写网络应用程序具有最直接的影响.本章则简单介绍其中几个相关协议:ICMP协议.ARP协议和DNS协议,学习它们对于理解网络通信很有帮助.读者如果想要系统地学习网络协议,那么R

《Linux高性能服务器编程》——第2章 IP协议详解 2.1 IP服务的特点

第2章 IP协议详解 IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一.本章从两个方面较为深入地探讨IP协议: 由于32位表示的IP地址即将全部使用完,因此人们开发出了新版本的IP协议,称为IPv6协议,而原来的版本则称为IPv4协议.本章前面部分的讨论都是基于IPv4协议的,只在最后一节简要讨论IPv6协议. 在开始讨论前,我们先简单介绍一下IP服务. 2.1 IP服务的特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态(

《Linux高性能服务器编程》——1.7 socket和TCP/IP协议族的关系

1.7 socket和TCP/IP协议族的关系 前文提到,数据链路层.网络层.传输层协议是在内核中实现的.因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务.实现这组系统调用的API(Application Programming Interface,应用程序编程接口)主要有两套:socket和XTI.XTI现在基本不再使用,本书仅讨论socket.图1-1显示了socket与TCP/IP协议族的关系. 由socket定义的这一组API提供如下两点功能:一是将应用程序数据从

《Linux高性能服务器编程》——2.3 IP分片

2.3 IP分片 前文曾提到,当IP数据报的长度超过帧的MTU时,它将被分片传输.分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装. IP头部中的如下三个字段给IP的分片和重组提供了足够的信息:数据报标识.标志和片偏移.一个IP数据报的每个分片都具有自己的IP头部,它们具有相同的标识值,但具有不同的片偏移.并且除了最后一个分片外,其他分片都将设置MF标志.此外,每个分片的IP头部的总长度字段将被设置为

《Linux高性能服务器编程》——2.5 IP转发

2.5 IP转发 前文提到,不是发送给本机的IP数据报将由数据报转发子模块来处理.路由器都能执行数据报的转发操作,而主机一般只发送和接收数据报,这是因为主机上/proc/sys/net/ipv4/ip_forward内核参数默认被设置为0.我们可以通过修改它来使能主机的数据报转发功能(在测试机器Kongming20上以root身份执行): # echo 1 > /proc/sys/net/ipv4/ip_forward 对于允许IP数据报转发的系统(主机或路由器),数据报转发子模块将对期望转发的

《Linux高性能服务器编程》——3.3 TCP连接的建立和关闭

3.3 TCP连接的建立和关闭 本节我们讨论建立和关闭TCP连接的过程. 3.3.1 使用tcpdump观察TCP连接的建立和关闭 首先从ernest-laptop上执行telnet命令登录Kongming20的80端口,然后抓取这一过程中客户端和服务器交换的TCP报文段.具体操作过程如下: $ sudo tcpdump -i eth0 –nt '(src 192.168.1.109 and dst 192.168.1.108) or (src 192.168.1.108 and dst 192

《Linux高性能服务器编程》——3.9 TCP超时重传

3.9 TCP超时重传 在3.6节-3.8节中,我们讲述了TCP在正常网络情况下的数据流.从本节开始,我们讨论异常网络状况下(开始出现超时或丢包),TCP如何控制数据传输以保证其承诺的可靠服务. TCP服务必须能够重传超时时间内未收到确认的TCP报文段.为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动.如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器.至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传

《Linux高性能服务器编程》——3.4 TCP状态转移

3.4 TCP状态转移 TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令(见第17章)查看.本节我们要讨论的是TCP连接从建立到关闭的整个过程中通信两端状态的变化.图3-8是完整的状态转移图,它描绘了所有的TCP状态以及可能的状态转换. 图3-8中的粗虚线表示典型的服务器端连接的状态转移:粗实线表示典型的客户端连接的状态转移.CLOSED是一个假想的起始点,并不是一个实际的状态. 3.4.1 TCP状态转移总图 我们先讨论服务器的典型状态转移过程,此时我们说的连接