揭开网络编程常见API的面纱【下】

Linux 网络编程 数据收发的API流程分析
       只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。 在网络编程章节的数据接收过程当中,咱们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天咱们就来看一下这几个API函数到底有什么差异。

数据接收
        在接收数据的过程,主要分两个阶段:BOTTOM-HALF和TOP-HALF。
BOTTOM-HALF:
       当从网卡驱动收到数据包后即进入BOTTOM-HALF阶段,在这里要根据以太帧头部中的类型字段来肯定上层承载的具体协议类型,如IP,或ARP、RARP等。IP报文的处理函数一般交付给ip_recv()函数来处理,而后数据进入网络层,具体流程:
若是该数据包是发给本机的通常调用ip_local_deliver()函数,若是是须要本机转发给出去的,而且本机也开启了转发功能,那么就会调用ip_forward()函数。
在这里咱们看到了Netfilter的身影,很久没看到它了,仍是有些亲切。你们能够结合这幅图回头再理解一下Netfilter和协议栈的关系。
BOTTOM-HALF最后将收到的skb填充到socket套接字的接收队列里,参见下图。
TOP-HALF:
紧承BOTTOM-HALF阶段,该阶段的主要任务就是从接收队列里拿出一个skb而后将其传递到用户空间去,以下:

能够看出,这几个函数的内部最终都统一到了一块儿:__sock_recvmsg()。

        
数据发送
一样的,数据发送也分两个阶段,对照接收的状况,发送数据时确定也存在一个发送队列,这样想就对了。前面关于发送数据包时咱们介绍过的API有write()、send()、sendto()还有一个sendmsg()没介绍到。
TOP-HALF以下:
BOTTOM-HALF以下所示:
通过这么一份探索,咱们对这几个数据收发的API至少理解的要比别人深入些了吧。至于不一样函数之间的回调、调用关系是如何搭建的,咱们在协议栈分析章节再作进一步讨论。最后来一张全家福:
完。
相关文章
相关标签/搜索