你能看的懂的Http三次握手和四次挥手

面试经常碰到这样的问题:

  • 简述下Http三次握手和四次挥手
  • 为什么是三次握手,四次挥手?两次握手,三次挥手可以吗?

正常回答

三次握手

  • 客户端(client)发送一个请求,向服务端(server)表示须要连接。然后等待服务端的回应。
  • 服务端接收到这种请求包后,查看是否在接听的是指定的port,如果是,向我们表示,服务端连接已经准备好了,等待我们的确认。
  • 客户端收到服务端的反馈后,发送确认建立连接的信息给服务端。

四次挥手:

  • TCP客户端发送一个FIN。用来关闭客户到server的数据传送。
  • server收到这个FIN。它发回一个ACK,确认序号为收到的序号加1。
  • server关闭client的连接,发送一个FIN给client。
  • 客户段发回ACK报文确认。并将确认序号设置为收到序号加1

这种回答对于真正了解的人来说,很容易理解。对于为什么是三次握手,四次挥手这个问题也很容易回答。但是对于一个新手来说就有点不太友好了。因为只靠死记硬背太难理解了,特别是过段时间还有可能忘记。

从生活中举例回答

三次握手

要回答这个问题,我们可以援引生活中的一个例子。比如打电话。

我们假设老李(客户端)要给老张(服务端)打电话,场景是怎样的呢?

老李:喂,你好老张。

老张:你好老张。

老李:嗯

老李:巴拉巴拉(已建立连接,开始说事,这一步不在发生在三次握手之后)

我们正常打电话的开场白都是这样的,有没有考虑过为什么会是这样?我们来看,这三句话,少了其中一句会咋样?

假如少了第一句,恰好老李的麦克风坏了:

老张:你好老张。

老李:嗯。

老李:巴拉巴拉(已建立连接,开始说事)
5秒后

老张:老李你是不是麦克风坏了?我听不到你说话。

我们再假设少了第二句,恰好老李的麦克风又坏了:

老李:喂,你好老张。

老李:嗯

老李:巴拉巴拉(已建立连接,开始说事)

老张:这个憨憨怎么打过来电话,一句话不说。

我们假设少了第三句,恰好老李要说的事比较复杂,在整理思路:

老李:喂,你好老张。

老张:你好老张。

老张:老李你能听到不?你倒是吱个声啊。

至此:我们发现三次握手少一次,都会发生意想不到的状况。

四次挥手

同样,我们用挂电话来模拟下

老李:你还有事吗?没事挂了吧。

老张:没什么事了

老张:挂了吧

老李:好的

挂断

我们再来模拟少了某个环节看看会发生什么问题。

假如少了第一句话,对话会变成这样:

老张:老李,你咋又不说话了?

老李:我要说的事说完了

老张:说完了,你不挂,浪费电话费。

假如少了第二句话,对话会变成这样:

老李:你还有事吗?没事挂了吧。

老张:挂了吧

老李:好的

挂断

猛一看没啥问题,对吧。假设老张还有事没说完呢?对话就变成:

老李:你还有事吗?没事挂了吧。

老张:有事(可能是服务端给客服端有数据要返回)

老李:啥事?

挂断失败

假设少了第三句话:

老李:你还有事吗?没事挂了吧。

老张:没什么事了,但是你先别挂,我这里有个酒局我不想回去,先假装打电话躲一会(现实中可能是服务端给客户端发送数据没有完成)

老李:好的

挂断失败

假设少了第四句,恰好老张麦克风坏了:

老李:你还有事吗?没事挂了吧。

老张:没什么事了

老张:挂了吧

老李:老张你说话啊

发现了吗?同样是少了任何一句都有可能导致意向不到的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值