Android经典面试题;http三次握手,四次挥手
在Android面试题中,有一道很经典的题,题目是这样的:请问在浏览器中,输入URL地址后,发生了什么?这道题最主要的就是考察HTTP三次握手的知识点,这就涉及到计算机网络的相关知识点了。
HTTP三次握手:
在HTTP三次握手中,http负责请求和响应,Request和Response,而tcp才是负责数据的传输,重传,丢包这些的。在http发起请求时,tcp会建立一个连接,而http则是在这个链接的基础上建立的,另外,在tcp上面,是可以发送多个http请求的,。在http1.0版本,http发起请求,请求响应之后,这个http链接就关闭了,而在http1.1版本,则会形成一个连接池,不会关闭。而三次握手是这样子的:http发起请求,服务器响应,http再请求,这样就是三次,也就是http的三次握手,这样就创建出了tcp的链接。
点击获取资料文档;【腾讯T4级别Android架构师技术脑图+全套视频】
关于图里的SYN=1,"=1"是属于报文(物理层是比特流,数据链路层是帧,网络层是包或分组,传输层以上是报文)的第一位数字,再深入下去就属于网络的知识了,我们还是用白话文再回顾一下三次握手以及四次挥手:
三次握手(连接):
小提示:三次握手四次断开,只与TCP协议有关,SNMP, DNS都是UDP, 这些应用不三次握手。
第一次握手:客户端发送到服务器,并说:喂,你听见了吗?
第二次握手:服务器发送到客户端,并说:喂,我听见了!
第三次握手:客服端发送到服务器,并说:既然你听见了,那我们建立一个TCP连接吧!
四次挥手(关闭):
小提示:中断请求的话,可以是客户端,也可以是服务端。
第一次挥手:如果是客户端,发起中断请求,那么会对服务器说:“我没有数据了,但是你如果还有数据没有发送给我,可以先不慌着关闭Socket,可以继续发送数据哟!”
第二次挥手:服务器告诉客户端:“你的话我知道了,但是我还没准备好,我还要等你的确认消息”。于是就等待消息,如果确定了数据已发送完成,则会告诉客户端,你可以关闭连接了。
第三次挥手:客户端收到服务端的话之后,知道可以关闭连接了,但是他还不相信网络,怕服务器不知道要关闭,于是又发送了一条信息,确认下,如果服务端没收到,则可以重传。
第四次挥手:服务端收到消息,断开连接,不通信了,客户端等待了2MSL后还没收到回复,就说明服务端关闭了,那么我也关闭了。
【问题】为什么连接的时候是三次握手,关闭的时候却是四次握手?
白话文来讲,是因为在第三次挥手的时候,客户端不信任网络,所以要向服务端在发送一次信息,进行确认。