回答了个千赞问题

简介: 回答了个千赞问题

大家好,我是小林。

之前我在图解网络 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 报文给服务端,表示中止这一次连接。

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

相关文章
|
10月前
|
人工智能 程序员
ChatGPT真笨,连这都回答不上来...
ChatGPT真笨,连这都回答不上来...
183 0
|
10月前
|
机器学习/深度学习 人工智能 供应链
如何正确的提问,获得最有效的回答帮助?
如何提高程序员的工作效率? 如何在云计算中实现智能化? 如何使用人工智能技术改善医疗保健行业? 如何保护个人隐私在数字化时代? 如何应对人工智能带来的就业变革? 如何构建高可靠性的云计算系统? 如何使用区块链技术改善供应链管理? 如何实现可持续的数字化转型? 如何使用机器学习技术预测未来趋势? 如何构建安全可靠的物联网系统?
233 1
|
10月前
chatgpt应用知识之如何提问
chatgpt应用知识之如何提问
|
11月前
利用 ChatGPT 回答 R 相关问题
利用 ChatGPT 回答 R 相关问题
68 0
|
11月前
|
数据采集 Python
为什么别人不想回答你提的问题?
为什么别人不想回答你提的问题?
100 0
|
11月前
|
机器学习/深度学习 存储 自然语言处理
关于ChatGPT八个技术问题的猜想
关于ChatGPT八个技术问题的猜想
142 0
|
11月前
|
机器学习/深度学习 存储 自然语言处理
张家俊:ChatGPT八个技术问题的猜想
张家俊:ChatGPT八个技术问题的猜想
|
11月前
|
小程序
如何提问才能获得想要的答案?
我们每个人都会遇到问题,遇到问题时如果自己搞不定的话,最好的方式其实就是向他人求助,也就是提问。提问其实是一件技术活,是有技巧的,会提问的人总是能够获得想要的答案,而不会提问的人经常会被拒之门外,得不到答案。
98 0
如何提问才能获得想要的答案?
|
SQL 机器学习/深度学习 人工智能
每一个人都应该明白的ChatGPT所带来的意义
ChatGPT的横空问世,因其更高的智能程度、更宽泛的领域知识、更灵活的响应能力、更自然的对话语境使整个互联网都受到极大的冲击。 我本人试用了一段时间后,并结合在网上看到的文章、评论、观点,想说说我对ChatGPT的看法,以及它应该带给我们的革命。 因本人是互联网行业从业者,本文更多叙述ChatGPT+编程开发从业相关。
每一个人都应该明白的ChatGPT所带来的意义
|
SQL 小程序 关系型数据库
你可以这样回答!2022年软件测试面试话术为你奉上
面试就是就是进入岗位前的临门一脚,如果因为准备不足而导致面试失败那可就亏大了!因此,为了帮助大家提高面试成功率,尽快拿到高薪offer,我为你们准备了一套面试话术以及技巧,希望对即将参加软件测试面试的你们有所帮助。
132 0