IPV4--简单的三层处理流程发现在工作的时候,如果先看书,看代码,再来总结,真是有点做重复功。因为总结的时候 还是得看书,并且感觉还得一下下来。所以今后就一边看一边总结了,今后也能看清楚些了。 书上的前一章讲的是ipv4 的一些概念,虽说自己以前看过tcp/ip 协议方面的详细资料,但 是现在看看还是收获不少。里面花了好多的笔墨来说分片的事,以前我确实没有意识到分片 有这么大的影响,原来还有很多的考虑在里面,但是因为工作中在负责分片重组模块,所以 对分片处理的性能降低还是有些切身体会的。对v4 中分片机制弊端的考虑导致了v6 中PMTU 发现机制的出现(其实v4 里面也有这种机制),下面说一下PMTU 发现。 PMTU 是指一条通信链路上允许传递的单个报文的最大值,也就是链路上每段网络的MTU 低值。如果通信的双方都使用PMTU来封装IP 报文就能避免分片,提高了效率。但是,路由 的改变会使PMTU 发生变化。PMTU 发现机制利用了IP 中DF 标志位和ICMP,如果设置DF 标志 位,发送报文后没有收到表明报文过长的ICMP 消息,那么表明此长度是小于等于PMTU 但也许不是最佳值。Linux中如果使能了此机制并且和对端直接相连,那么初始值就是出接 口的MTU;如果禁止了此机制,和对端不再同一个网段上,那么PMTU 默认值是576--RFC791 等规定的最小的网络MTU 值。当然,用户也可以用ifconfig 工具来配置这些。 Linux 中对每一个目的ip,在routing cache entry 中保存有其PMTU,这里为什么不对一条 目的网段保存一个PMTU 呢?可以考虑一下子网的情况,同一个网段上的主机并不一定就有一 样的MTU 值。上段提到了网络路由改变时,也可能要改变PMTU。这时如果主机收到了ICMP, 表明上次的报文长度过大,那么主机尝试减少PMTU 值,直到一个可接受的值,注意,这个值 最小就是 576。Linux 的这种机制总是在减小 PMTU,而不会去增大它,这也是目前的限制之 本章讲解linux中ipv4 实现基础和一些特性。 ip_rcv函数 ip_rcv 函数是进入三层的第一个处理函数,也是体现netfilter 中典型的两步走的一个实现。 可以看到参数中的pt 实际上没有被用到,应该只是为了保持协议模块注册机制的统一。 Ip_r