什么是http

超文本传输协议,是一种在客户端(例如浏览器)和服务器之间进行数据编码和传输的协议。因为信息以超文本文档的形式进行交换,所以叫这个。

http是在计算机世界里专门用来在两点之间传输数据的约定和规范。

http是应用层协议,正常运行依赖传输控制(tcp)等网络层协议。

http资源使用统一资源定位符Url在互联网上进行标识。

http遵循“请求-响应”的范式,即客户端发出请求,服务器发送响应。请求和响应中间可能经过多个路由和代理服务器,它允许中介服务器提供增值服务(如负载均衡、缓存、加密、压缩等)。


http五类状态码

1xx 提示信息,协议处理的中间状态

2xx 传输成功

3xx 重定向 资源位置发生变动,需要客户端重新发送请求 301 302 304

4xx 客户端错误 请求报文有误,服务器无法处理 400 403 404

5xx 服务器错误,服务器处理请求时内部发生错误。500 501 502 503 504


http常见字段

Host:客户端发送请求时,用来指定服务器的域名

Content-Length:服务器返回数据时,标识回应数据的长度,通过Content-Length找到HTTP body的边界。解决“粘包”问题。

Connection :常用于客户端要求服务器使用[HTTP长连接]机制(Keep-Alive)HTTP/1.1版本默认连接是长连接,但为了兼容老版本的HTTP,需要指定Connection值为Keep-Alive。开启HTTP-Alive后连接不会中断,当客户端发送另一个请求时,会使用同一个连接,知道客户端/服务端提出断开连接。

