首页
Linux教程
Linux资讯
Linux入门
Linux运维
Linux系统
Linux服务器
Linux安全
Linux问答
SHELL
树莓派
正则
linux命令
安装
Linux监控
运维自动化
Ansible
Piwik
CentOS
Deepin
Ubuntu
Debian
FreeBSD
Nginx
Apache
openresty
Tengine
宝塔
SSH
页面位置:
Linuxboy
>
Linux教程
>
正文
网络编程
Linux网络编程的API流程【转载】,linux网络编程api
文章由LinuxBoy分享于2019-04-03 10:04:02
热评(46)
Linux网络编程的API流程【转载】,linux网络编程api
原文:http://blog.chinaunix.net/uid-23069658-id-3300460.html
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至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。最后来一张全家福:
完。
相关内容
【UNIX网络编程】TCP客户/服务器程序示例,unix网络编程
【UNIX网络编程】配置unp.h和apueerror.h,unp.hapueerror.h
《Unix网络编程》卷2 读书笔记 第2章- Posix IPC,posixipc
网络编程之Socket新解
Linux网络编程
套接字网络编程笔记
网络编程常用接口的内核实现----sys_socket()
C语言网络编程之--字节顺序
网络编程常用接口的内核实现----sys_listen()
网络编程常用接口的内核实现----sys_bind()
今日最新
推荐文章:
【Linux网络编程】使用GDB调试程序,网络编程
Linux网络编程--洪水攻击详解,linux网络编程
【LINUX网络编程】Makefile文件,网络编程make
Linux网络编程--进程间通信(一),linux网络编
【UNIX网络编程】TCP客户/服务器程序示例,
【UNIX网络编程】配置unp.h和apueerror.h,unp.ha
评论暂时关闭
最新Linux教程教程
Linux网络编程的API流程【转载】
linux popen 获取 ip test ok,pope
Build your own linino system 编译你自
Linux基础之-Bash命令优先级,li
【CNMP系列】VIM编辑器详解,cn
蝼蚁的觅食之路 之 LAMP快速安装
Linux头条
Linux防火墙Iptables学习笔记
Ubuntu 12.04 LTS下安装Matlab
tar备份时不显示目录结构
负载均衡之LVS-NAT LVS-DR模型详解
常见数据库容灾技术的直观比较
Ubuntu 11.10下安装Chrome浏览器
评论暂时关闭