“为什么是三次握手?”
这个问题言下之意其实在问:“为什么不是0次、1次、2次、4次甚至更多次握手”。
确保双方的 发送能力 和 接收能力 都是好的。
该回答下的一评论:其实很简单, 1.a->b, 这个时候没有任何状态, 2. b->a, b给a发东西, 说明收到了a的东西, 证明了a的发送能力是没问题的,同时证明了b的接收能力也是没有问题的。 如果到这里就结束了, 那么a的接收能力和b的发送能力就没办法保证了。如果再加上3. a->b , 证明了a收到了b的发送, 那么b的发送能力也是好的, a的接收能力也是好的。这样a和b的接收发送的能力都是好的, 就没必要再次证明了。 而楼主说的第三个包没有到的问题, 假设过程3里, a发出去了, 但是没到b。对于a来说, b收到了自己的发送并给自己做了回应,就可以认为b是正常的, a相信自己也是正常的, 所以这个时候对于a来说, tcp握手就结束了, 但是对于b来说, 在第二个包发出去的时候, a没有回应, 那么b就会认为a的接收能力是有问题的, b就会一直发, 直到a给了回应。不然b就永远不会认为tcp握手结束了。
双方都认为当前信道/数据的传输是可靠的。
原评论:所以三次握手不是TCP本身的要求,而是为了满足“在不可靠信道上可靠地传输信息”这一需求所导致的。请注意这里的本质需求:信道不可靠,数据传输要可靠:
这个问题的本质是, 通过一个不完全可靠的信道, 最少需要几次消息传输, 信道两边的人能够对一个问题达成一致. 对于TCP来说, 无论有没有初始序号的要求, 想要两边都同意开始传出数据, 就至少需要3次消息的交换:
- 0次: 显然不行
- 1次: A->B, A不知道B是否同意
- 2次: A->B, B->A. B不知道A是否收到自己的消息, 因为信道不完全可靠
这儿A已经可以确信信道是可靠的了,只是B不能确信而已,这儿你要是把信道当成TCP链接本身,也就是全双工,自然如此,但是像我这样把链路分成两个方向上的 信道的人来说,却不是如此。并且TCP确实可以建立半链接- 3次: A->B, B->A, A->B. 两边都收到了对方的ACK, 意味着各自都了解了对方的意图, 从而可以对是否开始通信这个最简单的问题
如果该问题细一点:“为什么是三次握手,不是2次握手?”,即在问第3次握手的作用。
TCP 为什么是三次握手,而不是两次或四次? - wuxinliulei的回答 - 知乎:
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
“为什么是三次握手,却是四次挥手?”
这个问题其实在问“四次挥手”中,服务端的ACK和FIN为什么不能同时发。因为在“为什么是三次握手”的回答中,看到有一个答案说的是:
- A 发送 同步信号 SYN + A’s seq
- B 确认 收到 A’s SYN,并记录 A’s seq,命名 B’s ACK
- B 发送 SYN + B’s seq
- A 确认 B’s SYN,并记录 B’s seq,命名 A’s ACK
很显然,步骤2、3可以合并,所以只需要3次握手。
但是我觉得这个回答是解释“为什么是三次握手,却是四次挥手?”这个问题的背景、由来,即:为什么四次挥手中,服务端的 ACK 和 SYN 要分开发?
一个比较合理的解释是:文章来源:https://www.toymoban.com/news/detail-499438.html
这是因为服务端在LISTEN状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即 close,也可以发送一些数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送。文章来源地址https://www.toymoban.com/news/detail-499438.html
到了这里,关于“为什么是三次握手”与“为什么是三次握手,却是四次挥手”其实是不同的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!