TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如下图所示。

主机A为客户机,主机B为服务器

确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。

说明:(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

必要性:

这两天一直在考虑一个问题,就是两者为何要三次握手呢,一次或者两次不行吗?

考虑一次的问题,首先tcp是面向连接,一次握手肯定建立不了连接,因为客户机给服务器发出请求信息却没有得到回应,客户机是没法判定是否发送成功然后建立连接的。

再看两次,假设只有两次握手,比如图中的1,2步,当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以A在一段时间内没收到ACK后,再发送一个SYN,这次B顺利收到,接着A也收到ACK,这时A发送的第一个SYN终于到了B,对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它,而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。

三次连接就没毛病了??是的

两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手,也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的,这时如果Client端向Server写数据,Server端将以RST包响应,这时便感知到Server的错误。

总之,三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源

三次握手出现错误时的应对措施

第一次握手A发送SYN传输失败,A,B都不会申请资源,连接失败。如果一段时间内发出多个SYN连接请求,那么A只会接受它最后发送的那个SYN的SYN+ACK回应,忽略其他回应全部回应,B中多申请的资源也会释放

第二次握手B发送SYN+ACK传输失败,A不会申请资源,B申请了资源,但收不到A的ACK,过一段时间释放资源。如果是收到了多个A的SYN请求,B都会回复SYN+ACK,但A只会承认其中它最早发送的那个SYN的回应,并回复最后一次握手的ACK

第三次握手ACK传输失败,B没有收到ACK,释放资源,对于后序的A的传输数据返回RST。实际上B会因为没有收到A的ACK会多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到A的ACK,则释放资源,对A的数据传输返回RST

tcp 握手失败_什么是三次握手,握手为何要进行三次,如果握手失败会有什么后果...相关推荐

  1. 产品运行所需的信息检索失败_禁煤后用什么替代锅炉?看看三种热源运行费用对比就知道了...

    山西是我国的煤炭大省,煤炭资源丰富,自然而然也是燃煤大省.在打赢蓝天保卫战的目标任务下,拆除燃煤锅炉,改用清洁能源产品是大势所趋.这样的市场背景下,显然可见的是,山西地区将会迎来一大波的燃煤锅炉改造热 ...

  2. 创建失败_号称人人都可编辑的百科词条,创建之路为何屡屡失败?

    ​作为企业推广的第一步,百科词条可以说是最直观最便捷的了,当我们想要了解一个企业的信息,往往上网查找百科信息,而且百科类的权重是比较高的,都会在搜索结果首页展示. 而企业需要做百科词条的原因就是,编辑 ...

  3. oracle安装 插件的执行方法失败_解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题...

    Google 在今年一月发布了 golang.org 的镜像站 golang.google.cn,中国大陆可直接访问.详情参见 Hello, 中国! | The Go Blog 欢迎点击查看我的博客原 ...

  4. 2021-10-27 Vue安装脚手架npm install -g @vue/cli命令失败_因为文件已存在

    这里写自定义目录标题 Vue安装脚手架npm install -g @vue/cli命令失败_因为文件已存在 Vue安装脚手架npm install -g @vue/cli命令失败_因为文件已存在 1 ...

  5. 握手失败_拜托了,看完这篇别再问我什么是TCP三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 三次握手如何建立连接? 三次握手建立链接 从图中可以清楚的看到, ...

  6. tcp 二次握手时延_一篇搞懂TCP的三次握手 四次挥手

    TCP的三次握手四次挥手,估计大家都听过.但是真的能把每一步说明白的人比较少.我还记得在之前面试的时候被面试官一顿问,然后一脸懵B... 都是大学没好好上课 ,这篇文章就跟大家讲讲到底这三握四挥是在搞 ...

  7. android tcp socket框架_最流行的 Web 框架 Gin 源码阅读

    最近公司大部分项目开始往golang换, api的框架选定使用gin, 于是将 gin的源码看了一遍, 会用几篇文章将gin的流程及流程做一个梳理, 下面进入正题. gin框架预览 上图大概是 gin ...

  8. tcp假连接_总结的23 个 TCP高频面试问题

    每个时代,都不会亏待会学习的人. 这篇文章我想由浅到深地过一遍 TCP,不是生硬的搬出各个知识点,从问题入手,然后从发展.演进的角度来看 TCP. 起初我在学计算机网络的时候就有非常非常多的疑问,脑子 ...

  9. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  10. 彩信猫 发送彩信失败_在彩信上为人类摆姿势

    彩信猫 发送彩信失败 Today, training and running ML models on a local or remote machine is not a big deal as t ...

最新文章

  1. Tensorflow2.6更新cuda11.2
  2. opencv 读写XML YML
  3. Android 点击图片进行浏览
  4. Linux出现NOKEY
  5. 如何修复:There is no command installed for 7-zip archive files
  6. python中head_Python(Head First)学习笔记:六
  7. 电脑上老出现万象预览的广告_如何极速搜索“我的电脑”全部文件?搜索神器推荐!...
  8. c 语言编译器 论文,毕业论文--C语言编译器设计与实现.doc
  9. 基于苹果自研芯片的 Mac 电脑对安全意味着什么?
  10. 再也不用为word 中表达式的上标和下标发愁了
  11. 区块链 以太坊 solidity 什么时候使用storage、memory
  12. 【转】Nginx双机热备高可用解决方案【二】
  13. linux通过usb给windows,如何从Linux创建Windows USB安装程序 | MOS86
  14. java小数正负数据类型_Java - day001 - 8种基本数据类型
  15. 浅谈“从神经网络——迁移学习引发的一系列的思考”
  16. STAMP:扩增子、宏基因组统计分析神器(中文帮助文档)
  17. 5855. 找出数组中的第 K 大整数
  18. javascript书籍推荐
  19. 一文教你如何挑选深度学习GPU
  20. 自己更换云平台绑定QQ号的方法

热门文章

  1. 小米5 android 4.1.2,三星GALAXY NOTE i9220 Miui V5完美运行 Android4.1.2 华丽流畅体验
  2. python备份cisco交换机_思科交换机备份与还原
  3. python 偏态分布调整_如何处理偏态数据
  4. win10 的局部截图功能
  5. wamp php打不开,wamp无法打开phpmyadmin
  6. 紫罗兰永恒花园rust简谱_みちしるべ简谱-紫罗兰永恒花园ed
  7. Oracle 大表数据删除/清理方法小结
  8. Tegra3 1080p高清播放时电源管理方式和功耗分析
  9. CF1095A Repeating Cipher
  10. [buuctf.reverse] 131-135