PHP Socket 编程基础入门——TCP协议
1 TCP协议的特点
- 面向连接
- 字节流协议
- 全双工
- 可靠的差错控制和流量控制
2 TCP协议的创建
- 客户端主动调用 connect 发送 SYN 分节
- 服务器端必须回复一个 ACK 分节来确认客户端 SYN 分节,并发送一个 SYN 分节到客户端
- 客户端对服务器端发送的 SYN 分节进行 ACK 确认
- TCP三次握手示意图
至此,成功建立 TCP 连接,用于接下来的数据传输
3 TCP协议的拆除
因为 TCP 为全双工的传输协议,所以拆除连接的时候,需要四次分节的交换
- 首先申请拆除的一端调用 close 发送一个 FIN 分节
- 另一端接收到 FIN 分节时,发送一个 ACK 分节进行确认
- 同理,另一端要申请拆除连接时,也要发送一个 FIN 分节
- 接收端发送 ACK 分节进行确认
至此,成功拆除 TCP 连接、TCP四次握手示意图
上图展示了客户端主动发送关闭的流程,事实上服务器也是可以执行主动关闭的。
4 TCP的状态转换图
- SYN_SENT 主动打开,SYN 分节已发送
- SYN_RCVD 被动打开,SYN 分节已接收
- ESTABLISHED 已经建立连接
- FIN_WAIT_1 发起主动关闭,FIN 分节已发送
- CLOSE_WAIT 被动关闭, FIN 分节已接收,ACK 分节已发送
- FIN_WAIT_2 成功实现半关闭,ACK 分节已接收
- LAST_ACK 最终的 ACK, FIN 分节已发送
- TIME_WAIT FIN 分节已接收, ACK 分节已发送
- CLOSED ACK 分节已接收,成功拆除连接
本章介绍了 TCP 协议的建立、拆除和状态转换,TCP 协议是 SOCKET 编程最常用的传输协议,是 HTTP、FTP 协议的基石,所以理解好 TCP 协议是非常有必要的。
任务
使用netstat
命令观察TCP的状态