1.大蓝图
大蓝图展示了IPv4协议与其他子系统之间的联系,保罗设备驱动、Netfilter、L4 层协议等之间的互动。
IPv4协议中的报文
我们可以大致看出数据在IPv4协议中的流向,
接收报文
设备驱动处理完硬件介绍到的数据后,IPv4协议的ip_rcv函数(net_receive_skb调用)得到了属于IPv4的报文,接着调用ip_rcv_finish对报文进行分析。判断是该转发还是交付本地上层协议。
如果是本地报文,则传给ip_local_deliver处理,如果是转发,那就交付ip_forward进行转发处理。
发送报文
对于接收到的属于转发的报文(来自ip_forward_finish)以及L4层传下来的报文,需要进行分析后传给设备驱动,发往其他系统。其流程主要是通过ip_finish_ouput进行。最后调用hard_start_xmit传给网卡设备驱动程序。
IPv4协议的任务
健康检查:
(略)
防火墙:
Netfilter在报文的生存周期里会多次被调用,以便处理报文。
处理选项:
应用程序设定的一些选项。
分段/重组:
IP报头的len选项可以表达64k数据段的长度,但是实际网络中不能传输那么大的数据,网络传输中一般有一个MTU,当要传输的数据报数据段超过这个MTU时,就必须进行分段、重组。
接收、传输与转发:
(略)
IP报头
服务类型:
(Type of service:TOS) 服务于Qos,现在用于差别服务,用于对报文进行差别对待。
标志:
重要字段
DF:不分段
MF:分段
分段偏移量:用于分段/重组
存活时间: 报文多少秒后就要被抛弃
协议:L4层协议标志
选项:
提供给应用程序对IP报文 是否进行分段、如何传输、路由选择等进行拓展。
分段和重组
前面已经说过,IP报头的len字段可以表达64k数据段的报文长度,但是实际网络无法传输这样大的数据,而存在MTU,报文长度超过MTU时,会被分成若干个长度为MTU的报分段(最后一个分段可能比较小),再分别进行传输。
IP分段一般在目的主机进行重组,(中间设备如果需要查看整个ip报文,那么也需要进行报文重组)。
分段和重组工作会占用CPU和内存,且可能会占用多余的网络带宽,产生比较大的开开销。有时我们需要避免分段和重组。
理论上上层协议不知道IP层在何时进行分段和重组操作,但是应用程序可以通过使用比其可以使用的MTU更小的尺寸传输数据,以避免报文分段工作。(可以看做吧分段放在应用层处理,但实际上它确实能够改善响应时间)。
路径MTU的发现
与用户配置、出口设备、默认值576、ICMP检测等相关。
检验和
检验报文是否错误、甚至修复错误。