数据包在Linux中的流程(转载)
来源:互联网 发布:js中事件传播的方式 编辑:程序博客网 时间:2024/05/17 04:39
数据包在Linux中的流程(转载)
原文地址:http://www.tongyi.net/os/linux/1046180.html
1、中断处理函数流程
网卡收到一帧 -----〉
引发中断 -----〉
cpu调用相应的中断处理函数(指向此网卡驱动中的相应的处理函数)(把此packet读到ram中) -----〉
呼叫netif_rx函数来打上timestamp,并把此skb放入到cpu设置的队列中 -----〉
标记软中断(__cpu_raise_softirq)-----〉
中断完成。
2.、进一步分析
当软中断被调用时(一共在三个地方调用),呼叫NET_RX_SOFTIRQ(其实就是net_rx_action()函数)来处理网络方面的软中断。-----〉
net_rx_action()根据数据包的协议类型在数组ptype_base[16]里找到相应的协议,并从中知道了接收的处理函数,然后把数据包交给处理函数,这样就交给了上层处理,实际调用处理函数是通过net_rx_action()里的pt_prev->func()这一句。例如如果数据包是IP协议的话,ptype_base[ETH_P_IP]->func()(ip_rcv()),这样就把数据包交给了IP协议。根据包的类型,查找系统中注册了的相应的包处理函数,对于ipv4的ip包,呼叫ip_rcv ----〉
NF_IP_PRE_ROUTING -----〉
ip_rcv_finish(进行对此包的路由操作) -----〉
根据路由的结果,呼叫ip_local_deliver(给本机的包)/ip_forwardd(要转发的包)/ip_error()(出现错误的数据包)/ip_mr_input()(多播包的处理)ip_forward:要进行转发的包,check ttl, mtu, call NF_IP_FORWARDS ----〉
ip_forwmard_finish(check other ip options for forwardd!)-----〉
ip_send(如果需要分片,则调用ip_fragment,否则调用ip_finish_output()(call NF_IP_POST_ROUTING,然后时ip_finish_output2(填充链路层头部到skb结构中)-----〉
hh->hh_output/dsr->neighbour->output
- 数据包在Linux中的流程(转载)
- 数据包在Linux中的流程(转载)
- 数据包在Linux中的流程
- Linux内核bridge中的数据包处理流程(转载)
- Linux内核数据包处理流程(转载)
- Linux内核bridge中的数据包处理流程
- Linux内核bridge中的数据包处理流程
- Linux内核bridge中的数据包处理流程
- linux ipsec 数据包处理流程
- Linux系统捕获数据包流程
- linux内核数据包转发流程(一):网络设备驱动
- linux内核数据包转发流程(二):中断
- Linux内核数据包处理流程-数据包接收
- Linux内核数据包处理流程-数据包接收(1)
- Linux内核数据包处理流程-数据包接收(2)
- Linux内核数据包处理流程-数据包接收(3)
- Linux内核数据包处理流程-数据包接收
- Linux内核数据包处理流程-数据包接收
- 人穷志短,千古名言
- ZJU1146解题报告
- 随便写写
- 心情日记
- ★ AjaxControlToolkit 微软出的ajax.net 工具使用教程一
- 数据包在Linux中的流程(转载)
- php通用分页类
- 搜索自动跳转到SEARCH.114.VNET.CN或者SH.VNET.CN的解决办法
- 蓝牙技术
- Java Bluetooth Development Kits
- BlueCove
- 软件体系结构网站
- apt - how to
- Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表