《tcp/ip具体解释卷2:实现》笔记--选路请求和选路消息

claireyuancy claireyuancy     2022-08-27     325

关键词:

内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个

函数;rtrequest函数用于加入和删除路由表项;另外大多数接口在接口连接或断开时都会调用函数rtinit。

选路消息在两个方向上传递信息。

进程(route命令)或守护进程(routed或gated)把选路消息写入选路插口。以使内核加入

路由、删除路由或者改动现有的路由。当有时间发生时,如接口断开、收到重定向等,内核也会发送选路消息。进程通过选路

插口来读取它们感兴趣的内容。

内核还提供了还有一种訪问路由表的接口,即系统的sysctl调用。


1.rtalloc和rtalloc1函数

通常,路由表的查找通过调查rtalloc和rtalloc1函数来实现的。

rtalloc调用rtalloc1,rtalloc1调用rnh_matchaddr函数,对于

Internet地址来说,该函数就是rn_match函数。

rtalloc1的大概处理流程例如以下:

调用rn_match,假设符合下列三个条件,则查找成功。

1)存在该协议族的路由表。

2)rn_match返回一个非空指针;而且

3)匹配的radix_node结构没有设置RNF_ROOT标志。

假设查找成功。则指向匹配的radix_node结构的指针保存在rt中。假设调用的第二个參数非0,并且匹配的路由表设有

RTF_CLONING标志。则调用rtrequest函数发送RTM_RESOLVE命令来创建一个新的rtentry结构,该结构是查询结果的

克隆。


2.宏RTFREE和rtfree函数

宏RTFREE,仅在引用计数小于等于1时才调用rtfree函数。否则,它仅完毕引用计数的递减。


3.rtrequest函数

rtrequest函数是加入和删除路由表项的关键点。下图给出了调用它的一些其它函数。

技术分享

rtrequest是一个switch语句。每一个case相应一个命令:RTM_ADD、RTM_DELETE和RTM_RESOLVE。

对于RTM_DELETE命令:

1.从选路树中删除路由

2.删除对网络路由表项的引用。

3.调用接口请求函数。假设该表项定义了ifa_rtrequest函数,就调用该函数。ARP会使用该函数。

4.返回指针或删除引用。

假设调用者须要选路树中被删除的rtentry结构指针,则返回该指针。但此时不能释放该表项。调用

这必须使用完该表项后调用rtfree来删除它。


对于RTM_RESOLVE命令:

仅仅有rtalloc1可以携带此命令參数调用本函数。

也仅仅有在从一个设有RTF_CLONING标志的表项中克隆一个新的表项时,

rtalloc1才这么用。

这个命令将跳转到makeroute标记处继续运行。


对于RTM_ADD命令:

定位对应的接口。查找适当的本地接口,并返回指向该接口的ifaddr结构的指针。

进入makeroute标记处运行。


makeroute的大概处理流程例如以下:

1.为路由表项分配存储器。分配rtentry结构。

2.分配并复制网关地址。

3.复制目的地址。

4.往选路树中加入表项(rtentry结构)。

5.保存接口指针。递增ifaddr结构的引用计数,并保存ifaddr和ifnet结构的指针。

6.为新克隆的路由复制度量。假设是RTM_RESOLVE。则把被克隆的表项中的整个度量结构拷贝到新的表项里。

假设是

RTM_ADD,则调用者可在函数返回后设置该度量值。

7.调用接口请求函数。假设为该表项定义了ifa_rtrequest函数,则调用该函数。

8.返回指正并递增引用计数。假设调用者须要改新结构的指针,在返回该指针。并将该引用计数值从0递增到1。


4.rtinit函数

Internet协议加入或删除相关接口的路由时,对rtinit的调用有四个。

1.在设置点到点接口的目的地址时。in_control调用rtinit两次。第一次调用指定RTM_DELETE命令,以删除全部现存的到

该目的地址的路由,第二次调用指定RTM_ADD命令,以加入新路由。

2.in_ifinit调用rtinit为广播网络加入一条网络路由或为点到点链路加入一条主机路由。

假设是给以太网接口加入的路由。

3.in_ifscrub调用rtinit。以删除一个接口现存的路由。

函数的大概处理流程例如以下:

1.为路由获取目的地址。

假设是一个到达某主机的路由,则目的地址是点到点链路的还有一端。否则。我们处理的就是一个

网络路由。其目的地址是接口的单播地址。

2.假设要删除路由,则必须在路由表中查找该目的地址。并得到它的路由表。

3.调用rt_request运行RTM_ADD或者RTM_DELETE命令。

4.假设删除成功。则产生一个选路消息。

5.假设加入成功可是新路由表项接口的ifaddr指针不等于调用參数,则表明有差错产生。

做例如以下步骤:向控制台输出一条

出错消息;假设rt_request获得到的rtentry中ifa_rtrequest函数(rt->ifa->ifa_rtrequest),就以RTM_DELETE为參数调用

