Socket
本文最后更新于 2025年8月30日 凌晨
socket
创建socket
int socket(int domain, int type , int protocol)
- domain : 表示使用的协议族
- AF_UNIX , AF_LOCAL 本地通信
- AF_INET IPv4协议族
- AF_INET6 IPv6协议族
- type :
- SOCK_STREAM → 基于连接的服务
- SOCK_DGRAM → 基于数据包的服务
- SOCK_RAW → 裸连接,使用IP 发送
- protocol
- UDP
- 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+ACKSYN_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:服务端收到客户端的ACKSYN_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:双方同时发送FINFIN_WAIT_1 → CLOSING:收到对方FIN,发送ACKCLOSING → TIME_WAIT:收到对方ACKTIME_WAIT → CLOSED:等待超时
异常情况处理
14. 连接建立过程中的RST
- 任何状态收到RST →
CLOSED
15. 同时打开时的特殊转换
FIN_WAIT_1 → TIME_WAIT:同时关闭时直接收到FIN+ACK
16. 监听状态的关闭
LISTEN → CLOSED:服务端停止监听
完整的状态转换总结
连接建立路径:
- 正常客户端-服务端 :
CLOSED → SYN_SENT → ESTABLISHED(客户端) - 正常服务端 :
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED(服务端) - 同时打开 :
CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED(双方)
连接关闭路径:
- 正常关闭 :
ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED(主动关闭方) - 正常关闭 :
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED(被动关闭方) - 同时关闭 :
ESTABLISHED → FIN_WAIT_1 → CLOSING → TIME_WAIT → CLOSED(双方)
这样的描述涵盖了TCP协议中所有重要的状态转换场景,包括正常情况、同时打开、同时关闭等特殊情况。
异常断开
当 服务端出现异常后,服务端释放了用于提供该服务的监听端口,所以当客户端发送请求后,服务端会响应RST 消息给客户端,客户端关闭连接。
当 客户端出现异常后
- 进程崩溃但主机正常:
- 客户端进程崩溃,内核清理socket
- 服务端发送数据 → 客户端内核发送RST
- 服务端收到RST,立即关闭连接
- 主机断网/关机:
- 客户端主机失联
- 服务端发送数据 → 无响应 → TCP重传机制启动
- 重传达到上限 → 服务端超时关闭连接
- 客户端重启:
- 客户端重启,使用新端口建立新连接
- 与之前的连接无关(新的四元组)
Socket
http://gadoid.io/2025/08/30/Socket/