TCP三次握手 四次挥手以及状态集转换

三次握手

  • 第一次握手:
    发送请求链接控制字段syn,请求建立连接 (客户端 ---- 服务端)
    根据数据包编号发送数据 seq=x
  • 第二次握手:
    发送确认控制字段ack和请求连接控制字段syn (服务端 ---- 客户端)
    根据数据包编号进行确认 ack=x+1
    根据数据包编号发送数据 seq=y
  • 第三次握手:
    发送确认控制字段ack (客户端 ---- 服务端)
    根据数据包编号进行确认 ack=y+1
    根据数据包编号发送数据 seq=x+1

TCP三次握手 四次挥手以及状态集转换TCP三次握手 四次挥手以及状态集转换

控制字段

对网络通讯有控制管理作用 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

TCP三次握手 四次挥手以及状态集转换

四次挥手

  • 第一次挥手
    发送请求断开控制字符fin和确认控制字段 (客户端 ---- 服务端)
  • 第二次挥手
    发送确认控制字段ack (服务端 — 客户端)
  • 第三次挥手
    发送请求断开控制字段fin和确认控制字段 (服务端 ---- 客户端)
  • 第四次挥手
    发送确认控制字段 (客户端 ---- 服务端)
    TCP三次握手 四次挥手以及状态集转换TCP三次握手 四次挥手以及状态集转换

状态集转换(六种)

①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
    TCP三次握手 四次挥手以及状态集转换

特殊情况:

  • 第一次挥手: 发送fin ack信息 客户端 — 服务端
    客户端状态:established —> fin_wait1
  • 第二次挥手:发送fin ack信息 服务端 — 客户端
    客户端状态:fin_wait1 —> closing
    服务端状态:close_wait —> last_ack
  • 第三次挥手:发送ack信息 客户端 — 服务端
    客户端状态:closing —> time_wait —> closed
    服务端状态:last_ack —> closed

TCP三次握手 四次挥手以及状态集转换

为什么挥手是四次,握手是三次?

挥手时,需要有数据传输确认阶段

有没有可能时三次挥手

有可能,省略第二次
TCP三次握手 四次挥手以及状态集转换