它。假设函数的參数中ifa定义了ifa_rtrequest函数,就以RTM_ADD为參数调用它。最后产生选路消息。


5.rtredirct函数

当收到一个ICMP重定向后。icmp_input调用rtredirect及pfctlinput。

后一个函数又调用udp_cltinput和tcp_ctlinput,这两个

函数遍历全部的UDP和TCP协议控制块(PCB)。假设PCB连接到一个外部地址。而到该外部地址的方向已经被改变,而且

该PCB持有到那个外部地址的路由,则调用rtfree释放该路由。

下一次使用这些控制块发送外部地址的IP数据报时,就会调用

rtalloc。并在路由表中查找该目的地址。非常可能会找到一条新的路由。

rtredirect函数的作用是验证重定向中的信息。并马上更新路由表。产生选路插口消息。

该函数的大概处理流程例如以下:

1.新路由必须直接相连,否则该重定向失效。

2.查找目的地址的路由表项并验证重定向。

调用rtalloc1在路由表中查找到目的地址的路由。验证重定向时,下列条件必须为

真:

  必须未设置RTF_DONE标志。

  rtalloc必须已经找到一个到dst的路由表项。

  发送重定向的路由器的地址必须等于当前为目的地址设置的rt_gateway.

  新网关的接口必须等于当前为目的地址设置的接口,也就是说,新网关必须和当前网关在同一网络上。

  新网关不能把到这个主机的路由改变到自己。也就是说。不能存在与gateway相等的有单播地址或广播地址的连接着的接口。

3.创建新的主机路由。假设到达目的地址的当前路由是一个网络路由,而且重定向是主机重定向而不是网络重定向,那么就为

该目的地址建立一个主机路由(调用rtrequest,RTM_ADD)。而不必去管现存的网络路由。

4.改变现存的主机路由。当到达目的地址的当前路由已经是一个主机路由时,不须要创建新的表项。而是改动现存的表项。

5.由rt_missmsg产生一个选路插口消息。


6.选路消息的结构

选路消息有一个定长的首部和至多8个插口地址结构组成。该定长首部是下列三种结构中的一个:

rt_msghdr

if_msghdr

ifa_msghdr

选路消息三种首部结构的前三个成员的数据类型及其含义是同样的,分别为:消息的长度,版本号和类型。

每中结构都都有

一个成员来编码首部之后8个可能的插口地址:rtm_addr、ifm_addrs和ifam_addrs成员。它们都是一个比特掩码。

下图给出了最经常使用的结构,rt_msghdr。

技术分享

RTM_IFINFO消息使用了下图的if_msghdr结构。

技术分享

RTM_NEWADDR和RTM_DELADDR消息使用了下图的ifa_msghdr结构。

技术分享

三个变量rtm_addrs、ifm_addrs和ifam_addrs都是比特掩码。它们定义了首部之后的插口地址结构。下图给出了比特掩码

用到的一些常量。

技术分享

内核用上图的数组下标来引用rt_addrinfo结构。例如以下图所看到的。

技术分享

假设rti_addrs成员中设置了RTA_GATEWAY比特,则rti_info[RTA_GATEWAY]成员就是含网关地址的插口地址结构的指针。


7.rt_missmsg函数

rt_missmsg函数使用了rt_addrinfo结构,并调用rt_msg1在mbuf链中为进程创建了对应的变长消息,之后调用raw_input将

该mbuf链传递给全部相关的选路插口。函数的处理流程例如以下:

1.在mbuf中创建消息。

rt_msg1在mbuf链中创建对应的消息,并返回该链的指针,下图为rt_msg1创建的一个mbuf链。

技术分享

2.完毕消息的创建。

设置rt_msghdr的其它成员。

3.设置消息的协议,调用raw_input。


8.rt_ifmsg函数

在if_up和if_down中都调用了rt_ifmsg。在接口连接或断开时,该函数被用来产生一个选路插口消息。

函数的大概处理流程

例如以下:

1.调用rt_msg1函数在mbuf链中创建消息。

2.完毕消息的创建。

设置if_msghdr接口中其它成员。

3.设置消息的协议,调用raw_input。


9.rt_newaddrmsg函数

在接口上加入或者删除一个地址时。rtinit要以RTM_ADD或者RTM_DELETE为參数调用rt_newaddrmsg。函数的大概处理

流程例如以下:

1.调用rt_msg1函数在mbuf链中创建消息。

2.完毕消息的创建。设置ifa_msghdr接口中其它成员。

3.设置消息的协议,调用raw_input。

























《tcp/ip具体解释卷2:实现》笔记--接口层

接口层包含在本地网上发送和接收分组的硬件与软件。我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口。Net/3接口层试图在网络协议和连接到一个系统的网... 查看详情

tcp/ip具体解释学习笔记--tcp数据流

