本文主要讲解了Linux内核IP层的整体架构和对从网卡接受的报文处理流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linxu内核中IP整体实现架构和对网卡报文的处理流程进行了讲解,希望可以对大家有所帮助.阅读本文章假设大家对C语言有了一定的了解 IP层的整体实现架构 IP层接受底层数据报文的处理流程 /* * 在NET_RX_SOFTIRQ软中后,由ETH_P_IP触发的ipv4协议入口函数 */ int ip_rcv(struct sk_buff…
ip报文根据路由结果:如果发往本地则调用ip_local_deliver处理报文:如果是转发出去,则调用ip_forward 处理报文. 一.ip报文转发到本地: /* * Deliver IP Packets to the higher protocol layers. */ /* * 在ip_route_input_noref进行路由选择后,如果接收的包 * 是发送给本机,则调用ip_local_deliver来传递给上层协议 */ int ip_local_deliver(struct s…
udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_unicast_reply也会调用:其主要作用是将收到的大数据报文拆分成多个等于小于MTU的SKB,为网络层实现ip分片做准备. ip_append_data 在udp tcp raw 套接字以及icmp 都有被调用到,因此复制数据时有时只需要复制传输层负载部分:此函数并不传输数据,只是将数据放在大小…
在ip_local_deliver中,如果检测到是分片包,则需要将报文进行重组.其所有的分片被重新组合后才能提交到上层协议,每一个被重新组合的数据包文用ipq结构实例来表示 struct ipq { struct inet_frag_queue q; u32 user;//分片来源 __be32 saddr;//原地址 __be32 daddr;//目的地址 __be16 id;//ip报文序列号 u8 protocol;//上层协议号 //这四个字段来自ip首部是为了确定来自哪个ip数据报文…
ip层数据包处理场景如下: 网络层处理数据包文时需要和路由表以及邻居系统打交道.输入数据时,提供输入接口给链路层调用,并调用传输层的输入接口将数据输入到传输层. 在输出数据时,提供输出接口给传输层,并调用链路层的输出接口将数据输出到链路层.在输入输出数据时,需要查找路由表 通过netfiler处理等操作. 一.ip数据报文输入 ip_rcv &ip_rcv_finish &ip_rcv_finish2 1.在inet_init中注册了类型为ETH_P_IP协议的数据包的回调ip_rcv 2…
L4层的协议会把数据通过ip_append_data或ip_append_page把数据线放在缓冲区,然后再显示调用ip_push_pending_frames传送数据. 把数据放在缓冲区有两个优点,一方面,缓冲区的数据可以被后续的一些函数使用,构成一些片段:另一方面,把数据放缓冲区,等缓冲区满了(达到PMTU)再传送数据,可以更有效率. 如果在一些情况下,L4层希望去放在缓冲区的数据立即被传输,那么在调用ip_append_data把数据放缓冲区后,立即调用ip_push_pending_fr…
无论是从本地输出的数据还是转发的数据报文,经过路由后都要输出到网络设备,而输出到网络设备的接口就是dst_output(output)函数 路由的时候,dst_output函数设置为ip_output ip_mc_output等 1.TCP输出接口 L4 层在发送数据时会根据协议的不同调用上面提到的几个辅助函数之一,tcp协议打包成ip数据包文的方法根据tcp段的不同而选择不同的接口, 其中ip_queue_xmit为常用接口,ip_build_and_send_pkt.ip_send_repl…
//在函数ip_route_input_slow->ip_mkroute_input注册, /* * IP数据包的转发是由ip_forward()处理,该函数在ip_rcv_finish() * 通过输入路由缓存被调用. */ int ip_forward(struct sk_buff *skb) { u32 mtu; struct iphdr *iph; /* Our header */ struct rtable *rt; /* Route we use */ struct ip_optio…
终极资料 1.<Understanding Linux Network Internals> 2.<TCP/IP Architecture, Design and Implementation in Linux> 以下博客内容可用于导读. 自底向上 链路层质料 1.linux内核网络协议栈架构分析,全流程分析-干货: https://blog.csdn.net/zxorange321/article/details/75676063 2.专栏:Linux内核网络栈源代码分析 htt…
转:http://blog.csdn.net/adamska0104/article/details/45397177 Linux内核网络报文简单流程2014-08-12 10:05:09 分类: Linux linux下的网卡驱动中通常会提供类似XXX_rx的接收函数 该函数处理与具体硬件相关的寄存器操作 包括中断检查,数据状态检查,错误检查等 在确认有数据抵达后读取数据或从DMA的接收环中获取数据地址 XXX_rx函数以skb为元数据结构组织报文数据 随后调用内核接口函数netif_rx或n…