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()才会顺利返回,连接正式建立。
- 底层机制:调用此函数会触发底层的 TCP 三次握手(客户端发
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 状态 |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
UDP协议与网络通信知识点
Linux 网络UDP(用户数据报协议)的传输过程类似于寄信,具有以下四大核心特征:
2
TCP序列化与反序列化网络计算器
Linux 网络首先编写通用的工具类,这些类不依赖于网络逻辑,但会被后续所有模块使用。
3
网络基础
Linux 网络独立模式:早期计算机相互独立,数据无法共享。用户需在特定终端上操作,导致资源利用率低和协作困难(如例子中小松、小竹、小梅需等待特定终端)。
4
网络常用接口
Linux 网络核心作用:将一个 16位 整数从 主机字节序 转换为 网络字节序(大端)。
5
TCP(传输控制协议)
Linux 网络应用层:负责应用程序的网络访问(如 DNS, HTTP, FTP, 序列化/反序列化)。
随机文章随机推荐

