news 2026/6/15 14:55:56

揭秘 Socket 缓冲区与数据封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘 Socket 缓冲区与数据封装

一、 两个“替身”:监听与通信描述符的内核差异

虽然lfd(监听) 和cfd(通信) 都是文件描述符,它们在内核里对应的缓冲区功能却大相径庭。

1. 监听描述符 (Listening FD)

  • 读缓冲区用来存“人”的。当有客户端发起连接(完成三次握手)时,内核会把这个连接请求放进读缓冲区队列里。
    • accept()的本质,就是从这个读缓冲区里取出一个连接请求。
    • 如果读缓冲区为空,accept()就会阻塞(发呆)。
  • 写缓冲区基本不用。内核主要用它来自动回复三次握手中的握手包,应用层不需要关心。

2. 通信描述符 (Communication FD)

  • 读缓冲区用来存“信”的。对方发来的数据(如 “Hello”)会先存在这里。
    • read()的本质,就是从这个读缓冲区里把数据拷贝到你的程序变量里。
  • 写缓冲区用来存“草稿”的
    • write()的本质,就是把你的数据拷贝到这个写缓冲区里。只要拷贝完成,write()就返回成功,此时数据可能还在本机,并没有发出去!

二、 数据的“奇幻漂流”:Write 与 Read 的真相

很多初学者认为write就是直接把数据发给对方,这是错的。

真实流程

  1. 发送方调用write(fd, "hello")
  2. 数据从用户空间拷贝到内核写缓冲区
  3. write函数返回(任务结束)。
  4. 操作系统内核在后台悄悄地把写缓冲区的数据打包,通过网卡发出去。
  5. 数据经过互联网到达接收方的网卡。
  6. 接收方内核把数据拆包,放入内核读缓冲区
  7. 接收方调用read(fd, buf),数据从内核读缓冲区拷贝到用户空间。

结论:程序员其实是在操作“缓冲区”,而不是直接操作“网络”。


三、 数据的“穿衣与脱衣”:封装与解封装

数据在网络上传输,就像寄快递,需要一层层打包。

  1. 应用层(你写的代码):只有核心数据"Hello"
  2. 传输层(TCP/UDP):加上TCP头(源端口、目的端口等)。
  3. 网络层(IP):加上IP头(源IP、目的IP等)。
  4. 链路层(以太网):加上帧头/帧尾(MAC地址)。

当数据到达目的地后,会进行反向的解封装(脱衣),最后你的read()函数读到的,又是最纯净的"Hello"。这一过程完全由系统自动完成。


四、 代码实战:验证缓冲区的存在

为了证明write只是把数据写进缓冲区(而不是等对方收到才返回),我们设计一个实验:

  • 服务器:故意偷懒,连上后睡 5 秒再读数据。
  • 客户端:连上后立刻发送数据。

预测:如果write是直连对方的,客户端应该会卡住 5 秒。如果write只是写缓冲区,客户端应该立刻打印发送成功,尽管服务器还没读。

1. 慢吞吞的服务器 (slow_server.c)

#include<stdio.h>#include<unistd.h>#include
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:44:06

GB/T 7714-2015终极配置指南:Zotero学术写作效率革命

GB/T 7714-2015终极配置指南&#xff1a;Zotero学术写作效率革命 【免费下载链接】Chinese-STD-GB-T-7714-related-csl GB/T 7714相关的csl以及Zotero使用技巧及教程。 项目地址: https://gitcode.com/gh_mirrors/chi/Chinese-STD-GB-T-7714-related-csl 在学术写作的漫…

作者头像 李华
网站建设 2026/6/15 14:36:35

明日方舟游戏资源解析:5大技术维度深度揭秘

明日方舟游戏资源解析&#xff1a;5大技术维度深度揭秘 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 在数字内容创作蓬勃发展的今天&#xff0c;如何高效获取高质量的游戏素材成为创…

作者头像 李华
网站建设 2026/6/15 7:38:39

Pikafish中国象棋引擎:从入门到精通的终极指南

Pikafish中国象棋引擎&#xff1a;从入门到精通的终极指南 【免费下载链接】Pikafish official-pikafish/Pikafish: Pikafish 是一个自由且强大的 UCI&#xff08;通用棋类接口&#xff09;象棋引擎&#xff0c;源自 Stockfish&#xff0c;用于分析象棋&#xff08;国际象棋&am…

作者头像 李华
网站建设 2026/6/14 22:27:01

MegSpot终极指南:从新手到专家的快速上手攻略

MegSpot终极指南&#xff1a;从新手到专家的快速上手攻略 【免费下载链接】MegSpot MegSpot是一款高效、专业、跨平台的图片&视频对比应用 项目地址: https://gitcode.com/gh_mirrors/me/MegSpot 还在为图片视频对比烦恼吗&#xff1f;&#x1f914; 面对多张图片或…

作者头像 李华
网站建设 2026/6/13 23:58:17

Context7 MCP部署实战指南:3分钟搞定智能代码助手配置

Context7 MCP部署实战指南&#xff1a;3分钟搞定智能代码助手配置 【免费下载链接】context7-mcp Context7 MCP Server 项目地址: https://gitcode.com/gh_mirrors/co/context7-mcp 还在为AI生成的代码示例过时而烦恼吗&#xff1f;Context7 MCP部署能让你在3分钟内拥有…

作者头像 李华
网站建设 2026/6/15 12:15:20

AI万能分类器实战:社交媒体内容分类系统搭建

AI万能分类器实战&#xff1a;社交媒体内容分类系统搭建 1. 引言&#xff1a;AI 万能分类器的时代来临 在社交媒体、用户反馈、客服工单等场景中&#xff0c;海量文本数据的自动归类需求日益增长。传统文本分类方法依赖大量标注数据和模型训练周期&#xff0c;难以快速响应业…

作者头像 李华