Socket

本文最后更新于 2025年8月30日 凌晨

socket

创建socket

int socket(int domain, int type , int protocol)

  1. domain : 表示使用的协议族
    1. AF_UNIX , AF_LOCAL 本地通信
    2. AF_INET IPv4协议族
    3. AF_INET6 IPv6协议族
  2. type :
    1. SOCK_STREAM → 基于连接的服务
    2. SOCK_DGRAM → 基于数据包的服务
    3. SOCK_RAW → 裸连接,使用IP 发送
  3. protocol
    1. UDP
    2. TCP

创建成功后返回一个文件描述符

数据收发过程

数据收发过程

TCP状态机处理过程

TCP状态机处理过程

第一阶段:连接初始化

1. 作为服务端TCP启动(passive open)

  • CLOSED → LISTEN
  • 服务端调用listen()系统调用,开始监听指定端口

2. 作为客户端TCP启动(active open)

  • CLOSED → SYN_SENT
  • 客户端调用connect(),发送SYN报文

第二阶段:SYN交换阶段

3. 接收SYN报文的状态转换

情况A - 同时打开(Simultaneous Open):

  • LISTEN → SYN_RCVD:监听状态收到SYN,发送SYN+ACK
  • SYN_SENT → SYN_RCVD:客户端收到对方的SYN(而非SYN+ACK),发送SYN+ACK

情况B - 正常服务端响应:

  • LISTEN → SYN_RCVD:服务端收到客户端SYN,发送SYN+ACK

第三阶段:连接建立完成

4. 接收ACK/SYN+ACK的状态转换

情况A - 同时打开完成:

  • SYN_RCVD → ESTABLISHED:收到对方的ACK确认
  • 双方都从SYN_RCVD进入ESTABLISHED

情况B - 正常三次握手完成:

  • SYN_RCVD → ESTABLISHED:服务端收到客户端的ACK
  • SYN_SENT → ESTABLISHED:客户端收到服务端的SYN+ACK,发送ACK

第四阶段:数据传输

5. 连接建立完成

  • ESTABLISHED:双方可以进行数据传输

第五阶段:连接关闭(四次挥手)

6. 主动关闭方发起关闭

  • ESTABLISHED → FIN_WAIT_1:主动关闭方发送FIN

7. 被动关闭方响应

  • ESTABLISHED → CLOSE_WAIT:被动关闭方收到FIN,发送ACK

8. 主动关闭方收到ACK

  • FIN_WAIT_1 → FIN_WAIT_2:收到对方ACK,等待对方FIN

9. 被动关闭方发送FIN

  • CLOSE_WAIT → LAST_ACK:被动关闭方发送FIN

10. 主动关闭方收到FIN

  • FIN_WAIT_2 → TIME_WAIT:收到对方FIN,发送ACK

11. 被动关闭方收到最后ACK

  • LAST_ACK → CLOSED:收到ACK,连接关闭

12. 主动关闭方等待超时

  • TIME_WAIT → CLOSED:等待2MSL时间后关闭

特殊情况:同时关闭

13. 双方同时发送FIN

  • ESTABLISHED → FIN_WAIT_1:双方同时发送FIN
  • FIN_WAIT_1 → CLOSING:收到对方FIN,发送ACK
  • CLOSING → TIME_WAIT:收到对方ACK
  • TIME_WAIT → CLOSED:等待超时

异常情况处理

14. 连接建立过程中的RST

  • 任何状态收到RST → CLOSED

15. 同时打开时的特殊转换

  • FIN_WAIT_1 → TIME_WAIT:同时关闭时直接收到FIN+ACK

16. 监听状态的关闭

  • LISTEN → CLOSED:服务端停止监听

完整的状态转换总结

连接建立路径:

  1. 正常客户端-服务端CLOSED → SYN_SENT → ESTABLISHED (客户端)
  2. 正常服务端CLOSED → LISTEN → SYN_RCVD → ESTABLISHED (服务端)
  3. 同时打开CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED (双方)

连接关闭路径:

  1. 正常关闭ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED (主动关闭方)
  2. 正常关闭ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED (被动关闭方)
  3. 同时关闭ESTABLISHED → FIN_WAIT_1 → CLOSING → TIME_WAIT → CLOSED (双方)

这样的描述涵盖了TCP协议中所有重要的状态转换场景,包括正常情况、同时打开、同时关闭等特殊情况。

异常断开

当 服务端出现异常后,服务端释放了用于提供该服务的监听端口,所以当客户端发送请求后,服务端会响应RST 消息给客户端,客户端关闭连接。

当 客户端出现异常后

  • 进程崩溃但主机正常:
  1. 客户端进程崩溃,内核清理socket
  2. 服务端发送数据 → 客户端内核发送RST
  3. 服务端收到RST,立即关闭连接
  • 主机断网/关机:
  1. 客户端主机失联
  2. 服务端发送数据 → 无响应 → TCP重传机制启动
  3. 重传达到上限 → 服务端超时关闭连接
  • 客户端重启:
  1. 客户端重启,使用新端口建立新连接
  2. 与之前的连接无关(新的四元组)

Socket
http://gadoid.io/2025/08/30/Socket/
作者
Codfish
发布于
2025年8月30日
许可协议