转发:i p _ f o r w a r d函数
到达非最终目的地系统的分组需要被转发。只有当 i p f o r w a r d i n g非零或当分组
中包含源路由时,i p i n t r才调用实现转发算法的 i p _ f o r w a r d函数。当分组中包含
源路由时,i p _ d o o p t i o n s调用i p _ f o r w a r d,并且第2个参数s r c r t设为1。
i p _ f o r w a r d通过图中显示的r o u t e结构与路由表接口。
4 6 - 4 9 r o u t e结构有两个成员: r o _ r t,指向r t e n t r y结构的指针;r o _ d s t,一个
s o c k a d d r结构,指定与r o _ r t所指的路由项相关的目的地。目的地是在内核的路由表中用
来查找路由信息的关键字
我们分两部分讨论i p _ f o r w a r d。第一部分确定允许系统转发分组,修改I P首部,并为分
组选择路由。第二部分处理I C M P重定向报文,并把分组交给i p _ o u t p u t进行发送。如下图所示。
1. 分组适合转发吗
8 6 7 - 8 7 1 i p _ f r o w a r d的第1个参数是指向一个m b u f链的指针,该m b u f中包含了要被转发
的分组。如果第2个参数s r c r t为非零,则分组由于源路由选项(见9 . 6节)正在被转发。
8 7 9 - 8 8 4 i f语句识别并丢弃以下分组。
• 链路层广播
任何支持广播的网络接口驱动器必须为收到的广播分组把 M _ B C A S T标志置位。如果分组
寻址是到以太网广播地址,则e t h e r _ i n p u t就把M _ B C A S T置位。不转发链路层的广
播分组。
RFC 11 2 2不允许以链路层广播的方式发送一个寻址到单播 I P地址的分组,并在
这里将该分组丢掉。
• 环回分组
对寻址到环回网络的分组, i n _ c a n f o r w a r d返回0。这些分组将被i p i n t r提交给i p _
f o r w a r d,因为没有正确配置反馈接口。
• 网络0和E类地址
对这些分组,i n _ c a n f o r w a r d返回0。 这些目的地址是无效的,而且因为没有主机接收
这些分组,所以它们不应该继续在网络中流动。
• D类地址
寻址到D类地址的分组应该由多播函数 i p _ m f o r w a r d而不是由 i p _ f o r w a r d处理。
i n _ c a n f o r w a r d拒绝D类(多播)地址。
RFC 791 规定处理分组的所有系统都必须把生存时间 ( T T L )字段至少减去1,即使T T L是
以秒计算的。由于这个要求, T T L通常被认为是对 I P分组在被丢掉之前能经过的跳的个数的
界限。从技术角度说,如果路由器持有分组超过 1秒,就必须把i p _ t t l减去多于1。