TCP网络通信流程

778 字
4 分钟
TCP网络通信流程

1. 服务端流程(被动打开)#

服务端的首要目标是“守株待兔”,在后台静静等待客户端的请求。

  • socket():创建一个“电话机”。(在系统中生成一个监听套接字/Listening Socket,状态为 CLOSED)。

  • bind():给这台电话机绑定一个“分机号”(绑定本地 IP 地址和特定的端口号),这样别人才能在网络中准确找到你。

  • listen():手机开机,进入等待接听状态(服务端进入 LISTEN 状态)。这里会设置操作系统的全连接/半连接队列长度,也就是允许的最大排队人数。

  • accept()【核心连接点】:服务端在这里“阻塞”(暂停执行),直到有客户端打进电话。

    • 职责分离(重点):一旦连通,accept() 并不会用原来的“总机电话”和你聊天,而是返回一个新的 Socket(已连接套接字/Connected Socket),专门作为“专属客服”用于和这个特定的客户端收发数据。原来的监听 Socket 继续留在后台等待下一个新连接。

2. 客户端流程(主动打开)#

客户端的目标是“主动出击”,向服务端发起请求。

  • socket():同样创建一个“电话机”(准备通信载体)。

  • connect()【核心连接点】:拨打服务端的“分机号”(指定服务端的 IP 和端口)。

    • 底层机制:调用此函数会触发底层的 TCP 三次握手(客户端发 SYN,服务端回 SYN-ACK,客户端再回 ACK)。只有握手成功,双方状态变为 ESTABLISHED,connect() 和服务端的 accept() 才会顺利返回,连接正式建立。

3. 数据传输与关闭#

  • send() / recv() (或 write() / read()):双方建立连接后,就可以像通过管道一样互相说话和听话了。在底层,你发送的内容会被 TCP 协议切分成数据包,通过滑动窗口和确认机制(ACK)保证数据可靠传输。

  • close():聊天结束,挂断电话。

    • 底层机制:调用 close() 会触发底层的 TCP 四次挥手流程。双方通过互发 FIN 和 ACK 包,宣告自己没有数据要发送了,最终干净地释放网络资源,状态回归 CLOSED。

对比总结表#

阶段服务端 (Server)客户端 (Client)角色类比底层 TCP 动作与状态变化
准备socket()socket()买手机 (准备通信载体)创建文件描述符,状态为 CLOSED
就绪bind()-办手机号 (绑定 IP 和端口)分配本地网络资源
守候listen()-开机等铃响 (开启被动监听)服务端进入 LISTEN 状态
连接accept() (阻塞等待)connect() (发起请求)客户端拨号 vs 服务端接听【TCP三次握手】 双方交换 SYN 和 ACK,最终均进入 ESTABLISHED 状态
通信recv() / send()send() / recv()互相说话与听话数据切片,利用 TCP 机制保证可靠双工传输
结束close()close()聊天结束,挂断电话【TCP四次挥手】 双方发送 FIN 和 ACK,资源释放,回到 CLOSED 状态

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
HandlerOne
おかえり
公告
本站已整理 138 篇技术笔记,并按 8 条主线排成学习路线(141 站);站内搜索与桌宠对话均已上线。
分类
标签
最新动态
站点统计
文章
138
分类
12
标签
42
总字数
597,044
站点信息
构建平台
腾讯云 · Nginx
博客版本
v6.16.8
文章目录