Linux网络编程的API流程【转载】
原文:http://blog.chinaunix.net/uid-23069658-id-3300460.html
Linux网络编程数据收发的API流程分析
只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。在网络编程章节的数据接收过程中,我们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天我们就来看一下这几个API函数到底有什么差别。
BOTTOM-HALF:

当从网卡驱动收到数据包后即进入BOTTOM-HALF阶段,在这里要根据以太帧头部中的类型字段来确定上层承载的具体协议类型,如IP,或ARP、RARP等。IP报文的处理函数通常交付给ip_recv()函数来处理,然后数据进入网络层,具体流程:
在这里我们看到了Netfilter的身影,好久没看到它了,还是有些亲切。大家可以结合这幅图回头再理解一下Netfilter和协议栈的关系。
BOTTOM-HALF最后将收到的skb填充到socket套接字的接收队列里,参见下图。
TOP-HALF:

可以看出,这几个函数的内部最终都统一到了一起:__sock_recvmsg()。
同样的,数据发送也分两个阶段,对照接收的情况,发送数据时肯定也存在一个发送队列,这样想就对了。前面关于发送数据包时我们介绍过的API有write()、send()、sendto()还有一个sendmsg()没介绍到。
TOP-HALF如下:

BOTTOM-HALF如下所示:


完。
浙公网安备 33010602011771号