Linux L3协议栈 - IPv4 part
发送 Tx
数据报文,是通过dst_output函数,将数据交给邻域子系统的,而dst_output,可以通过三种不同的方式调用:
1) ip_push_pending_frams - 被两种包裹函数调用,即ip_append_data 和 ip_append_page。用于UDP,ICMP,raw IP协议的传输。
2) ip_queue_xmit - tcp和sctp做了很多工作来准备分段,从而L3的工作就变少了,简而言之,IP层的工作就是把header加入已经编辑好的数据片中,而其他协议则把所有的分段工作都留给了L3,即IP层。
3) 直接调用dst_output - 当raw IP使用IP_HDRINCL选项时,就得完全负责把IP header准备好,所以会跳过上述函数,直接调用dst_output (参考raw 套接字)。IGMP也会直接调用dst_output。
上述的三种函数完成其工作后,就会把报文传递给dst_output。