回答了个千赞问题

简介: 回答了个千赞问题

大家好,我是小林。

之前我在图解网络 PDF 里写「TCP 为什么需要三次握手?」,给出了三个原因:

  • 三次握手才可以阻止历史连接的初始化(主要原因);
  • 三次握手才可以同步双方的初始序列号;
  • 三次握手才可以避免资源浪费;

同时,这个内容也在知乎得到了 1000 多赞。


68.png

其中,在讲第一个原因的时候,提到「三次握手可以通过上下文判断当前连接是否是历史连接,而两次握手无法判断」。

因为当时没有详细说为什么两次握手无法判断历史连接,导致有很多读者私信我这个问题。

67.png

所以,这次详细说一下,顺便给大家复习下,这个面试被问到发霉的问题。


TCP 两次握手为什么无法阻止历史连接?


我之前的图解网络 PDF  里写的是,两次握手无法判断历史连接

其实这句话,不太准确,因为就像读者问的那样,第二次握手的时候,客户端也可以根据他的序列号和收到的报文中的确认号进行比较。

所以,应该改成「TCP 两次握手无法阻止历史连接」。

那为什么 TCP 两次握手为什么无法阻止历史连接呢?

我先直接说结论,主要是因为在两次握手的情况下,「被动发起方」没有中间状态给「主动发起方」来阻止历史连接,导致「被动发起方」可能建立一个历史连接,造成资源浪费

你想想,两次握手的情况下,「被动发起方」在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据给,但是「主动发」起方此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,主动发起方判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而「被动发起方」在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。

56.png

可以看到,上面这种场景下,「被动发起方」在向「主动发起方」发送数据前,并没有阻止掉历史连接,导致「被动发起方」建立了一个历史连接,又白白发送了数据,妥妥地浪费了「被动发起方」的资源。

因此,要解决这种现象,最好就是在「被动发起方」发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手

三次握手阻止历史连接的过程如下图,注意图中的两个连接的序列号是不一样的,因此新旧 SYN 报文并不是发生了超时重传,两个都是独立的连接。

55.png

客户端连续发送多次 SYN 建立连接的报文,在网络拥堵情况下:

  • 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;
  • 那么此时服务端就会回一个 SYN + ACK 报文给客户端;
  • 客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接。

可以看到,在三次握手的情况下, 可以在服务端建立连接之前,可以阻止掉了历史连接,从而保证建立的连接不是历史连接

相关文章
|
1月前
回答结果
【10月更文挑战第10天】回答结果。
43 3
|
2月前
|
存储 机器学习/深度学习 人工智能
总结经验回答问题
该内容讨论了如何利用AI技术提升NAS系统的性能与管理效率,包括深度学习优化存储、自动化处理及预测分析等。面对大数据挑战,AI为NAS注入新活力,实现高效存储与智能管理。点击查看详细讨论和优质回答。
35 0
|
人工智能
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
最近,由人工智能实验室 OpenAI 发布的对话式大型语言模型 ChatGPT 火得一塌糊涂。它可以与人类轻松地对话,无论是多么奇葩的问题 ChatGPT 都不在话下。在体验 ChatGPT 的同时我们也会遇到各种各样的问题,这里我总结了其对话过程中可能会发生的错误以及如何去解决它们。
210851 5
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
|
机器学习/深度学习 人工智能 供应链
如何正确的提问,获得最有效的回答帮助?
如何提高程序员的工作效率? 如何在云计算中实现智能化? 如何使用人工智能技术改善医疗保健行业? 如何保护个人隐私在数字化时代? 如何应对人工智能带来的就业变革? 如何构建高可靠性的云计算系统? 如何使用区块链技术改善供应链管理? 如何实现可持续的数字化转型? 如何使用机器学习技术预测未来趋势? 如何构建安全可靠的物联网系统?
375 1
|
人工智能 程序员
ChatGPT真笨,连这都回答不上来...
ChatGPT真笨,连这都回答不上来...
237 0
利用 ChatGPT 回答 R 相关问题
利用 ChatGPT 回答 R 相关问题
91 0
|
数据采集 Python
为什么别人不想回答你提的问题?
为什么别人不想回答你提的问题?
127 0
|
小程序 开发者
关于做游戏的一些问题和一些回答
这里整理了一些关于做游戏的问题和一些回答,或许有你感兴趣的。 - 我有一个 “xxx” 的想法,能不能帮我做一下? 这是一个出现频率很高的问题,所以我觉得应该在此声明一下。目前我正在做两件事:一件事情是教他人做游戏,另一件事情是做自己的游戏,所以,我不能帮“你”做一下。
104 0
|
SQL 小程序 关系型数据库
你可以这样回答!2022年软件测试面试话术为你奉上
面试就是就是进入岗位前的临门一脚,如果因为准备不足而导致面试失败那可就亏大了!因此,为了帮助大家提高面试成功率,尽快拿到高薪offer,我为你们准备了一套面试话术以及技巧,希望对即将参加软件测试面试的你们有所帮助。
167 0
|
前端开发
【实战】分享一个花了 499 学到的写作方法:问题 + 回答
我发现这个方法跟我有一些文章的方法很像,但是我并没有这样总结出来,而是在写的时候自然而然就这么去设计了。
76 0
【实战】分享一个花了 499 学到的写作方法:问题 + 回答