TCP三次握手 四次挥手以及状态集转换
三次握手
- 第一次握手:
发送请求链接控制字段syn,请求建立连接 (客户端 ---- 服务端)
根据数据包编号发送数据 seq=x - 第二次握手:
发送确认控制字段ack和请求连接控制字段syn (服务端 ---- 客户端)
根据数据包编号进行确认 ack=x+1
根据数据包编号发送数据 seq=y - 第三次握手:
发送确认控制字段ack (客户端 ---- 服务端)
根据数据包编号进行确认 ack=y+1
根据数据包编号发送数据 seq=x+1
控制字段
对网络通讯有控制管理作用 0-关闭 1-开启
- syn:请求建立连接控制字段
- fin :请求断开连接控制字段
- ack:传输数据确认控制字段
***:传输数据编号,便于重组数据
确认号:确认下一次发送数据包编号
状态集转换(五种)
①closed ②listen ③syn_sent ④syn_rcvd ⑤established
客户端初始状态:closed
服务端初始状态:closed ----> listen
- 第一次握手:发送syn信息 客户端 ---- 服务端
客户端状态:closed ----> syn_sent - 第二次握手:发送syn ack信息 服务端 ---- 客户端
服务端状态:listen ----> syn_rcvd - 第三次握手:发送ack信息 客户端 ---- 服务端
客户端状态:syn_sent ----> established
服务端状态:syn_rcvd ----> established
四次挥手
- 第一次挥手
发送请求断开控制字符fin和确认控制字段 (客户端 ---- 服务端) - 第二次挥手
发送确认控制字段ack (服务端 — 客户端) - 第三次挥手
发送请求断开控制字段fin和确认控制字段 (服务端 ---- 客户端) - 第四次挥手
发送确认控制字段 (客户端 ---- 服务端)
状态集转换(六种)
①fin_wait1 ②clsoe_wait ③fin_wait2 ④last_ack ⑤time_wait ⑥closing
客户端初始状态:established
服务端初始状态:established
正常情况:
- 第一次挥手: 发送fin ack信息 客户端 — 服务端
客户端状态:established —> fin_wait1 - 第二次挥手:发送ack信息 服务端 — 客户端
服务端状态:established —> close_wait
客户端状态:fin_wait1 —> fin_wait2 - 第三次挥手:发送fin ack信息 服务端 — 客户端
服务端状态:close_wait —> last_ack - 第四次挥手:发送ack信息 客户端 — 服务端
客户端状态:fin_wait2 —> time_wait —> closed
服务端状态:last_ack —> closed
特殊情况:
- 第一次挥手: 发送fin ack信息 客户端 — 服务端
客户端状态:established —> fin_wait1 - 第二次挥手:发送fin ack信息 服务端 — 客户端
客户端状态:fin_wait1 —> closing
服务端状态:close_wait —> last_ack - 第三次挥手:发送ack信息 客户端 — 服务端
客户端状态:closing —> time_wait —> closed
服务端状态:last_ack —> closed
为什么挥手是四次,握手是三次?
挥手时,需要有数据传输确认阶段
有没有可能时三次挥手
有可能,省略第二次