一:TCP四次挥手

1:图示

二:TCP四次挥手的过程

所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。挥手之前主动释放连接的客户端结束ESTABLISHED阶段。随后开始“四次挥手”:

a:首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:

  • 标记位为FIN,表示“请求释放连接“;
  • 序号为Seq=U;
  • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
    注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

b:服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:

  • 标记位为ACK,表示“接收到客户端发送的释放连接的请求”;
  • 序号为Seq=V;
  • 确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值;
  • 随后服务器端开始准备释放服务器端到客户端方向上的连接。
    客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
    前"两次挥手"既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了

c:服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:

(第二次挥手 服务器端回复 确认收到 客户端想要释放连接的请求 返回ACK,但是 服务端还有些数据的处理,所以不能马上断开连接,所以需要第三次握手 即服务端发送 FIN 释放连接的标志位)

  • 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。
  • 序号为Seq=W;
  • 确认号为Ack=U+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。
    随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

d:客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中:

  • 标记位为ACK,表示“接收到服务器准备好释放连接的信号”。
  • 序号为Seq=U+1;表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。
  • 确认号为Ack=W+1;表示是在收到了服务器端报文的基础上,将其序号Seq值作为本段报文确认号的值。
    随后客户端开始在TIME-WAIT阶段等待2MSL
    服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。
    客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。

e:总结

后“两次挥手”既让客户端知道了服务器端准备好释放连接了,也让服务器端知道了客户端了解了自己准备好释放连接了。于是,可以确认关闭服务器端到客户端方向上的连接了,由此完成“四次挥手”。

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

a:握手三次(即在一次握手就可以搞定ACK+SYN)

TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。
即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

b:挥手四次

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。

b1:为何建立连接时一起传输,释放连接时却要分开传输?

  • 建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
  • 释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

四:为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

  • 如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
  • 否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

参考自)

TCP四次挥手(详解)相关推荐

  1. TCP四次挥手详解以及小实验

    TCP四次挥手 1.主动关闭方发送FIN连接释放报文段 客户端调用 close 方法,告诉服务器自己要主动关闭连接,会发送一个 FIN 报文给服务端,客户端进入FIN-WAIT-1状态. FIN 段是 ...

  2. TCP 三次握手和四次挥手详解

    1. TCP 报文格式详解 (1). 源端口和目的端口字段--各占 2 字节,标识了发送方和接收方的应用进程,如2210,80端口 (2). 序号字段--占 4 字节,TCP 连接中传送的数据流中的每 ...

  3. TCP三次握手和四次挥手详解

    文章目录 三次握手和四次挥手简述 三次握手的目的 三次握手流程详解 半连接队列和全连接队列 四次挥手的目的 四次挥手详解 为什么客户端需要TIME_WAIT状态 为什么挥手比握手多一次 为什么三次挥手 ...

  4. 4-5:TCP协议之连接管理机制(三次握手、四次挥手详解)

    文章目录 一:TCP三次握手过程和状态变迁 (1)三次握手过程和状态变迁过程详解 (2)为什么必须要三次握手? A:只有三次握手才可以阻止重复历史连接的初始化(主要原因) B:同步双方初始序列号 C: ...

  5. 面试常问:TCP 三次握手与四次挥手详解

    TCP 三次握手 图解 三次握手过程详解 第一次握手 [客户端]向[服务端]发送连接请求报文,标记 ACK=1 , SYN=1 , 客户端序列号 seq=x ,客户端进入等待状态. 第二次握手 [服务 ...

  6. TCP协议---三次握手和四次挥手详解 (不看后悔系列)

    目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...

  7. wireshark抓包图解 TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

  8. tcp 三次握手与四次挥手_TCP三次握手与四次挥手详解

    TCP报文结构   源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号. 序号:占4个字节.序号使用mod运算.TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号 ...

  9. TCP—三次握手和四次挥手详解

      本文主要介绍TCP连接三次握手和四次挥手的机制. TCP三次握手 剖析三次握手机制   首先Client端发送连接请求报文,Server端接受连接后回复ACK报文,并为这次连接分配资源.Clien ...

  10. TCP的三次握手与四次挥手详解

    文章目录 TCP 协议简述 TCP包首部 TCP 三次握手建立连接 TCP 四次挥手关闭连接 常见面试题: TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连 ...

最新文章

  1. Reject: HTTP ‘DELETE‘ is not allowed, Not injecting HSTS.....DELETE请求PUT请求跨域问题
  2. loadrunner——win7+LR11配置
  3. AI 监视打工人,这个国家明确说:保护我方“摸鱼权”!
  4. python大神-国内某Python大神自创完整版,系统性学习Python
  5. HDU3068 最长回文
  6. Web开发-Django初识及实战
  7. JWT令牌的秘密轮换
  8. Android平台RTMP多实例推送的几种情况探讨
  9. 华为畅享9S曝光:2400万超广角AI三摄+珍珠屏
  10. 自学java 第十章内部类(一)
  11. 解决办法:一切都正确,Python3执行PyImport_Import()一直返回NULL
  12. [译]Vue 2.0的变化(一)之基本API变化
  13. LiveReload for mac 软件下载
  14. iOS开发环境:XCode
  15. mc小刘yeah粉丝网
  16. 【SCOI2009】粉刷匠
  17. 2020年7月各大城市与程序员平均工资排行榜
  18. SUM(CASE WHEN ?? THEN ?? ELSE ?? END) AS ??
  19. x265 码率控制算法(一)CQP
  20. xlwt/xlrd库的区别

热门文章

  1. 沙尘暴ppt计算机,认识沙尘暴PPT.pptx
  2. Unity 一笔画的玩法实现
  3. 想成为单片机高手?这3步是必经之路
  4. NLP竞赛全球亚军,我的科研经验分享
  5. 学计算机的用i5,我学计算机专业,想买微星gl62m,处理器应该选i5还是i7的?
  6. keil5提示main.c: error C237: ‘wd‘: function already has a body
  7. 7-data android recovery,7-Data Android Recovery
  8. Android流量监控
  9. 解决NPM下载速度贼慢的方法
  10. 2012年国家自然科学基金中标项目:软件工程相关方向