TCP/IP四次挥手

TCP/IP四次挥手流程图:

图片.png

名词解释:
FIN(finish)结束

TCP状态解释:
ESTABLISHED (表示TCP连接已经成功建立)
FIN_WAIT_1 (结束等待1:表示客户端已向服务端发送了FIN连接释放报文段)
FIN_WAIT_2 (结束等待2:表示客户端已收到服务端的ACK确认报文段)
CLOSE-WAIT (关闭等待:表示服务端已向客户端发送ACK确认报文段,正在确认是否还有数据向客户端发送)
LAST-ACK   (最后确认:表示服务端已向客户端发送FIN连接释放报文段)
TIME-WAIT  (时间等待:表示客户端已向服务端发送ACK确认报文段,正在等待2MSL时间)
CLOSED (表示连接已关闭)

其他解释:
MSL (Maximum Segment Lifetime)(报文最大生存时间)
2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当客户端发起主动关闭,在客户端发出最后一个ACK确认报文段后,即第3次挥手完成后发送了第四次挥手的ACK确认报文段后,客户端就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕客户端的最后一个ACK确认报文段服务端没收到,那么服务端没收到客户端ACK确认报文段后将重发第三次挥手的FIN连接释放报文段,客户端接到服务端重发的FIN连接释放报文段后可以再发一个ACK确认报文段。如果直到2MSL结束,客户端都没有再次收到服务端的FIN连接释放报文段,那么客户端推断ACK已经被成功接收,则结束TCP连接。

说明:
TCP/IP四次挥手是可以两端任意发起的,因为TCP是全双工通信的,下面流程以客户端发起为例

第一次挥手
客户端向服务端发送(FIN=1 seq=u)连接释放报文段,等待服务端确认,客户端进入FIN_WAIT_1状态。(当客户端主动发起连接释放报文段时,客户端即无法发送数据给服务端

第二次挥手
服务端收到客户端(FIN=1 seq=u)连接释放报文段后,即发出确认报文段(ACK=1 seq=v ack=u+1),服务端进入CLOSE-WAIT状态,此时TCP处于半关闭状态。(客户端已没有数据发送到服务端,但服务端若有数据发送,客户端依然可以接收。

第三次挥手
客户端收到服务端(ACK=1 seq=v ack=u+1)确认报文段后,客户端进入FIN-WAIT-2状态,等待服务端的连接释放报文段(此时服务端正在确认是否有数据向客户端发送,有则发送,无则发送连接释放报文段
服务端确认无数据发送到客户端后,即发送连接释放报文段(FIN=1 ACK=1 seq=w ack=u+1),服务端进入LAST-ACK状态,等待客户端的确认报文段。

第四次挥手
客户端收到服务端(FIN=1 ACK=1 seq=w ack=u+1)连接释放报文段后,即发送确认报文段(ACK=1 seq=u+1 ack=w+1),客户端进入TIME-WAIT状态,此时TCP未释放,需要经过时间等待计时器设置的时间2MSL后,客户端才会进入CLOSED状态,而服务端收到客户端(ACK=1 seq=u+1 ack=w+1)确认报文段后,立即进入CLOSED状态。(可以发现服务端比客户端早进入CLOSED状态,因为客户端还需要等待2MSL时间才能进入CLOSED状态

更多相关文章

  1. 技术干货 | mPaaS 客户端问题排查:漫长的 3s 等待之谜
  2. centos7搭建NFS客户端以及NFS详细步骤
  3. Zabbix5.0服务端和客户端安装
  4. 客户端请求服务器时的状态码讲解
  5. 推荐一款神仙颜值的 ZooKeeper 客户端工具
  6. 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但
  7. PDA调用接口 提示:客户端发现响应内容的类型为“text/html;charse
  8. 什么是客户端准备语句?
  9. 如何配置使用CAS的PHP客户端--迁移文章(blogspot爱你不容易)

随机推荐

  1. JavaScript 逆向爬取实战(下)
  2. 骚操作!嵌套 JSON 秒变 Dataframe!
  3. PMP证书获得历程
  4. 如何实时主动监控你的网站接口是否挂掉并
  5. 再见 VBA!神器工具统一 Excel 和 Python
  6. Python分析5000+抖音大V,发现大家都喜欢这
  7. 原来炫酷的可视化地图,用Python就能搞定!
  8. 太骚了!Python模型完美切换SAS,还能这么玩
  9. pandas100个骚操作:变量类型自动转换
  10. Android(安卓)View中的onMeasure()方法详