老师, 在客户端和服务端4次挥手过程中,在客户端到服务端连接断开后,服务端发起断开命令后,客户端为何还能向服务端回复确认报文,不是已经断开了么。
来源:10-1 HTTP协议相关面试问题-1

慕九州MJZ
2018-05-19
3回答
-
于海
2018-05-19
Tcp连接是全双工的,含义就是双端都是发送方,也都是接收方 四次挥手需要两个方向的断开
10 -
卷王Charles
2021-10-12
为什么 TCP 连接是三次握手?两次不可以吗?
TCP 是一个全双工协议,它要保证双方都具有接收与发送的能力。
因为需要考虑连接时丢包的问题,如果只握手两次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数据(可以理解为服务端已经连接成功),而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。
如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认报文丢失,服务端在一段时间内没有收到确认报文的话就会重新进行第二次握手,也就是服务端会重发 SYN 报文段,客户端收到重发的报文段后会再次给服务端发送确认报文。
为什么 TCP 连接是三次握手,关闭的时候却要四次挥手?
主要是建立连接时接收者的 SYN-ACK 一同发送了,而关闭时 FIN 和 ACK 却不能同时发送,因为断开连接要处理的情况比较多,比如服务器端可能还有发送出的消息没有得到 ACK,也可能服务器资源需要释放等。所以先发一个 ACK 表示已经收到了发送方的请求,等上述情况都有了确定的处理,再发 FIN 表示接收方已经完成了后续工作。
类比现实世界中,你收到了一个 Offer,出于礼貌你先回复一下,然后思考一段时间再回复 HR 最终的结果。
为什么客户端发出第四次挥手的确认报文后要等 2MSL 的时间才能释放 TCP 连接?
这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是 2MSL,所以需要等这么长时间来确认服务端确实已经收到了。
以上内容希望对后来的人有帮助。摘抄自:https://mp.weixin.qq.com/s/3vukUOskJzoPyES2R7rJNg
00 -
duduhali
2018-11-23
1.老师您好~请问四次挥手的第一次挥手完成后 , 到底是客户端已经和服务端断开了连接 , 还是说客户端只是要告诉服务端:"我想断开了 , 你做一下准备哦!" 这种感觉?!
我的感觉老是第一次挥手是告诉服务端我想断开 , 然后服务端说行吧 , 你断开吧 , 那我服务端也别等你客户端什么确认信号之类的了 , 你客户端都要断开了 , 那我服务端这边我就先断开了 , 也就是服务端进行了第二次和第三次挥手 , 然后客户端收到了服务端的ack码之后发现收到了服务端已经断开的信息 , 那我索性也断开啦 !
如果按照您课上的意思 , 我也有上一位同学类似的疑问 , 就是既然你是 "全双工" 的 , 那我第一次挥手我已经断了一次了 , 你服务端第三次挥手你也断了 , 那这 "双工" 已经都断了 , 你第四次挥手你挥给谁看啊?!你已经在第一次挥手的时候就断开了 , 你干嘛还要挥手啊?!你第一次挥手就断了客户端到服务端的这条线路了 , 那你第四次挥手你到底占用的是哪条线路啊?!
我感觉我这个理解应该是不太对 , 但是说着又好像挺像那么回事儿似的~希望您百忙之中抽出时间解答~谢谢~
2. 这个第二条是我又重新看了您的视频之后想到的 , 我感觉之前的思路是错的~应该是服务端说我想断开 , 并且收到了客户端给的ACK码同意断开之后 , 走的都是客户端到服务端这条工作线路 , 一旦客户端收到了ACK码这条线路才是断开了! 也就是截图中的6 , 7 是走的客户端到服务端这条通道 ;
而相对的 8 , 9 是服务端发起断开请求 , 客户端返还ACK码的过程, 8 , 9 走的就是服务端到客户端这条工作通道 , 我感觉这也解决了我第一条的问题 ; 并不是说单项的断开想断开就断开 , 而是得某一方返回了ACK码之后才算断开那条通道的断开 ! 请问您我的理解对么?
00
相似问题
回答 1
回答 1