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至少理解的要比别人深刻些了吧。至于不同函数之间的回调、调用关系是如何搭建的,我们在协议栈分析章节再做进一步讨论。最后来一张全家福:
完。

转载于:https://blog.51cto.com/yehubilee/1069086

揭开网络编程常见API的面纱【下】相关推荐

  1. 线程编程常见API简介(中)

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 在<线程编程常见API简介(上) >中讲述了有关线程创建过程中常用的 API 的使用方法,本节继续讲述有 ...

  2. Linux高性能服务器编程 第5章 Linux网络编程基础API

    5.1 socket 地址 API 现代CPU的累加器一次都能装载(至少)4 字节(这里考虑32位机,下同),即一个整 数.那么这4 字节在内存中排列的顺序将影响它被累加器装载成的整数的值.这就是字节 ...

  3. Linux网络编程常用api

    文章目录 总览 大端小端 大小端检测 大小端转换 socket地址API 通用socket地址 专用socket地址 PF_UNIX专用地址 PF_INET PF_INET6 总结 IP转换函数 例子 ...

  4. 网络编程(51)—— Windows下使用select进行IO复用

    本文主要介绍在Windows系统下使用select搭建回声服务端的方法.在之前的<网络编程(16)-- IO复用技术之select>一文中我们介绍了在Linux使用Select进行IO复用 ...

  5. Linux网络编程基础API

    为何需要半关闭 考虑以下情况: 一旦客户端连接到服务器,服务器将约定的文件传输给客户端,客户端收到后发送字符串「Thank you」给服务器端.   此处「Thank you」的传递是多余的,这只是用 ...

  6. Linux高性能服务器之Linux网络编程基本API(6)

    前言 socket地址API:socket最开始的含义是一个P地址和端口对(ip,port).它唯一地表示了使用TCP通信的一端.本书称其为socket地址. socket基础API:ocket的主要 ...

  7. 线程编程常见API简介(上)

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 本文主要讲述了 Posix 标准的常用线程 API 接口的使用,目前 Linux/Unix 均提供了遵循 Posix ...

  8. Java Socket网络编程常见异常(转)

    1.java.net.SocketTimeoutException 这个异常比较常见,socket超时.一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(Socket ...

  9. linux socket编程web服务器实现报文解析,[Socket][网络编程]程序范例:Linux下连接WEB服务器...

    昨天试着在Ubuntu 下用C语言写了一个客户端,用来向WEB服务器上交请求并取回响应报文. 同时,这也是一个通用的基于IPv4的客户端程序例程. [cpp] /* socket test on li ...

最新文章

  1. [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
  2. 双系统(xp+ubuntu)删除ubuntu(好用)
  3. springMVC的使用
  4. qt web混合编程_QT做界面真是绝美,并且还可嵌入HTML与JS做界面(许多案例)
  5. ExtJS4.2学习(10)分组表格控件--GroupingGrid
  6. restful-api-design-references
  7. php 文件 后缀,php如何修改文件后缀名
  8. 牛津学霸的20条读博建议
  9. SVN—怎么删除 SVN 上已有的URl
  10. (转)金融从业人员的核心竞争力在哪里?
  11. 用友NCCloud 补丁下载/用友ncc 补丁下载/nccloud 补丁下载
  12. 计算机二级机试题型,计算机二级机试题库
  13. 联想服务器如何恢复预装系统,Thinkcentre E73 E63z等预装Win7系统如何恢复出厂系统...
  14. xlsxwriter写入Excel
  15. 搭配-最全的配色方案和色彩搭配
  16. EasyGBS主子码流都为H.265时,切换出现花屏如何解决?
  17. 万字长文读透 Redis
  18. Python 字符串前加r,b,u
  19. 蓝牙追踪_如何使用蓝牙追踪器跟踪您的东西
  20. 1.5.6.六种常见的三角关系

热门文章

  1. php-fpm 的参数,php-fpm启动参数配置详解
  2. python 支持什么操作系统_操作系统1:什么是操作系统?
  3. oracle写转帐的存储过程,Oracle存储过程及块编程基础经典案例
  4. js 判断对象是否是Array
  5. Spring Boot基础学习笔记08:Spring Boot整合Redis
  6. Activity与AppCompatActivity全屏实现方法
  7. java国际化服务器不识别_国际化踩坑记录java.util.MissingResourceException:
  8. bzoj2461 [BeiJing2011]符环 dp
  9. 2017.8.7 序列计数 思考记录
  10. GCC: libgcc的用途以及交叉编译