揭开网络编程常见API的面纱【下】
2016-07-24 10:58
513 查看
Linux网络编程数据收发的API流程分析 只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。在网络编程章节的数据接收过程中,我们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天我们就来看一下这几个API函数到底有什么差别。
数据接收 在接收数据的过程,主要分两个阶段:BOTTOM-HALF和TOP-HALF。 BOTTOM-HALF:
![](/attachment/201208/3/23069658_1344005514lM97.jpg)
当从网卡驱动收到数据包后即进入BOTTOM-HALF阶段,在这里要根据以太帧头部中的类型字段来确定上层承载的具体协议类型,如IP,或ARP、RARP等。IP报文的处理函数通常交付给ip_recv()函数来处理,然后数据进入网络层,具体流程: 如果该数据包是发给本机的一般调用ip_local_deliver()函数,如果是需要本机转发给出去的,并且本机也开启了转发功能,那么就会调用ip_forward()函数。 在这里我们看到了Netfilter的身影,好久没看到它了,还是有些亲切。大家可以结合这幅图回头再理解一下Netfilter和协议栈的关系。 BOTTOM-HALF最后将收到的skb填充到socket套接字的接收队列里,参见下图。 TOP-HALF: 紧承BOTTOM-HALF阶段,该阶段的主要任务就是从接收队列里拿出一个skb然后将其传递到用户空间去,如下:
![](/attachment/201208/3/23069658_1344005520RD47.jpg)
可以看出,这几个函数的内部最终都统一到了一起:__sock_recvmsg()。
数据发送 同样的,数据发送也分两个阶段,对照接收的情况,发送数据时肯定也存在一个发送队列,这样想就对了。前面关于发送数据包时我们介绍过的API有write()、send()、sendto()还有一个sendmsg()没介绍到。 TOP-HALF如下:
![](/attachment/201208/3/23069658_13440055257uNe.jpg)
BOTTOM-HALF如下所示:
![](/attachment/201208/3/23069658_1344005532BaaL.jpg)
经过这么一份探索,我们对这几个数据收发的API至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。最后来一张全家福:
![](/attachment/201208/3/23069658_134400554217ZM.jpg)
完。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(5300) | 评论(7) | 转发(40) |
2
上一篇:揭开网络编程常见API的面纱【上】
下一篇:如何看待操作系统的用户空间和内核空间?
相关热门文章
2016年Web设计10大趋势
Linux网络编程:原始套接字的...
Linux网络编程之使用TCP传输文...
java笔记
同步,异步,阻塞和非阻塞的理...
linux 常见服务端口
xmanager 2.0 for linux配置
【ROOTFS搭建】busybox的httpd...
openwrt中luci学习笔记
什么是shell
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
![](http://passport.ixpub.net/data/avatar/030/82/05/07_avatar_small.jpg)
kangkangrun2016-03-01 15:29:37
牛人
回复 | 举报
![](http://passport.ixpub.net/data/avatar/030/30/97/74_avatar_small.jpg)
月是夜的明2015-11-05 15:20:28
楼主好:最后您的文章写到“经过这么一份探索,我们对这几个数据收发的API至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。”
我想知道协议族的章节在哪里呢?
好像在你的博客木有看到哈
写的很清楚,很明白,谢谢分享,向您学习。
回复 | 举报
![](http://passport.ixpub.net/data/avatar/030/06/92/24_avatar_small.jpg)
aihouhen2014-12-17 23:26:45
niu tie
回复 | 举报
![](http://passport.ixpub.net/data/avatar/029/65/05/65_avatar_small.jpg)
uahorngt2014-05-11 14:00:35
<div>分享了,学习中,希望有所帮助,谢谢。。</div><div>隆达木业,创造绿色新生活</div><div><span style="color:#0000ff;"><strong>Longda Wooden manufacture corporation limited </strong></span><a href="http://www.longda-wood.com/"><strong>www.longda-wood.com</strong></a></div><div>Our factory Longda Wood Co., Ltd is located in Fujian Provinces, where produces poplar and hardwood, and&n
回复 | 举报
![](http://passport.ixpub.net/data/avatar/029/64/37/01_avatar_small.jpg)
yunwu7532014-05-10 21:33:44
感谢博主分享
回复 | 举报
首页
上一页
1
2
下一页
末页
评论热议
数据接收 在接收数据的过程,主要分两个阶段:BOTTOM-HALF和TOP-HALF。 BOTTOM-HALF:
![](/attachment/201208/3/23069658_1344005514lM97.jpg)
当从网卡驱动收到数据包后即进入BOTTOM-HALF阶段,在这里要根据以太帧头部中的类型字段来确定上层承载的具体协议类型,如IP,或ARP、RARP等。IP报文的处理函数通常交付给ip_recv()函数来处理,然后数据进入网络层,具体流程: 如果该数据包是发给本机的一般调用ip_local_deliver()函数,如果是需要本机转发给出去的,并且本机也开启了转发功能,那么就会调用ip_forward()函数。 在这里我们看到了Netfilter的身影,好久没看到它了,还是有些亲切。大家可以结合这幅图回头再理解一下Netfilter和协议栈的关系。 BOTTOM-HALF最后将收到的skb填充到socket套接字的接收队列里,参见下图。 TOP-HALF: 紧承BOTTOM-HALF阶段,该阶段的主要任务就是从接收队列里拿出一个skb然后将其传递到用户空间去,如下:
![](/attachment/201208/3/23069658_1344005520RD47.jpg)
可以看出,这几个函数的内部最终都统一到了一起:__sock_recvmsg()。
数据发送 同样的,数据发送也分两个阶段,对照接收的情况,发送数据时肯定也存在一个发送队列,这样想就对了。前面关于发送数据包时我们介绍过的API有write()、send()、sendto()还有一个sendmsg()没介绍到。 TOP-HALF如下:
![](/attachment/201208/3/23069658_13440055257uNe.jpg)
BOTTOM-HALF如下所示:
![](/attachment/201208/3/23069658_1344005532BaaL.jpg)
经过这么一份探索,我们对这几个数据收发的API至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。最后来一张全家福:
![](/attachment/201208/3/23069658_134400554217ZM.jpg)
完。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(5300) | 评论(7) | 转发(40) |
2
上一篇:揭开网络编程常见API的面纱【上】
下一篇:如何看待操作系统的用户空间和内核空间?
相关热门文章
2016年Web设计10大趋势
Linux网络编程:原始套接字的...
Linux网络编程之使用TCP传输文...
java笔记
同步,异步,阻塞和非阻塞的理...
linux 常见服务端口
xmanager 2.0 for linux配置
【ROOTFS搭建】busybox的httpd...
openwrt中luci学习笔记
什么是shell
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
![](http://passport.ixpub.net/data/avatar/030/82/05/07_avatar_small.jpg)
kangkangrun2016-03-01 15:29:37
牛人
回复 | 举报
![](http://passport.ixpub.net/data/avatar/030/30/97/74_avatar_small.jpg)
月是夜的明2015-11-05 15:20:28
楼主好:最后您的文章写到“经过这么一份探索,我们对这几个数据收发的API至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。”
我想知道协议族的章节在哪里呢?
好像在你的博客木有看到哈
写的很清楚,很明白,谢谢分享,向您学习。
回复 | 举报
![](http://passport.ixpub.net/data/avatar/030/06/92/24_avatar_small.jpg)
aihouhen2014-12-17 23:26:45
niu tie
回复 | 举报
![](http://passport.ixpub.net/data/avatar/029/65/05/65_avatar_small.jpg)
uahorngt2014-05-11 14:00:35
<div>分享了,学习中,希望有所帮助,谢谢。。</div><div>隆达木业,创造绿色新生活</div><div><span style="color:#0000ff;"><strong>Longda Wooden manufacture corporation limited </strong></span><a href="http://www.longda-wood.com/"><strong>www.longda-wood.com</strong></a></div><div>Our factory Longda Wood Co., Ltd is located in Fujian Provinces, where produces poplar and hardwood, and&n
回复 | 举报
![](http://passport.ixpub.net/data/avatar/029/64/37/01_avatar_small.jpg)
yunwu7532014-05-10 21:33:44
感谢博主分享
回复 | 举报
首页
上一页
1
2
下一页
末页
评论热议
相关文章推荐
- 揭开网络编程常见API的面纱【上】
- Linux网络编程:原始套接字的魔力【续】
- Linux网络编程:原始套接字的魔力【下】
- Linux网络编程:原始套接字的魔力【上】
- Linux网络编程:基于UDP的程序开发回顾篇
- Linux网络编程:基于TCP的程序开发回顾篇
- Linux环境下网络编程杂谈
- (十)洞悉linux下的Netfilter&iptables:网络地址转换原理之SNAT
- (九)洞悉linux下的Netfilter&iptables:网络地址转换原理之DNAT
- Linux 网络协议栈纲要
- linux内核ipv4网络部分分层结构及涉入源文件
- linux 内核网络,数据接收流程图
- (五)httpd-2.4的编译安装(编译安装amp并且给php配置xcache机制)
- (四)httpd与php-fpm(rpm)的整合以及php缓存加速模块xcache的安装
- (三)lamp(httpd+php(php为module或是FastCGI)+mysql)centos6(rpm包)
- 基于人工神经网络的五子棋博弈(Details)
- (二)apache之httpd-2.4新特性
- (一)apache(主要是httpd-2.2)的基础配置篇
- TCP零窗口更新与超时重传联合优化的packetdrill确认
- 计算机网络学习笔记