欢迎来到天天文库
浏览记录
ID:48054560
大小:209.05 KB
页数:8页
时间:2019-10-08
《tcp数据包接收流程整理.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、tcp数据包接收流程整理在此关于网络传输所用的数据包skb的收发流程(囊括所有分层详细,),因为所参考的版本各异,所以一些细节可能会有所不同,但是大体都是一样的。值得注意的是几处中断锁还有rcu_read_lock()的使用Van'strickistodepositbuffersintosocketqueueonadeviceinterrupt,tocalltcp_recvfunctiononthereceiveprocesscontextandchecksumandcopythebuffertouserspace.smart...具体详见t
2、henetpdf当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing),图1-8显示了该过程是如何发生的。数据包的接收1.不同于数据包发送,从上到下的过程,数据包的接收是从下到上的过程(这句废话,仅为装B...读起来更好一点),数据包接收的第一步就是网卡驱动从网络中获取数据包。http://www.cnblogs.com/lambda107/archive/2010/08/02/179
3、0184.html当一个数据包从网络中到达时,网卡会向CPU发送一个中断,然后会调用特定于网络的驱动程序来接收数据包。在这个中断处理当中,会给新到的数据包分配空间,skb。这个中断函数会调用netif_rx(netif_rx-postbuffertothenetworkcode),这个函数做了什么事呢,这里只说关于数据包的传递,它会调用enqueue_to_backlog(skb,cpu,&rflow->last_qtail),接下来enqueue_to_backlog.enqueue_to_backlog(enqueue_to_backlo
4、giscalledtoqueueanskbtoaperCPUbacklogqueue(maybearemoteCPUqueue).),这个函数会先从当前CPU获取一个perCPU机制的softnet_data(每个CPU都有一个softnet_data类型变量,用来管理进出分组的等待队列),通过它获取等待队列的指针之类的,然后将skb挂载到队列当中,然后skb的传递结束,后续的一些处理就不赘述了。将当前设备添加到NAPI轮询队列。2.当CPU等待队列中存在数据包的时候,相应的软中断就会被唤醒,多种方式,最终都会调用do_softirq,它会调
5、用net_rx_action,这个函数会调用poll接口,在默认情况下,这个接口是process_backlog(),它会调用函数_skb_dequeue()直接从当前CPU的接收队列取下头一个包,然后调用__netif_receive_skb(skb)(netif_receive_skb:processreceivebufferfromnetwork。netif_receive_skb()isthemainreceivedataprocessingfunction.)处理获得的数据包,这个函数会调用deliver_skb,里面returnp
6、t_prev->func(skb,skb->dev,pt_prev,orig_dev);如果skb的三层协议类型是IP协议,则pt_prev->func()调用的就是ip_rcv()。3.接下来,就是正式进入到网络层的数据包传输了,ip_rcv(skb)会先查看该数据包是不是发给本机的,如果不是就丢弃,然后查看是不是正常的数据包,如果是,就交给ip_rcv_finish()继续处理(returnNF_HOOK(NFPROTO_IPV4,NF_INET_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish);)Initi
7、alisethevirtualpathcacheforthepacket.ItdescribeshowthepackettravelsinsideLinuxnetworking.ip_rcv_finish()中首先判断skb包中是否设置路由缓存,如果没有设置,调用ip_route_input()来查找路由项,然后调用dst_input()来处理skb包。dst_input()里面只有一句话returnskb_dst(skb)->input(skb);其中skb_dst(skb)是获取skb的路由缓存项,如果数据包是发送到本地,input接口会
8、设置为ip_local_deliver();如果需要转发,则设置的是ip_forward()。下面继续看ip_local_deliver(),ip_local_de
此文档下载收益归作者所有