为什么必须是三次握手?

  大家都知道传输层(点击这里去传输层)中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手,今天先讲解三次握手(四次挥手点这里),如下图

  喜欢钻牛角尖的我在学习三次握手的时候就想到了几个问题:为什么三次握手是三次?不是一次、两次或者更多?如果是两次或者是一次会出现什么情况?带着这个问题我找了好多资料,发现了其中的奥秘。

一次握手的情况:

  由于TCP是面向连接的,一次很明显时不可能的,因为客户端发出连接消息后,却没有接收到来自服务端的回应,客户端就无法确定服务端接是否收到了连接请求,当然也就不能确定是否连接成功。

两次握手的情况:

  既然一次客户端接收不到服务端的回应,那就连接两次,接收到回应就说明服务端接收到了连接请求,可以连理连接了。结果并不是这样。
如果客户端想建立连接,给服务端发了一个连接请求(SYN),但是由于网络中种种情况,导致没有及时到达服务端,这就导致客户端在很长一段时间中没有收到回复消息(ACK),这时客户端又给服务端发送一个SYN,这次的发送和接收的很顺利,很快就收到了ACK,但是这时之前的SYN终于到了服务端,服务端规规矩矩的为这个SYN申请资源,然后返回ACK。由于之前的SYN已经失效了,所以客户端也不会去理会这个ACK,但是傻乎乎的服务端并不知道这个SYN已经失效了,一直为他委会着资源,这就造成了资源的浪费。

三次握手的情况:

  一发一收的两次握手既然不行,那么三次握手就可以了吗?接着往下看。
  在两次握手中服务端不知道当前这个SYN是不是有效的,三次握手就很好的解决了这个问题,第三次握手就是客户端给服务端回复第二次握手,这也就是说服务端会等第三次握手的到来,如果第三次握手迟迟不来,服务端就可以识别这个SYN是无效的,就会将他的资源释放了。还有一种情况就是第三次握手由于网络中的种种原因失败了,这时候客户端认为自己已经连接好了,就会给服务端发送数据,服务端由于没有收到第三次握手,就会以RST包对客户端响应,收到RST的的客户端就知道第三次握手没有成功,就会重新连接。在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。

四次握手和两次握手的情况一样,五次握手和三次握手的情况一样,以此类推,奇数次握手的情况与三次握手相同,同理偶数次握手与两次握手一样,所以为了更快的连接,就使用三次握手最合适。

每次握手失败对应的措施:

第一次握手失败:

  如果第一次的SYN传输失败,两端都不会申请资源。如果一段时间后之前的SYN发送成功了,这时客户端只会接收他最后发送的SYN的SYN+ACK回应,其他的一概忽略,服务端也是如此,会将之前多申请的资源释放了。

第二次握手失败:

  如果服务端发送的SYN+ACK传输失败,客户端由于没有收到这条响应,不会申请资源,虽然服务端申请了资源,但是迟迟收不到来自客户端的ACK,也会将该资源释放。

第三次握手失败:

  如果第三次握手的ACK传输失败,导致服务端迟迟没有收到ACK,就会释放资源,这时候客户端认为自己已经连接好了,就会给服务端发送数据,服务端由于没有收到第三次握手,就会以RST包对客户端响应。但是实际上服务端会因为没有收到客户端的ACK多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到客户端的ACK,则释放资源。

  这是我自己理解,有什么不合适的地方,欢迎各位大佬批评指正。

TCP三次握手详解及面试题相关推荐

  1. TCP三次握手详解:传输控制块TCB以及积极和消极的连接建立方式

    TCP协议目的是为了保证数据能在两端准确连续的流动,可以想象两个建立起TCP通道的设备就如同接起了一根水管,数据就是水管中的水由一头流向另一头.然而TCP为了能让一个设备连接多根"水管&qu ...

  2. TCP三次握手详解及释放连接过程

    TCP头部: 其中 ACK   SYN  序号  这三个部分在以下会用到,它们的介绍也在下面. 暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的A ...

  3. TCP报文格式及三次握手详解

    一.TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 在Wireshark中查看 图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 ...

  4. TCP的三次握手详解

    TCP的三次握手 传输控制协议TCP简介: 1.面向连接的.可靠的.基于字节流的传输层通信协议 2.将应用层的数据流分割成报文段并发送给目标节点的TCP层 3.数据包都有序号,对方收到则发送ACK确认 ...

  5. 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解

    TCP三次握手过程: 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...

  6. TCP三次握手建立连接

    一.三次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ClOSED(关闭)状态. 这 ...

  7. TCP三次握手/四次分手详解

    TCP三次握手/四次分手详解                         | ------------------TCP(Transmission Control Protocol) 传输控制协议 ...

  8. TCP/IP协议详解、TCP三次握手

    TCP/IP协议详解:TCP/IP协议详解_王佳斌-CSDN博客_tcp/ip协议认识HTTP协议它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本 ...

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

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

最新文章

  1. c语言寻找James,[semi-tutorial]某亚里亚写在JamesM边上的OS笔记
  2. iGrimace IG 各版本区别
  3. 智联招聘python岗位_智联招聘的python岗位数据词云制作
  4. c++ 链表_算法学习笔记 - 链表 - 单链表的粗糙实现
  5. Android深入浅出之Binder机制(转)
  6. 腾讯未成年保护措施再优化,专治孩子忽悠家长帮过人脸识别
  7. SAP 许可证审计流程 License Audit介绍
  8. HDFS进阶应用 配置 NFS 网关
  9. 人家android博客地址
  10. 华为手机上的网上邻居怎么用_华为手机上的网上邻居怎么用_HUAWEI Mate 8 网络邻居 使用教程...
  11. 2017互联网寒冬程序员求职随感
  12. python: 集合操作符和关系符号
  13. python/Matplotlib绘制复变函数图像
  14. 流程图基础绘制方法和流程图制作软件功能详解
  15. NPOI使用ShiftRows向excel插入行,并复制原有样式
  16. 【一起入门NLP】中科院自然语言处理作业五:BiLSTM+Attention实现SemEval-2010 Task 8上的关系抽取(Pytorch)【代码+报告】
  17. adams功能区不显示_2019新版PPT,不知道这7个新功能,怎么做好幻灯片?
  18. ZCU104开发板:开发板介绍1
  19. 安卓动画的简单实现方法(Animation和AnimationDrawable)
  20. cf修改游戏客户端是什么意思_穿越火线修改游戏名方法

热门文章

  1. 美团数据库运维自动化系统构建之路
  2. block在美团iOS的实践
  3. Java远程通讯技术及原理分析
  4. 论文浅尝 | 利用多语言 wordnet 上随机游走实现双语 embeddings
  5. 深度学习中不得不学的Graph Embedding方法
  6. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
  7. 规则引导的知识图谱联合嵌入方法
  8. 雷林鹏分享:C# 多态性
  9. #35 string(缩点+动态规划)
  10. 2018 UESTC Training for Data Structures