Accept:客户端请求时,可以使用Accept声明自己可以接收哪些格式。(*/*)

Content-Type:服务器回应时,告诉客户端,本次数据时什么格式。(text/html;Charset=utf-8)

Accept-Encoding:客户端能接受的压缩数据方法。

Content-Encoding:说明数据的压缩方法。表示服务器返回时使用了什么压缩格式。(gzip)


GET方法是安全、幂等、可被缓存的

POST方法是不安全、不幂等、不可缓存的

安全指的是会不会破环服务器上的资源 | 幂等是多次执行相同的操作,结果是相同的

HTTP缓存有两种实现方式:强制缓存和协商缓存

强制缓存:浏览器判断缓存没过期,就直接使用浏览器的本地缓存,主动权在浏览器这边

(Status code:200(from disk cache)使用了强制缓存)

强制缓存利用两个HTTP响应头部实现,表示资源在客户端的缓存有效期:

Cache-Control:是一个相对时间 (优先级更高)

Expires:是一个绝对时间

协商缓存:当服务端的响应码是304时,表示告诉客户端可以使用本地缓存的资源,这种服务端告诉客户端是否可以使用缓存的方式称为协商缓存。


版本:

HTTP/1.1 无状态、 明文传输

无状态:好处是服务器压力小,坏处是关联性的操作会麻烦(Cookie是一种解决无状态的方案)

明文传输等不安全问题,通过HTTPS的方式解决。

1.1对比1.0 的改进:

使用长连接,改善了短连接造成的性能开销

支持管道网络传输,第一个请求发出去后,不必等其回来,就可以发出第二个请求


HTTP/2 性能改进:

头部压缩、二进制格式、并发传输(支持交错的请求和响应)、服务器主动推送资源

HTTP/3 底层使用UDP


http请求

一文说明HTTP请求_HTTP

一次http操作分为四个步骤:

  1. 建立连接

TCP的三次握手

first:客户端发送SYN=j码给服务端,表示想要建立连接,进入SYN_SEND状态

second:服务端返回ACK(=j+1)应答,同时发送自己的SYN(=k),表示可以建立连接,进入SYN_RECV状态

third:客户端收到SYN和ACK后,回传ACK=k+1给服务端,说明自己已经收到ACK,之后进入ESTABLISHED状态,完成三次握手。


为什么会有三次握手而不是两次握手呢?

因为TCP有超时重连机制,防止旧的重复连接初始化造成混乱(可能建立一个历史连接导致资源浪费)。


https在tcp连接的基础上,要加上SSL/TLC建立连接的四次握手(总共7次)

握手过程中,针对会话使用的对称密钥,使用非对称加密

会话过程中使用对称加密。

数字证书保证公钥一定来自服务器。(服务器注册到CA,CA(数字证书认证机构)办法数字证书。服务器下发公钥和CA数字证书,客户端使用CA的公钥确认真实性,只要证书可信,公钥就可信)

first:客户端发送可用的加密算法

second:服务端选择的加密算法和公钥

third:客户端发送用公钥加密要使用的对称加密算法和密钥信息

fourth:服务端用私钥解密,开始使用对称加密来发送信息,握手结束


  1. 发送请求

请求报文格式:

请求行 -- 请求头 - - 报文主体

请求行三部分: 请求方法、请求地址、协议版本

请求方法HTTP/1.1定义的有8种:GET POST PUT DELETE PATCH HEAD OPTIONS TRACE

PATCH: 局部修改,对PUT的补充

HEAD: 只获取头

OPTIONS: 对服务器支持请求方法的嗅探

TRACE:回显服务器收到的请求,用于定位问题,有安全风险


一文说明HTTP请求_客户端_02

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头

一文说明HTTP请求_服务器_03


  1. 响应

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

一文说明HTTP请求_HTTP_04

一文说明HTTP请求_服务器_05


  1. 断开连接

4次挥手

first:客户端发送FIN报文,进入FIN_WAIT_1状态

second:服务端收到后,发送ACK应答报文,进入CLOSE_WAIT状态

           (收到ACK后客户端进入FIN_WAIT_2状态)

third:服务端处理完数据后,再向客户端发送FIN报文,进入LAST_ACK状态

fourth:客户端收到FIN报文后,回复一个ACK应答报文,进入TIME_WAIT 状态(2MSL后进入CLOSE)



名词预热:

超文本:可以显示在电脑上或其他电子设备上的文本,普遍以电子文档的方式存在。拥有超链接,可以从一个超文本跳转到另一个超文本。HTML就是常见的超文本。

TCP协议:面向连接的,可靠的、基于字节流的传输层通信协议。

基于字节流:与UDP面向报文不同,消息通过UDP协议传输时,操作系统不会对消息进行拆分,每个UDP报文就是一个用户消息的边界。多个UDP报文会插入队列。 而通过TCP协议传输时,消息可能被操作系统分组成多个TCP报文。如果接收方不知道发送方的消息长度,就不知道消息的边界,无法读出一个有效的用户消息。当两个消息的某个部分被分到同一个TCP报文时,就会出现常说的TCP粘包问题。

解决这个问题,要交给应用程序。一般有三种分包的方式:

固定长度的消息

特殊字符作为边界(HTTP)

自定义消息结构

SSL/TLS: 安全套接字,是一种用于在网络上的两个设备之间创建安全连接的技术。(SSL是一种较老的技术)TLS传输层安全协议是SSL的升级版。SSL技术已启用,但说法还存在。


网络七层模型      按功能不同,人为划分,实际并不存在。


应用层            应用层                    应用层           http

表示层

会话层     

传输层            传输层                   传输层

网络层            网络层                   网络层            tcp

数据链路层       数据链路层             网络接口层

物理层            物理层

对称加密: 使用相同的密钥进行加密、解密

非对称加密:也叫公开密钥加密。需要两个密钥,一个公开密钥,一个私有密钥。公钥加密、私钥解密。



面试时可能提问的点:

HTTP的Keep-Alive跟TCP的Keepalive区别?

HTTP的Keep-Alive也叫Http的长连接,是由应用程序实现的,可以使用同一个TCP连接发送和接收多个HTTP请求/应答,减少了Http短连接带来的多个TCP连接建立和释放的开销

TCP的Keepalive也叫TCP保活机制,该功能由内核实现的,当客户端和服务端长达一定时间内没有进行数据交互时,内核为了确保连接还有效,就会发送探测报文,检测对方是否在线来决定是否关闭连接。




如有不明白的地方,请留言提问,后续会尽量补充。