最长报文寿命
  在TCP协议中,当发送方发送释放连接报文收到确认报文后,只是在一个方向上断开了TCP连接,然后,接收方发送释放连接的报文,发送方回复确认。此时,连接还没有释放,发送方要等待2MSL(maximum segment lifetime——最大的生命周期)后关闭连接。

问题
  主动发起关闭连接的操作的一方将达到TIME_WAIT状态,而且这个状态要保持Maximum Segment Lifetime的两倍时间。为什么要这样做而不是直接进入CLOSED状态?

原因:
  保证TCP协议的全双工连接能够可靠关闭
  保证这次连接的重复数据段从网络中消失

解释:
  如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
  如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

最新文章

  1. 1000行代码实现MVVM (类似Angular1.x.x , Vue)
  2. 小谈Jquery框架
  3. HTML 样式属性
  4. 浅析C语言指针问题
  5. JAVA环境配置-Eclipse新建项目
  6. 百度浏览器+hao123评价
  7. nginx 负载均衡策略
  8. 菜鸟学Windows Phone 8开发(1)——创建第一个应用程序
  9. 字符串转化为json方法
  10. iOS开发那些事-iOS应用本地化-资源文件本地化
  11. 《高性能JavaScript》的新征程
  12. LigerUI权限系统之用户管理
  13. Spring Security 入门(1-3-1)Spring Security - http元素 - 默认登录和登录定制
  14. istio-mix介绍
  15. 用git如何把单个文件回退到某一版本
  16. 【Java】 剑指offer(29) 顺时针打印矩阵
  17. sencha touch 入门学习资料大全(2015-12-30)
  18. JSON语言规范与Java中两种解析工具基本使用
  19. [APIO2018] Duathlon 铁人两项 圆方树,DP
  20. Cordova 打包签名

热门文章

  1. [转帖]SQL Server 10分钟理解游标
  2. [转帖]k8s 中的服务如何沟通
  3. SSL保护 C/S 、B/S 通信安全
  4. 百度前端技术学院task1 总结
  5. 【05】Saltstack:配置详解
  6. PYTHON的ASCII码转换
  7. 关于ipad设备滚动条无法滚动的解决办法
  8. [Silverlight 4] 參數的傳遞方法
  9. MVC下通过jquery的ajax调用webapi
  10. 【翻译】Tusdotnet中文文档(1)配置和用法