客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN
报文,之后客户端进入 FIN_WAIT_1 状态。
服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状
态。
客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。
你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手
为什么挥手需要四次?
再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数
据。
服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理
和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都
会分开发送,从而比三次握手导致多了一次。

最新文章

  1. $watch $apply and $evalAsync vs $timeout
  2. Java Programming Test Question 4
  3. mongoDB(1)
  4. 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
  5. 警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:CurrencyClientServe
  6. Java hour 52 Weather
  7. UIImage 调整图片大小
  8. [原创] 分享一些linux教程
  9. FreeBSD系统更新与软件安装方法
  10. 练习2 E题 - 求奇数的乘积
  11. My.Ioc 代码示例——使用条件绑定和元数据(可选)构建插件树
  12. Jsoup代码解读之四-parser
  13. 合理设计C代码 函数笔记
  14. 我的Python成长之路---GitHub使用克隆GitHub(SSH key配置)
  15. Object方法
  16. C#2.0之可空类型
  17. 【网址】ILSpy,C# .net/dot net的反编译工具
  18. PATH_SEPARATOR
  19. 2 虚拟机Oracle11.2.0.4服务器端,第三方图形化界面安装步骤
  20. 搜狐视频Redis私有云平台CacheCloud

热门文章

  1. svn服务支持网页显示并增加在线预览功能,支持视频在线播放
  2. vue js计算精度问题处理,兼容XP系统
  3. Windows10 1809版本Windows自动更新服务无法禁用问题解决方案
  4. 内置方法 __new__ __del__
  5. close()和flush()的区别
  6. 《前端运维》三、Docker--2其他
  7. Spring cache源码分析
  8. Rabbit MQ 怎么保证可靠性、幂等性、消费顺序?
  9. 两个链表有一个交点,如何在时间复杂度 O(n) 和 空间复杂度 O(1) 的条件下实现?_字节跳动面试题
  10. 什么是 Callable 和 Future?