1.TCP的交互数据流(1)基本概念所谓交互数据流,其对TCP而言,就是他们所产生的大多数的TCP报文段中所包括的数据不超过10个字节。比如聊天等telnet的软件的TCP数据流就属于TCP交互数据流(2)经受时延的确认TCP收到数据时并不会立... 查看详情

《tcp/ip具体解释》读书笔记(21章)-tcp的超时与重传

TCP提供可靠的运输层。它使用的方法之中的一个就是确认从还有一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这样的问题。假设当定时器溢出时还没有收到确认,它就重传该数据。对于... 查看详情

《tcp/ip具体解释》读书笔记(20章)-tcp的成块数据流

眼下建立在TCP协议上的网络协议特别多,有telnet。ssh,有ftp。有http等等。这些协议又能够依据数据吞吐量来大致分成两大类:(1)交互数据类型,比如telnet,ssh。这样的类型的协议在大多数情况下仅仅是做小流量的数据交换,比... 查看详情

《tcp/ip具体解释》读书笔记(22章)-tcp的坚持定时器

TCP通过让接收方指明希望从发送方接收的数据字节数(即窗体大小)来进行流量控制。假设窗体大小为0会发生什么情况呢?这将有效阻止发送方传送数据,直到窗体变为非0为止。ACK的传输并不可靠,也就是说,TCP不正确ACK报文... 查看详情

tcp/ip具体解释学习笔记——地址解析协议arp

一概述我们知道,IP协议是用来在不同的物理网络之间数据传输的。要在不同的网络之间数据传输,至少须要将IP协议所用的地址转换成特定网络所使用的物理地址。一般来说。就是将IPv4地址转换为mac地址。要想与一个特定的设... 查看详情

《tcp/ip具体解释》读书笔记(19章)-tcp的交互数据流

在TCP进行传输数据时。能够分为成块数据流和交互数据流两种。假设按字节计算。成块数据与交互数据的比例约为90%和10%,TCP须要同一时候处理这两类数据,且处理的算法不同。书籍本章中以Rlogin应用为例观察交互数据的传输过... 查看详情

tcp-ip详解卷2:实现pdf下载

...载了):http://putpan.com/fs/byi8beens3hu9e904/《TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌 查看详情

tcp/ip具体解释学习笔记--tcp的坚持和保活定时器

TCP的坚持定时器1.基本概念TCP的接收方指名希望从发送方接收的数据字节(窗体大小)来进行流量控制,假设窗体大小为0。那么放送方就会阻止发送数据,直到接收方发来一个已跟新窗体大小的ACK为止,那么假设接收方发送的这... 查看详情

tcp/ip具体解释--icmp报文分析

一.概述:1.   ICMP同意主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用... 查看详情

tcp/ip||动态选路

   1.动态选路    动态选路协议用于路由器之间的通信,当相邻路由器之间进行通信,已告知对方每个路由器当前所连接的网络,就产生了动态选路,在Internet之间采用了许多不同的选路协议,Internet是以一组自治系统(AS)方... 查看详情

tcp/ip学习20180805-数据链路层-ip选路

...原文链接https://blog.csdn.net/wh1511995112/article/details/51474692IP选路   什么是IP选路? IP选路,即IP寻路,就是根据路由表中的记录,来决定当前数据报是直接交付(目的地址属于当前局域网)还是发往下一跳路由(隶属... 查看详情

第2章internet地址结构[tcp/ip详解卷1:协议]

...络中使用的设备也需要IP地址。在任何情况下,IP路由器实现的转发程序使用IP地址来识别流量去向,IP地址也表示流量来源。成组的IP地址被分配给用户和组织,这些拥有者再将它们分配给设备,这通常根据某些“编号方案”进... 查看详情

tcp/ip具体解释--udp数据报中的ip分片

1、UDP首部2、UDP分片在第二章,讲链路层是,提到过以太网。刨除数据帧帧头。最多传输的长度为1500。也就是说,假设一个ip数据报,长度大于1500,则须要分片。分片方法:在ip头中3位标志,13位片偏移,这俩东西就是用来分片... 查看详情

tcp/ip详解,卷1:协议

...。它是一个真正的开放系统,因为协议族的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网(Internet)”的基础,该广域网(WAN)已包含超过100万台遍布世界各地的计算机... 查看详情

tcp/ip具体解释--tcp的分段和ip的分片

写在前面:   分组能够发生在运输层和网络层。运输层中的TCP会分段,网络层中的IP会分片。IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会发生分片的现象。... 查看详情

tcp/ip协议族——ip工作原理及实例具体解释(上)

??IP协议具体解释       本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包。来观察IP数据报传送过程中IP的格式,以及分片的过程。IP头部信息:IP头部信息出如今每一个IP数据报... 查看详情

tcp/ip详解,卷1:协议--rarp:逆地址解析协议

...地址,它是由网络接口生产厂家配置的。无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求(一帧在网络上广播的数据),请求某个主机响应该无盘系统的IP地址(在RARP应答中)。在概念上这个过... 查看详情