PHP Socket 编程基础入门——TCP协议

1 TCP协议的特点

  • 面向连接
  • 字节流协议
  • 全双工
  • 可靠的差错控制和流量控制

2 TCP协议的创建

  • 客户端主动调用 connect 发送 SYN 分节
  • 服务器端必须回复一个 ACK 分节来确认客户端 SYN 分节,并发送一个 SYN 分节到客户端
  • 客户端对服务器端发送的 SYN 分节进行 ACK 确认
  • TCP三次握手示意图
    PHP Socket 编程基础入门——TCP协议

至此,成功建立 TCP 连接,用于接下来的数据传输

3 TCP协议的拆除

因为 TCP 为全双工的传输协议,所以拆除连接的时候,需要四次分节的交换

  • 首先申请拆除的一端调用 close 发送一个 FIN 分节
  • 另一端接收到 FIN 分节时,发送一个 ACK 分节进行确认
  • 同理,另一端要申请拆除连接时,也要发送一个 FIN 分节
  • 接收端发送 ACK 分节进行确认
    至此,成功拆除 TCP 连接、TCP四次握手示意图
    PHP Socket 编程基础入门——TCP协议

上图展示了客户端主动发送关闭的流程,事实上服务器也是可以执行主动关闭的。

4 TCP的状态转换图

PHP Socket 编程基础入门——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的状态