TCP/IP三次握手四次挥手,是非常重要的,这个链接与关闭过程也是非常easy的。但为什么是三次握手?以及为什么要等待2MSL的状态?大部分人或许听到这个问题就蒙了。这篇博客就综合《TCP/IP具体解释:卷一》来分析一下原因:

以下看TCP三次握手四次挥手的原理图:

1.为什么要三次握手?

为了避免已失效的连接报文段又到达可server。

考虑这样一个正常的情况:

如果TCP连接是两次握手。

当client发送了一个请求连接的报文时,因为网络原因这个报文丢失了,那么client一段时间内没有收到server的确认就会再次发送请求连接报文,这次server收到了,两方都建立了连接,然后传输数据,最后关闭连接。

可是考虑一下,上文中的丢失数据包若没有丢失,仅仅是在一个网络节点长时间滞留了,这时两方都已经关闭了连接,此时server又收到了丢掉了的数据包。觉得client又要建立连接,由于是两次握手所以server向client发送了确认报文,并变 为 建立连接状态。

可想而知client并没有发起连接所以会忽略server的确认,这样就浪费了server的资源。

2.为什么要等待2MSL时间?

1.  当client的最后一次确认连接的报文丢失(第四次挥手发送的)。server会再次发送FIN报文,等待client的确认,client在2MSL内收到server重传的报文再次确认(防止此时client已经关闭)。

2.  2MSL 的时间能够使全部已失效的报文都消失(防止对新建的连接造成影响)。若在不等待2MSL,立即建立新的连接。那么在关闭连接前发送的失效报文段非常可能影响本次连接。

然而,TCP规定处于2MSL状态的的插口对(clientIP/port和serverIP和port)不能再次被使用。 若在2MSL状态下新建连接能够使用这个插口对,当已失效的数据包再次到达这个新连接,推断插口一致就会接受这个报文。但实际上这不是新建连接交互的数据,因此不能使用此无效数据包。

最新文章

  1. js中 javascript:void(0) 用法详解
  2. JavaScript使用DeviceOne开发实战(三)仿微信应用
  3. 9、数据库工程师要阅读的书籍 - IT软件人员书籍系列文章
  4. php中的常用数组函数(一)(比较多个数组的差集的函数们 array_diff_assoc() array_diff() array_diff_key() array_diff_ukey() array_diff_uassoc())
  5. Linux课本第一二章
  6. ECMA中关于if与else的关系的一句英文,感觉比较经典
  7. 未能解析此远程名称:'nuget.org'
  8. 第一个前台页面----xflow的页面
  9. laravel blade $loop
  10. Vulkan Tutorial 23 Descriptor layout and buffer
  11. java中log4j学习笔记
  12. Java 冒泡排序法
  13. jquery中的 jquery.contains(a,b)
  14. for循环介绍
  15. HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
  16. java常用技术名词解析
  17. Solr——从postgresql数据库导入数据
  18. Vue 修改dist 目录.
  19. proxool连接sqlerver
  20. easyui基于web的打印实现 .

热门文章

  1. 树莓派-解决apt-get upgrade速度慢的方法[更换阿里云源]
  2. 5.13Junit单元测试-反射-注解
  3. create-react-app 引入ant design 及 使用 less
  4. buf.readInt16LE函数详解
  5. HIVE 命令记录
  6. OpenCV : 基于切线方向的边缘增强算法
  7. 时序分析:DTW算法(基于模板)
  8. 《3D建模初步》参考资料
  9. 07.网络编程-2.UDP
  10. 1. 构建第一个SpringBoot工程