HTTP的知识点

    科技2022-08-04  101

    HTTP相关

    一. 基础概念1. 请求和响应报文常用首部记忆 二. HTTP相关知识点1. 状态码1.1 常见的状态码记住 2.Cookie和Session3. 正向代理和反向代理 三.HTTPS相关1. 为什么要使用HTTPS2. HTTPS和HTTP的区别3.TLS/SSL的原理4. 对称加密的缺点为什么非对称加密比对称加密要慢5.公钥分发的解决办法6.SSL握手6.1 四次握手6.2 为什么要使用Hash 四. HTTP每一代之间的差别1. HTTP1.0和HTTP1.1的一些区别1. 缓存处理2. 带宽优化3. 错误通知的管理4. 长连接 HTTPS和HTTP的一些区别HTTP2.0和HTTP1.x的区别使用新的解析方式多路复用header压缩服务端推送(server push) HTTP3.0

    一. 基础概念

    1. 请求和响应报文

    客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。 请求报文的结构:

    第一行包含了请求方法,URL,协议和协议的版本接下来多行都是请求首部Header,每个首部都有一个首部名称,以及对应的值。一个空行分割首部和内容主体Body最后是请求的主体内容 GET http://www.example.com/ HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cache-Control: max-age=0 Host: www.example.com If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT If-None-Match: "3147526947+gzip" Proxy-Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 xxx param1=1¶m2=2

    响应报文的结构:

    第一行包含协议及其版本, 状态码,状态码的描述接下来多行是首部内容一个空行分割首部和内容主体最后是响应的内容主体 HTTP/1.1 200 OK Age: 529651 Cache-Control: max-age=604800 Connection: keep-alive Content-Encoding: gzip Content-Length: 648 Content-Type: text/html; charset=UTF-8 Date: Mon, 02 Nov 2020 17:53:39 GMT Etag: "3147526947+ident+gzip" Expires: Mon, 09 Nov 2020 17:53:39 GMT Keep-Alive: timeout=4 Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Proxy-Connection: keep-alive Server: ECS (sjc/16DF) Vary: Accept-Encoding X-Cache: HIT <!doctype html> <html> <head> <title>Example Domain</title> // 省略... </body> </html>

    常用首部记忆

    首部字段名说明Cache-Control控制缓存的行为Host请求资源所在的服务器From用户的电子邮箱地址Date创建报文的日期时间Transfer-Encoding指定报文主体的传输编码方式Accept-Charset通知服务器用户代理支持的字符集及字符集的相对优先顺序Accept-Encoding告知服务器用户代理支持的内容编码及内容编码的优先顺序,并可一次性指定多种内容编码Accept-Language告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级

    二. HTTP相关知识点

    1. 状态码

    状态码类别1XX接收的请求正在处理2XX成功3XX重定向4XX客户端错误5XX服务器错误

    1.1 常见的状态码记住

    100 Continue:表明目前为止都很正常,客户端可以忽略这个响应200 OK:请求处理成功301 Moved Permanently: 永久重定向302 Found: 临时重定向400 Bad Request: 请求报文中存在语法错误401 用户没有访问权限,需要进行身份认证403 Forbidden: 请求被拒绝404 Not Found: 找不到资源503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求

    2.Cookie和Session

    HTTP协议是无状态的,原因是让HTTP协议尽可能简单,让它能够处理大量事务。所以服务器需要使用某种机制来识别特定的用户。

    服务器为特定的用户创建了特定的Session,用于识别并跟踪该用户,这个Session是保存在服务器端的,并且有唯一的标识Session ID。

    在第一次创建Session的时候,服务器告诉客户端,需要在Cookie里面记录一个Session ID,以后每一次请求的时候都把这个Session ID发送到服务器,服务器用这个Session ID 一查就能识别客户端的身份了。如果客户端禁用了Cookie,那么就通过URL重写技术,把Session_id作为参数放到url里面,在url里传递.

    3. 正向代理和反向代理

    正向代理 正向代理是位于客户端和目标服务器之间的代理服务器。客户端向代理服务器发送请求,然后代理服务器向服务器发送请求,目标服务器返回内容给代理服务器,代理服务器返回内容给客户端。 优点:

    通过代理服务器可以访问那些 代理服务器可以访问到的,但是自身无法访问的网站。提高访问速度。代理服务器会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息的时候,缓冲区中取出信息,传给用户,提高访问速度。隐藏用户的真实IP,免受攻击。

    反向代理 反向代理是指代理服务器接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,内部网络的服务器发送消息给代理服务器,代理服务器再把消息发送给客户端。常用的场景就是负载均衡。反向代理服务器作为负载均衡服务器,客户端把请求发送到负载均衡服务器上,负载均衡服务器再把请求转发给一台真正的服务器。 优点:

    隐藏服务器的真实IP地址负载均衡,根据所有真实服务器的负载情况,将客户端的请求发到不同的真实服务器上。提高访问速度,对经常访问的内容提供缓存服务,提高访问速度。作为防火墙,提供安全保障服务。

    正向代理和反向代理的区别 正向代理是客户端的代理,一般由客户端架设;反向代理是服务器的代理,一般由服务器架设。

    三.HTTPS相关

    1. 为什么要使用HTTPS

    HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。

    2. HTTPS和HTTP的区别

    HTTPS是加密传输协议,HTTP是明文传输的协议。HTTPS需要用到SSL证书,而HTTP不用。HTTPS的标准端口是443,HTTP则是80

    3.TLS/SSL的原理

    HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。散列函数完成消息完整性的过程如下: 通过对消息进行散列,然后把消息和散列值hashA一起发送出去,当接受者收到消息和散列值后,先对消息进行散列,如果散列值hashB和接收到的hashA相同,说明数据没有被更改过,从而保证数据的完整性。 常见的Hash函数有MD5,SHA-256,SHA-512. 对称加密算法有AES,DES. 非对称加密有RSA,ECC算法。

    4. 对称加密的缺点

    密钥更换,传递和交换需要可靠的信道不能实现数字签名需要保存的密钥数量很多,每个用户需要保存其他用户的对称密钥。加密密钥和解密密钥相同,或者一个密钥可以从另一个导出,能加密就能解密,加密能力和解密能力是结合在一起的,开放性差。 非对称密码:加密密钥和解密密钥不相同,从一个密钥导出另一个密钥是计算上不可行的,加密能力和解密能力是分开的,开放性好。

    为什么非对称加密比对称加密要慢

    对称加密主要的运算是位运算,速度很快。如果用硬件来实现,速度会更快。RSA主要是幂运算,幂运算的基础单位是乘法,乘法的基础单位是加法。在电路上实现加法要比实现异或要麻烦的多,所以非对称加密要慢。

    5.公钥分发的解决办法

    1 使用证书来分配公私钥

    6.SSL握手

    6.1 四次握手

    https://www.pianshen.com/article/71241175766/ 讲的很详细

    客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加/解密)并发送给服务器;接着,根据pre_master_secret以及客户端与服务器的随机数值计算出对称加密密钥;发送一个特殊报文指示下面的报文都是使用了对称加密密钥加密;把所有的握手消息用Hash函数进行哈希,然后发送给服务器。服务器用自己的私钥解密得到pre_master_secret这个密码串,然后计算出对称加密的密钥。然后发送特殊报文指示以后的报文都使用对称加密密钥进行加密;把所有的握手消息都使用Hash函数进行哈希,然后发送给客户端。

    6.2 为什么要使用Hash

    使用Hash算法对握手消息进行Hash是为了防止握手本身遭受篡改。设想一个攻击者想要控制客户端与服务器所使用的算法。客户端提供多种算法的情况相当常见,某些强度弱而某些强度强,以便能够与仅支持弱强度算法的服务器进行通信。攻击者可以删除客户端在第1步所提供的所有高强度算法,于是就迫使服务器选择一种弱强度的算法。对之前的消息进行Hash并 交换就能阻止这种攻击,因为客户端的MAC是根据原始消息用Hash函数计算得出的,而服务器的MAC是根据攻击者修改过的消息计算得出的,这样经过检查就会发现不匹配。由于客户端与服务器所提供的随机数为密钥产生过程的输入,所以握手不会受到重放攻击的影响。这些消息是首个在新的加密算法与密钥下加密的消息。

    四. HTTP每一代之间的差别

    https://blog.csdn.net/chenshf26/article/details/105220196

    1. HTTP1.0和HTTP1.1的一些区别

    1. 缓存处理

    HTTP1.1提供了更多可供选择的缓存头来控制缓存策略。

    2. 带宽优化

    HTTP1.0中有浪费带宽的现象,例如客户端只是需要对象的一部分,但是服务器将整个对象送了过来。HTTP1.1则在请求头增加了一个range字段,只请求资源的某一个部分。

    3. 错误通知的管理

    HTTP1.1新增了24个错误状态响应码。

    4. 长连接

    HTTP1.1支持长连接和请求的流水线。长连接就是一个TCP链接可以进行多次HTTP通信。默认情况下,HTTP请求是按顺序发出的,当一个请求收到响应之后,下一个请求才会被发出,由于延迟和带宽的影响,这样可能需要等待很久。所以就有了流水线这一机制,流水线是在一条长连接上连续发出请求,在发送过程中不需要等待服务器对前一个请求的相应,这样可以减少延迟。但是服务器按照客户端发送的请求的顺序来处理请求,如果前一个请求非常耗时,后面的请求也要等着,这就是所谓的线头阻塞(Head of line blocking)问题。

    HTTPS和HTTP的一些区别

    HTTPS协议需要向CA(CA, Certificate Authority,证书颁发机构)申请证书,一般免费的证书很少,需要交费。HTTP运行在TCP之上,所有传输的内容都是明文。HTTPS运行在SSL/TLS之上,SSL/TSL运行在TCP之上,所有传输的内容都是经过加密的。HTTP用的端口是80,HTTPS用的是443.

    HTTP2.0和HTTP1.x的区别

    HTTP1.0 只支持短连接。

    使用新的解析方式

    HTTP1.x的解析是基于文本的。基于文本的解析存在着天然缺陷,文本的表现形式有多样性,做到健壮性考虑的场景要很多。HTTP2.0的解析基于二进制,实现方便,容易保障健壮性。

    多路复用

    http2的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。

    header压缩

    使用了Hpack方法进行头部压缩

    服务端推送(server push)

    HTTP3.0

    基于google的quic协议,quic协议是用udp实现的。减少了tcp三次握手的时间。解决了HTTP2.0因为前一个stream丢包导致后一个stream被阻塞的问题。不再使用tcp四元组来确定一个连接,而是用一个64位随机数。
    Processed: 0.017, SQL: 8