Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-12-24:为什么说Http是可靠的数据传输协议?

MoJieBlog opened this issue · comments

2019-12-24:为什么说Http是可靠的数据传输协议?
commented

因为使用的TCP

http是一套网络传输标准,一个基于TCP/IP通信协议来传递数据

HTTP是属于应用层的协议,TCP(传输控制协议)和UDP(用户数据报协议)是属于传输层的协议。

我们都知道TCP协议是面向连接的,每次进行连接都要进行三次握手和四次挥手,所以它的连接是可靠的。而HTTP是在TCP上层的协议,所以它也是可靠的。

那为什么TCP可靠?

首先来讲一下网络的分层,因特网协议可以分为五层,分别是:

应用层->传输层->网络互联层->网络访问层->物理层

或许你觉得很抽象,但是通过栗子你就会发现并没有那么复杂。

如访问一个Http请求:http://45.124.252.66:9090/main/

怎么访问到这个网站呢?首先我们需要通过网络,可能是移动网或者宽带网等(这就是物理层,它是一个传输介质),然后找到对应那一台被我们访问的服务器的mac地址(网络访问层)进行连接,再匹配它的IP(网络互联层)是否对应,确定了主机后,再通过端口号9090(传输层)访问对应的进程,由于一个进程里面有很多业务模块,而我们需要访问main模块(应用层),最终通过不同层来实现网站的访问。

每个层都是相互独立,并且向下依赖,而传输层是能确定唯一主机的,因为我们可以通过mac地址、host和端口来确定唯一的一台访问主机上面的进程。或许有的人会问,那如果网络中断呢?那不就不可靠了吗,我们常说的网络中断是属于物理层,由于是向下依赖,传输层的建立是依赖于下面的三层(网络互联层、网络访问层、物理层)已经连接成功,如果下面的层都没有连接成功,也就没有传输层这一说了,所以传输层协议是一个“靠谱”的协议。

我们通过分层了解了传输层是“靠谱”的协议,那么怎么保证它是可靠的呢?

那就要讲到三次握手和四次挥手的作用了。

三次握手就是在建立连接之前需要客户端需要先给服务端发出SYN(c)报文,当服务器收到后需要返回客户端ACK=SYN(c)+1,并且传输自己生成的SYN(s)给客户端,客户端收到后进入已连接状态,需要再回一个ACK=SYN(s)+1给服务器,服务器收到ACK后也进入了连接状态,这就是一个三次握手的过程,通过双方进行三次通信保证此时双方都已经进入准备状态。

四次挥手就是在结束连接的时候,客户端会发送FIN(c)给服务器,服务器收到后回复客户端ACK=FIN(c)+1告知客户端收到客户端的结束请求了,这时客户端就会进入CLOSING(半关闭状态),等待服务器的结束请求。 在一段小延迟时间后,服务器也会发送一个FIN(s)请求给客户端,客户端收到后发送ACK=FIN(s)+1给服务器,服务器收到ACK后就进入技术状态。客户端在等待2个MSL(避免服务器收不到ACK)后也进入结束状态。

在每次进行连接和断开连接都需要经过复杂的三次握手和四次握手,从而保证了每个连接都是可靠的,所以TCP协议是可靠的,而HTTP就是TCP上层的协议,所有连接都是基于TCP协议的。

在我们能够确定每个请求对应的唯一主机和端口号,并且通过Http协议添加响应的请求数据信息(如模块名字等)确定请求的代码位置,并且在每次请求都通过三次握手和四次挥手保证连接的可靠性,所以一个Http请求是可靠的。

HTTP协议在传输过程可能会被篡改、丢包现象,那么为什么说是可靠呢?可靠不应该指的是完整性和一致性