客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。 请求报文的结构:
第一行包含了请求方法,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>HTTP协议是无状态的,原因是让HTTP协议尽可能简单,让它能够处理大量事务。所以服务器需要使用某种机制来识别特定的用户。
服务器为特定的用户创建了特定的Session,用于识别并跟踪该用户,这个Session是保存在服务器端的,并且有唯一的标识Session ID。
在第一次创建Session的时候,服务器告诉客户端,需要在Cookie里面记录一个Session ID,以后每一次请求的时候都把这个Session ID发送到服务器,服务器用这个Session ID 一查就能识别客户端的身份了。如果客户端禁用了Cookie,那么就通过URL重写技术,把Session_id作为参数放到url里面,在url里传递.
正向代理 正向代理是位于客户端和目标服务器之间的代理服务器。客户端向代理服务器发送请求,然后代理服务器向服务器发送请求,目标服务器返回内容给代理服务器,代理服务器返回内容给客户端。 优点:
通过代理服务器可以访问那些 代理服务器可以访问到的,但是自身无法访问的网站。提高访问速度。代理服务器会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息的时候,缓冲区中取出信息,传给用户,提高访问速度。隐藏用户的真实IP,免受攻击。反向代理 反向代理是指代理服务器接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,内部网络的服务器发送消息给代理服务器,代理服务器再把消息发送给客户端。常用的场景就是负载均衡。反向代理服务器作为负载均衡服务器,客户端把请求发送到负载均衡服务器上,负载均衡服务器再把请求转发给一台真正的服务器。 优点:
隐藏服务器的真实IP地址负载均衡,根据所有真实服务器的负载情况,将客户端的请求发到不同的真实服务器上。提高访问速度,对经常访问的内容提供缓存服务,提高访问速度。作为防火墙,提供安全保障服务。正向代理和反向代理的区别 正向代理是客户端的代理,一般由客户端架设;反向代理是服务器的代理,一般由服务器架设。
HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。散列函数完成消息完整性的过程如下: 通过对消息进行散列,然后把消息和散列值hashA一起发送出去,当接受者收到消息和散列值后,先对消息进行散列,如果散列值hashB和接收到的hashA相同,说明数据没有被更改过,从而保证数据的完整性。 常见的Hash函数有MD5,SHA-256,SHA-512. 对称加密算法有AES,DES. 非对称加密有RSA,ECC算法。
1 使用证书来分配公私钥
https://www.pianshen.com/article/71241175766/ 讲的很详细
客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加/解密)并发送给服务器;接着,根据pre_master_secret以及客户端与服务器的随机数值计算出对称加密密钥;发送一个特殊报文指示下面的报文都是使用了对称加密密钥加密;把所有的握手消息用Hash函数进行哈希,然后发送给服务器。服务器用自己的私钥解密得到pre_master_secret这个密码串,然后计算出对称加密的密钥。然后发送特殊报文指示以后的报文都使用对称加密密钥进行加密;把所有的握手消息都使用Hash函数进行哈希,然后发送给客户端。https://blog.csdn.net/chenshf26/article/details/105220196
HTTP1.1提供了更多可供选择的缓存头来控制缓存策略。
HTTP1.0中有浪费带宽的现象,例如客户端只是需要对象的一部分,但是服务器将整个对象送了过来。HTTP1.1则在请求头增加了一个range字段,只请求资源的某一个部分。
HTTP1.1新增了24个错误状态响应码。
HTTP1.1支持长连接和请求的流水线。长连接就是一个TCP链接可以进行多次HTTP通信。默认情况下,HTTP请求是按顺序发出的,当一个请求收到响应之后,下一个请求才会被发出,由于延迟和带宽的影响,这样可能需要等待很久。所以就有了流水线这一机制,流水线是在一条长连接上连续发出请求,在发送过程中不需要等待服务器对前一个请求的相应,这样可以减少延迟。但是服务器按照客户端发送的请求的顺序来处理请求,如果前一个请求非常耗时,后面的请求也要等着,这就是所谓的线头阻塞(Head of line blocking)问题。
HTTP1.0 只支持短连接。
HTTP1.x的解析是基于文本的。基于文本的解析存在着天然缺陷,文本的表现形式有多样性,做到健壮性考虑的场景要很多。HTTP2.0的解析基于二进制,实现方便,容易保障健壮性。
http2的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。
使用了Hpack方法进行头部压缩