为什么http请求要3次握手与4次挥手?

作者:安静的木小昊
链接:https://www.zhihu.com/question/67772889/answer/495905873
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

我觉得面试官想问的不是怎么握手, 而是为什么是3次,4次, 而不是更少或者更多?

建立连接

理想情况下:

client:"我要开始了"

server:"好的"

然后client开始发送信息.

第二种情况:

client:"我要开始了" 但是server没有收到

client发现半天server都没有反馈, 有发了一遍:"我要开始了"

server:"好的"

如果client发送的请求没有被server收到, 那么长时间没有收到server的回复后, 重新发送请求既可.

第三种情况:

client:"我要开始了" 这个请求堵在路上了, server没有收到

client重新发送:"我要开始了"

server:"好的"

client开始发送信息

在发送信息的过程中, server收到了之前堵在路上的请求. server只能重新建立连接. 这并不是我们希望的.

为了避免client本该失效的请求被server接收, 必须要多一次握手, 即三次握手.

client:"我要开始了"

server:"好的"

client:"那我真的开始了"

结束连接

和建立连接一样的考虑, 需要3次握手.如下:

client:"我要结束啦"

server:"好的"

client:"那我真的结束了"

但是结束和建立的一个区别在于, client想建立的时候, server能够随时准备建立.

client想结束的时候, server得先确保手中的数据发送完才能够结束

所以中间的一次握手要拆分为两步.如下:

client:"我要结束啦"

server:"好的, 等我把数据发完"

server:"我发完啦"

client:"那我真的结束啦"

然后client结束连接

server收到后也结束连接.

再考虑一种情况, 假如server没有收到client发送的"那我真的结束啦"呢?超时重传吗?client都已经关闭连接了.

所以解决办法是:

client在发完"那我真的结束啦"后, 等待一段时间, 如果这段时间内没有收到server的重传, 证明server已经确实收到了. 所以client可以放心的结束了.

所以最终流程如下:

client:"我要结束啦"

server:"好的, 等我把数据发完"

server:"我发完啦"

client:"那我真结束啦"

client怕server没有收到, 就等了一会儿, 如果这段时间内没有收到server的重传, 就放心的关闭连接啦.

而server这边接到"那我真的结束啦"后, 就直接关闭连接了.

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络连接的建立和断开需要进行握手挥手操作,以确保通信的可靠性和稳定性。下面是关于为什么网络连接需要进行3握手和4挥手的介绍: 1. 三次握手(Three-way Handshake): 在建立TCP连接时,客户端和服务器之间需要进行三次握手来确认彼此的通信能力和同步初始序列号。 - 第一握手:客户端向服务器发送一个SYN(同步)包,请求建立连接,并选择一个初始序列号。 - 第二握手:服务器收到SYN包后,回复一个SYN+ACK(同步+确认)包,表示接收到请求,并确认客户端的初始序列号。 - 第三次握手:客户端收到服务器的SYN+ACK包后,再发送一个ACK(确认)包给服务器,表示连接已建立。 通过三次握手,双方确认了彼此的通信能力,并同步了初始序列号,确保了后续数据传输的可靠性。 2. 四次挥手(Four-way Handshake): 在断开TCP连接时,客户端和服务器之间需要进行四次挥手来正常关闭连接,以确保数据的完整性和可靠性。 - 第一挥手:客户端向服务器发送一个FIN(结束)包,表示客户端不再发送数据。 - 第二挥手:服务器收到FIN包后,回复一个ACK包,表示已收到客户端的关闭请求。 - 第三次挥手:服务器发送一个FIN包给客户端,表示服务器也不再发送数据。 - 第四次挥手:客户端收到服务器的FIN包后,回复一个ACK包,表示已收到服务器的关闭请求。 通过四次挥手,双方确认了彼此的关闭意图,并确保了数据的完整传输,避免了数据丢失或混乱。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值