16.3.2 接收网络数据recv()

16.3.2  接收网络数据recv()

网络数据接收依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。

如图16.11所示,网卡在一个数据包到来时,会产生一个硬中断,网络驱动程序会执行中断处理过程:首先申请一个skb结构及pkt_len+5大小的内存用于保存数据,然后便将接收到的数据从网卡复制到这个skb的数据部分中。当数据从网卡中成功接收后,调用netif_rx(skb)进一步处理数据,将skb加入到相应的input_pkt_queue队列中,并调用netif_rx_schedule(),会产生一个软中断来执行网络协议栈的例程。这样,中断的上半部已完成,以下的工作则交由中断的下半部来实现。

如图16.12所示,下半部的内核守护线程do_softirq(),将执行net_rx_action(),对数据进行处理。IP层输入处理程序轮询处理输入队列中的每个IP数据,在整个队列处理完毕后返回。IP层验证IP首部的校验和,处理IP选项,验证IP主机地址和正确性等,并调用相应协议(TCP或者UDP等)处理程序。接收的进程在网络协议栈处理完毕后会收到唤醒的信号,并收到发送来的网络数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值