三张图告诉你Linux TCP/IP协议栈原理

栏目: 服务器 · 发布时间: 5年前

内容简介:可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络。弄懂协议栈的原理,无论对调试网络IO性能还是解决网络问题都是有很大帮助的。本片文章就带领大家来看看内核是如何控制网络数据流的。我们都非常清楚TCP协议设计的初衷,就是保证数据传输的快速,有序,无误。所以特点总结如下:了解完TCP特点字后,我们就来真正的看看数据发送到底是怎样的过程?

可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络。弄懂协议栈的原理,无论对调试网络IO性能还是解决网络问题都是有很大帮助的。本片文章就带领大家来看看内核是如何控制网络数据流的。

TCP特点

我们都非常清楚TCP协议设计的初衷,就是保证数据传输的快速,有序,无误。所以特点总结如下:

  • 面向连接,可以用五元组来表示一条连接(远程ip,远程端口,本地ip,本地端口,传输层协议)。
  • 数据是全双工的
  • 数据是有序的,也就是接受的数据一定是按照发送时的顺序的。
  • 流量控制,发送方可以通过接收方滑动窗口大小来动态调整发送数据的大小。
  • 拥塞控制,发送方通过ACK的状态结合拥塞算法综合计算给出窗口大小。

了解完TCP特点字后,我们就来真正的看看数据发送到底是怎样的过程?

三张图告诉你Linux TCP/IP协议栈原理

数据发送

我们首先来看张图:

三张图告诉你Linux TCP/IP协议栈原理

上图展示的是数据流动的在硬件中的过程,下图展示的是数据在协议栈的过程:

三张图告诉你Linux TCP/IP协议栈原理

整个过程分为三个大区域:用户区,内核区,设备。这里所说的设备就是网卡。流程如下:

  1. 用户应用程序调用write系统调用
  2. 确认文件描述符
  3. 拷贝数据到socket buffer中
  4. 创建tcp片段,计算checksum
  5. 添加IP头,执行ip路由,计算checksum
  6. 添加以太网协议头部,执行ARP
  7. 告诉网卡芯片要发送数据了
  8. 网卡从内存中获取数据发送,发送完成中断告诉CPU

数据接收

直接看硬件数据流图:

三张图告诉你Linux TCP/IP协议栈原理

首先网卡把接收到的数据包写入到它的内存之中。然后对其进行校验,通过后发送到主机的主存之中。主存中的buffer是驱动分配好的,驱动会把分配好的buffer描述告诉网卡,如果没有足够的buffer接受网卡的数据包,网卡会将数据包丢弃。一旦数据包拷贝到主存完成,网卡会通过中断告知主机OS。

之后驱动会检查它是否能处理这个新的包。如果能处理,驱动会把数据包包装成OS认识的结构(linux sk_buffer)并推送到上层。 链路层接收到帧后检查通过的话会按照协议解帧并推送至IP层。

IP层会在解包之后根据包中包含的IP信息决定推送至上层还是转发到其他IP。如果判断需要推送至上层,则会解掉IP包头并推送至TCP层。

TCP在解报之后会根据其四元组找到对应的TCB,之后通过TCP协议处理这个报文。在接收到报文后,会把报文加到接受报文,之后根据TCP的状态发送一个ACK给对端。

当然上述过程会受到NAT等等Netfilter的作用,这里不谈了,也没深研究过。当然为了性能,大牛们方方面面也做了很多努力,比如大到RDMA、DPDK等大的软硬件技术,小到zero-copy、checksum offload等;

总结

现代的软硬件TCP/IP协议栈单链接发送速率到1~2GiB/s完全没有任何问题(经过实测)。如果你想探索更优秀的性能,你可以尝试RMDA等技术,他们通过绕过内核以减少拷贝等方式优化了性能,当然可能依赖硬件。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

构建之法(第三版)

构建之法(第三版)

邹欣 / 人民邮电出版社 / 2017-6 / 69.00元

软件工程牵涉的范围很广, 同时也是一般院校的同学反映比较空洞乏味的课程。 但是,软件工程 的技术对于投身 IT 产业的学生来说是非常重要的。作者有在世界一流软件企业 20 年的一线软件开 发经验,他在数所高校进行了多年的软件工程教学实践,总结出了在 16 周的时间内让同学们通过 “做 中学 (Learning By Doing)” 掌握实用的软件工程技术的教学计划,并得到高校师生的积极反馈。在此 ......一起来看看 《构建之法(第三版)》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具