面试经常碰到这样的问题:
- 简述下Http三次握手和四次挥手
- 为什么是三次握手,四次挥手?两次握手,三次挥手可以吗?
正常回答
三次握手
- 客户端(client)发送一个请求,向服务端(server)表示须要连接。然后等待服务端的回应。
- 服务端接收到这种请求包后,查看是否在接听的是指定的port,如果是,向我们表示,服务端连接已经准备好了,等待我们的确认。
- 客户端收到服务端的反馈后,发送确认建立连接的信息给服务端。
四次挥手:
- TCP客户端发送一个FIN。用来关闭客户到server的数据传送。
- server收到这个FIN。它发回一个ACK,确认序号为收到的序号加1。
- server关闭client的连接,发送一个FIN给client。
- 客户段发回ACK报文确认。并将确认序号设置为收到序号加1
这种回答对于真正了解的人来说,很容易理解。对于为什么是三次握手,四次挥手这个问题也很容易回答。但是对于一个新手来说就有点不太友好了。因为只靠死记硬背太难理解了,特别是过段时间还有可能忘记。
从生活中举例回答
三次握手
要回答这个问题,我们可以援引生活中的一个例子。比如打电话。
我们假设老李(客户端)要给老张(服务端)打电话,场景是怎样的呢?
老李:喂,你好老张。
老张:你好老张。
老李:嗯
老李:巴拉巴拉(已建立连接,开始说事,这一步不在发生在三次握手之后)
我们正常打电话的开场白都是这样的,有没有考虑过为什么会是这样?我们来看,这三句话,少了其中一句会咋样?
假如少了第一句,恰好老李的麦克风坏了:
老张:你好老张。
老李:嗯。
老李:巴拉巴拉(已建立连接,开始说事)
5秒后
老张:老李你是不是麦克风坏了?我听不到你说话。
我们再假设少了第二句,恰好老李的麦克风又坏了:
老李:喂,你好老张。
老李:嗯
老李:巴拉巴拉(已建立连接,开始说事)
老张:这个憨憨怎么打过来电话,一句话不说。
我们假设少了第三句,恰好老李要说的事比较复杂,在整理思路:
老李:喂,你好老张。
老张:你好老张。
老张:老李你能听到不?你倒是吱个声啊。
至此:我们发现三次握手少一次,都会发生意想不到的状况。
四次挥手
同样,我们用挂电话来模拟下
老李:你还有事吗?没事挂了吧。
老张:没什么事了
老张:挂了吧
老李:好的
挂断
我们再来模拟少了某个环节看看会发生什么问题。
假如少了第一句话,对话会变成这样:
老张:老李,你咋又不说话了?
老李:我要说的事说完了
老张:说完了,你不挂,浪费电话费。
假如少了第二句话,对话会变成这样:
老李:你还有事吗?没事挂了吧。
老张:挂了吧
老李:好的
挂断
猛一看没啥问题,对吧。假设老张还有事没说完呢?对话就变成:
老李:你还有事吗?没事挂了吧。
老张:有事(可能是服务端给客服端有数据要返回)
老李:啥事?
挂断失败
假设少了第三句话:
老李:你还有事吗?没事挂了吧。
老张:没什么事了,但是你先别挂,我这里有个酒局我不想回去,先假装打电话躲一会(现实中可能是服务端给客户端发送数据没有完成)
老李:好的
挂断失败
假设少了第四句,恰好老张麦克风坏了:
老李:你还有事吗?没事挂了吧。
老张:没什么事了
老张:挂了吧
老李:老张你说话啊
发现了吗?同样是少了任何一句都有可能导致意向不到的问题。