1.1 请简述 Http 与 Https 的区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
最后一点在Android 9.0 如果用http进行传输,需要在application节点下设置
android:usesCleartextTraffic="true"
1.2 说一说https、udp、socket区别?
https协议需要到CA申请证书。
http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http默认使用80端口,https默认使用443端口
TCP:传送控制协议(Transmission Control Protocol)
UDP:用户数据报协议 (UDP:User DatagramProtocol)
Socket:
这是为了实现以上的通信过程而建立成来通信管道,其真实的代表是客户端和服务器端的一个通信进程,双方进程通过socket进行通信,而通信的规则采用指定的协议。
socket只是一种连接模式,不是协议,socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
tcp、udp,简单的说(虽然不准确)是两个最基本的协议,很多其它协议都是基于这两个协议如,http就是基于tcp的,用socket可以创建tcp连接,也可以创建udp连接,这意味着,用socket可以创建任何协议的连接,因为其它协议都是基于此的。
1.3 请简述一次http网络请求的过程?
这个看OKHTTP的EventListerner就知道了。这里总结一张okhttp的回调表格。详细的需要自己阅读源码注释。
请求步骤 | 含义 |
---|---|
dnsStart | DNS解析开始 |
dnsEnd | DNS解析结束 |
connectStart | TCP连接开始 |
secureConnectStart | 建立TLS安全信道开始 |
secureConnectEnd | 信道建立结束 |
requestHeadersStart | 发送首部字段开始 |
requestHeadersEnd | 发送首部字段结束 |
requestBodyStart | 发送请求体开始 |
requestBodyEnd | 发送请求体结束 |
responseHeadersStart | 接受首部开始 |
responseHeadersEnd | 接受首部结束 |
responseBodyStart | 接受响应体开始 |
responseBodyEnd | 接受响应体结束 |
connectEnd | TCP连接断开 |
1.4 谈一谈TCP/IP三次握手,四次挥手?
常见的 TCP 中的头部数据表示
ACK:该位为 1 时,「确认应答」的字段变为有效,
TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段
TCP 三次握手
一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态
第一个报文—— SYN 报文
客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
第二个报文 —— SYN + ACK 报文
服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的 「确认应答号」字段填入 client_isn + 1, 接着把SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD 状态。
第三个报文 —— ACK 报文
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服端,这次报文可以携带客户到服务器的数据,之后客户端处于ESTABLISHED 状态。
服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态,此时 TCP 建立结束,双方可以收发数据。
为什么是三次握手?不是两次、四次?
- 三次握手才能保证双方具有接收和发送的能力
- 三次握手才可以阻止重复历史连接的初始化
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
客户端主动关闭连接 —— TCP 四次挥手
- 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
- 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
- 客户端收到服务端的 ACK 应答报文后,之后进入FIN_WAIT_2 状态。
- 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
- 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
- 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。
客户端和服务端都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT状态。
为什么挥手需要四次?
回顾上方四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。
1.5 为什么说Http是可靠的数据传输协议?
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请求是可靠的。
1.6 TCP/IP协议分为哪几层?TCP和HTTP分别属于哪一层?
四层
应用层 传输层 网络层 数据链路层
http是 应用层 tcp 是传输层 ip是网络层
http 每次请求 需要 三次握手四次挥手
三次握手
第一次 客户端发送seq,确定客户端的发送能力和服务端的接收能力
第二次 服务端返回seq和ack客户端确认了自己的发送能力和接收能力
第三次 客户端发送ack服务端确定了自己的发送能力由此进行数据传输
tpc断开时需要四次挥手
第一次 客户端发送 fin 给服务端
第二次 服务端收到,返回ack等于甲乙通话中,甲告诉乙我已经说完了,乙说我知道了,然后中间可能还有传输内容,乙还有话对甲说
第三次 服务端发送fin给客户端
第四次 客户端发送ack给服务端,等于乙告诉甲,我要说的话说完了,甲说知道了, 由此双方挂断电话
tcp是基于连接的,所以相对可靠
udp是直接发送,速度快但是不可靠
tcp可靠基于三次握手和四次挥手,和ack(回执机制) 如果客户端给服务端发送数据后没收到回执,会在一定条件下重复发送,并且他们在连接过程中中断,又会重新三次握手
http1.1 引入了keepalive机制,长连接,不必每次请求都是三次握手四次挥手,而是在超时时间内利用同一个 连接
http2.0 把基于文本传输改为基于二进制传输和多路复用
https 是在 http的基础上加上ssl安全套接字,加入了认证加密,增加了一定的安全性,但也不是完全安全,在app中需要将https证书改为严格模式,并且要提前将证书放在客户端,如果放在服务端下证书有可能被人抓走,https如果不是严格模式,也是可以进行抓包的。