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适用于小文件的传输,避免频繁的内存拷贝。
🏷️
标签
➡️