什么是HTTP协议?
答
HTTP 协议,全称超文本传输协议,是一个无状态协议,也就是说服务器不维护任何有关客户端过去所发请求的消息。HTTP 是应用层协议,它以TCP(http 3之前)作为底层协议,http 3开始采用UDP协议。
什么是 TCP协议?什么是 UDP 协议?
答
TCP 是一种面向有连接的传输层协议,能够对自己提供的连接实施控制。适用于要求可靠传输的应用,例如文件传输。面向字节流,传输慢。需要三次握手和四次挥手。
UDP 是一种面向无连接的传输层协议,不会对自己提供的连接实施控制。适用于实时应用,例如:IP电话、视频会议、直播等,以报文的方式传输,效率高
TCP 的头部格式?
答
- 序列号:在初次建立连接的时候,客户端和服务端都会为「本次的连接」随机初始化一个序列号。(纵观整个TCP流程中,序列号可以用来解决网络包乱序的问题)
- 确认号:该字段表示「接收端」告诉「发送端」对上一个数据包已经成功接收(确认号可以⽤来解决网络包丢失的问题)
- 标记位就很好理解啦。SYN为1时,表示希望创建连接。ACK为1时,确认号字段有效。FIN为1时,表示希望断开连接。RST为1时,表示TCP连接出现异常,需要断开。
什么是三次握手?
答
TCP三次握手的过程其实就是在:确认通信双方(客户端和服务端)的序列号
过程
- 首先一开始客户端和服务端都处于close,服务的监听端口,于是处于listen状态。
- 客服端要发起请求,于是初始化序列号(client_isn),标志位设为SYN,然后把报文发送给服务端,进入syn_send状态;
- 服务端收到请求,也初始化序列号(server_isn),将确认号设为client_isn+1,并且把 SYN 和 ACK 设为1。然后把报文发送给客户端,进入SYN-REVD状态;
- 客户端收到后,将确认号改为server_isn+1,并把ack设为1。客户端在发送报文之后,进入established状态
- 服务端收到后,也进入established状态,此后就可通信了。
总结:就好比初次见面打招呼:
who are you(syn)? Im find,think you,and you(syn+ack)? Im find too(ack).
那两次握手行吗?
答
由上图可知,如果只有两次,只能确保服务端收到了客户端的序列号,但是不知道客户端是否收到,所以不行。
既然网络是不可靠的,那要是在中途丢了,怎么办?
答
前面两次,如何丢包,在一定时间内会重发。
最后一次,客户端已经就绪,如果丢包,下一次会将数据和ack一起发过去。
什么是四次挥手?
答
四次挥手就是确认断开的过程,可由任意一方发起。
过程
- 客户端需要断开时,将FIN设为1,发送报文给服务的,将进入FIN_WAIT_1状态;
- 服务的收到请求后,回复ACK报文,之后服务端进入CLOSE_WAIT状态;
- 客户端收到后,进入FIN_WAIT_2状态;
- 这时,如果服务端还是数据就接着传,没有就发送FIN给客户端,然后进入LAST_ACK状态;
- 客户端收到后,回应ACK报文,自己进入 TIME_WAIT 状态。
- 服务端收到客户端的ACK报文之后,服务端就进入 CLOSE 状态
- 客户端在TIME_WAIT等到2MSL,也进入了 CLOSE 状态。
TIME_WAIT 状态,你知道这个状态干什么用的吗?(等待 2MSL)
主要有两个原因
- 保证最后的 ACK 报文 「接收方」一定能收到(如果收不到,对方会 重发 FIN 报文)
- 确保在创建新连接时,先前网络中残余的数据都丢失了
总结:就好比离职。给领导说你要离职(FIN),领导收到后,回复你好的(ACK)。然后领导可能找你谈话(…),如果没有想谈的,他就说尊重你的决定(fin)。你就会回复感谢领导(ACK)。然后你就等到手上没事了就可以走了。
HTTP各个版本之间的区别?
答
- HTTP1.0 默认是短连接,每次与服务器交互,都需要新开一个连接
- HTTP1.1 最主要的是「默认持久连接」只要客户端服务端没有断开TCP连接,就一直保持连接,可以发送多次HTTP请求。其次就是断点续传(Chunked transfer-coding)。利用HTTP消息头使用分块传输编码,将实体主体分块进行传输
- HTTP2 不再以文本的方式传输,采用二进制分帧层,对头部进行了压缩,支持流控,最主要就是HTTP/2是支持多路复用的(通过单一的TCP连接「并行」发起多个的请求和响应消息)
- HTTP3 跟前面版本最大的区别就是:HTTP1.x和HTTP2底层都是TCP,而HTTP3底层是UDP。使用HTTP3能够减少RTT「往返时延」(TCP三次握手,TLS握手)
管线化和多路复用有什么区别?
答
HTTP1.1提出的「管线化」只能「串行」(一个响应必须完全返回后,下一个请求才会开始传输)
TTP/2多路复用则是利用「分帧」数据流,把HTTP协议分解为「互不依赖」的帧(为每个帧「标序」发送,接收回来的时候按序重组),进而可以「乱序」发送避免「一定程度上」的队首阻塞问题
什么是HTTPS?
答
HTTPS是「安全」的HTTP协议(客户端与服务端的传输链路中进行加密)。HTTPS 是基于 HTTP 的,也是用 TCP 作为底层协议,并额外使用 SSL/TLS 协议用作加密和安全认证。默认端口号是 443.
注:SSL 指安全套接字协议(Secure Sockets Layer)在 1999 年,SSL 3.0 进一步升级,新版本被命名为 TLS 1.0
HTTPS的过程?
答
HTTPS首先要解决的是:认证的问题
客户端是需要确切地知道服务端是不是「真实」,所以在HTTPS中会有一个角色:CA(公信机构)
服务端在使用HTTPS前,需要去认证的CA机构申请一份「数字证书」。数字证书里包含有证书持有者、证书有效期、服务器公钥等信息,CA机构也有自己的一份公私钥,在发布数字证书之前,会用自己的「私钥」对这份数字证书进行加密。等到客户端请求服务器的时候,服务端返回证书给客户端。客户端用CA的公钥对证书解密(因为CA是公信机构,会内置到浏览器或操作系统中,所以客户端会有公钥)。
这个时候,客户端会判断这个「证书是否可信/有无被篡改」,私钥加密,公钥解密我们叫做「数字签名」(这种方式可以查看有无被篡改),到这里,就解决了「认证」的问题,至少客户端能保证是在跟「真实的服务器」进行通信(非对称加密)。
其次就要解决保密问题,如何确保客户端与服务器的通讯内容在传输中不会泄露给第三方。
客户端从CA拿到数字证书后,就能拿到服务端的公钥。客户端生成一个Key作为「对称加密」的秘钥,用服务端的「公钥加密」传给服务端,服务端用自己的「私钥解密」客户端的数据,得到对称加密的秘钥,之后客户端与服务端就可以使用「对称加密的秘钥」愉快地发送和接收消息。(对称加密)
四层协议与七层协议?
答
7层是指OSI七层协议模型,主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
4层是指TCP/IP四层模型,主要包括:应用层、运输层、网际层和网络接口层。
4层协议和对应的标准7层协议的关系如下图: