Linux中一个网络包的发送/接收流程

💡 原文中文,约4900字,阅读约需12分钟。
📝

内容提要

本文介绍了Linux中网络包的协议头封装与解析过程,以及粘包拆包现象的原因。文章详细解析了sk_buff数据结构和发送窗口、接收窗口的工作原理。此外,还比较了不同的网络包发送函数的拷贝次数。

🎯

关键要点

  • 本文介绍了Linux中网络包的协议头封装与解析过程。
  • 粘包拆包现象的原因与网络包的缓冲区和拷贝过程有关。
  • TCP的滑动窗口和拥塞窗口是网络通信中的重要概念。
  • 用户态进程通过write()系统调用将HTTP报文数据写入套接字缓冲区。
  • 每个套接字对应一个发送和接收缓冲区队列,可以通过ss -nt命令查看状态。
  • sk_buff数据结构是Linux实现网络协议栈的核心,包含不同协议头的指针。
  • 发送网络包时,每经过一层协议都会增加对应的协议首部。
  • 网络包的大小计算包括预留头、MAC头、IP头、TCP头和有效负载。
  • 如果发送缓冲区存在积压,Linux会尝试将当前包合并到最后一个sk_buff结构中。
  • 发送窗口和接收窗口的大小由SO_SENDBUF和用户进程的读取行为决定。
  • 网卡驱动层负责管理网络包的接收和发送,使用RingBuffer队列。
  • 不同的网络包发送函数在拷贝次数上存在差异,影响性能。
  • sendFile系统调用减少了拷贝次数,适合大文件传输。
  • mmap + write适用于小文件的传输,避免频繁的内存拷贝。
🏷️

标签

➡️

继续阅读