白话http协议

240 阅读8分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

http协议概貌

完整的http协议需要了解如下几个方面。

  • http协议各个版本以及其特性
  • http协议的请求格式
  • http请求类型
  • http请求头的定义
  • http协议响应格式
  • http响应状态码的含义
  • http响应数据类型
  • https原理

http协议各个版本以及其特性

http 1.0

每次请求新建链接,请求完成关闭链接。性能低下

http 1.1

  • 支持长链接,通过keepalive来控制时长。tcp层按顺序处理http请求,同一个域名同一个tcp链接同一时间只能处理一个http请求。原因在于tcp回包中无法区分是哪个http请求的响应结果。
  • 如果第一个http请求较慢,会出现队首阻塞问题。
  • http1.1 采用多个tcp链接来提升http效率,默认为6个。

http 2

  • 为解决http 1.1的队首阻塞问题而出现。
  • 数据包为二进制数据流,拥有唯一的数据流id。用于区分不同的请求。
  • 同一域名,多个http请求复用一个tcp链接,会出现更加严重的队首阻塞效应。当某个tcp包发出后没有收到ack,服务器会一直重发这个包的ack。
  • gzip压缩头信息,减小头信息体积。同时客户端与服务器维护相同的头信息表单,并用索引号表示,发送头信息时只需要发送索引号。
  • http2 服务器可以主动推送数据给客户端。

http 3.0

http协议的请求格式

image 一个完整的 HTTP/1.1消息格式分三部分:

  • 请求行: {请求方法} {资源路径} {协议版本}
  • 请求头: 紧跟请求行的下一行,所有的请求头,除Host外都是可选的。
  • 消息体: 消息的主体部分,消息体的数据格式通过 header 里面的 Content-Type 属性指定
GET /test?p=abc HTTP/1.1
Host: www.huya.com

POST /test HTTP/1.1
Host: www.huya.com

http请求类型

  • GET 请求指定的页面信息,并返回实体主体。
  • POST 向指定资源提交数据进行处理请求。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT 从客户端向服务器传送的数据取代指定的文档的内容
  • DELETE 请求服务器删除指定的页面。
  • HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  • CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS 允许客户端查看服务器的性能。
  • TRACE 回显服务器收到的请求,主要用于测试或诊断

http请求头

  • Allow 服务器支持哪些请求方法(如GET、POST等)
  • Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型Accept-Encoding: gzip
  • Content-Encoding文档的编码方法,只有在解码后才得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间,但并非所有浏览器都支持gzip。
  • Content-Length表示实体内容长度,只有当浏览器使用持久HTTP连接时才需要这个数据。
  • Content-Type 表示文档的MIME类型
  • Date 当前的GMT时间,可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
  • Expires 文档的有效期时长,过期则不再缓存
  • Last-Modified 文档的最后改动时间,Last-Modified也可用setDateHeader方法来设置。
  • Location 表示提取文档位置,Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
  • Refresh 表示浏览器的文件的刷新间隔,N秒后刷新本页面或访问指定页面,此为扩展头,不属于HTTP 1.1正式规范。
  • Set-Cookie 设置和页面关联的Cookie,应使用HttpServletResponse提供的专用方法addCookie。

http响应格式

一个完整的 HTTP/1.1消息格式分三部分:

  • 响应行:{协议版本} {状态码} {状态描述}
  • 响应头: 紧跟响应行的下一行,详细请接下去看。
  • 响应体:消息的主体部分,就是服务器返回的资源内容
HTTP/1.1 200 OK
Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Coremonitorno: 0
Date: Fri, 11 Feb 2022 09:29:29 GMT
Server: apache
Set-Cookie: H_WISE_SIDS=107314_110085_127969_184716_185636_186844_188332_189037_189326_189755_190790_191068_191257_191287_192206_192386_192958_193283_193525_194085_194512_194520_195328_195342_195632_195757_196426_196514_197242_197471_197478_197711_197782_197930_197956_198256_198650_198664_198918_198930_199082_199157_199305_199468_199490_199571_199753_199845_200029_200349_200743_200960_201054_201104_201192_201328_201361_201554_201577_201581_201600_201625_201699_201733_201816_201933_201948_201979_202177_202392_202476_202544_202554_202561_202821_202917_203155_203194_203606_203629_203688_203706; path=/; expires=Sat, 11-Feb-23 09:29:28 GMT; domain=.baidu.com
Set-Cookie: bd_traffictrace=111729; expires=Thu, 08-Jan-1970 00:00:00 GMT
Set-Cookie: rsv_i=8da9v7Cd1KIsUrk85elyLuy6Pu7fUcDt0NseehvWpZ9ehIaKlH%2Fa6lZDiaQgIYBuZL%2FmcgZlNvghOHmUlQpQWHl9BC5bepc; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=315; path=/
Set-Cookie: eqid=deleted; path=/; domain=.baidu.com; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: __bsi=; max-age=3600; domain=m.baidu.com; path=/
Strict-Transport-Security: max-age=172800
Traceid: 164457176902820313707859668982931826203
Vary: Accept-Encoding
Transfer-Encoding: chunked

响应状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

http响应数据类型

  • application— (比如: application/vnd.ms-excel.)
  • audio (比如: audio/mpeg.)
  • image (比如: image/png.)
  • message (比如,:message/http.)
  • multipart (比如:multipart/form-data.)
  • text(比如:text/html.)
  • video(比如:video/quicktime.)

https

https = http+ssl/tls

tls是介于tcp层和http层中间的安全传输层协议,https的作用是保护数据的安全性,防止数据被窃听。

https出现的原因

  • 1.通信双方c/s需要对称加密秘钥要加密并传输数据,但是秘钥的传输会被监听。
  • 2.为了传输对称秘钥,采用公私钥加密体系。client用公钥加密对称秘钥,并传输给server,server用私钥解密获得对称秘钥,由于公钥是公开的,第三方即使能拿到公钥也无法解开数据获得对称秘钥。而服务器发送给client的数据虽然可以被公钥解开。但是没有对称秘钥,也无法获取到最终的数据。
  • 3.client需要获取到公钥,这个公钥如果被攻击,生成一个假的公钥,这样对称秘钥会被攻击者获取到。因此引入了CA机构,CA机构颁发证书给网站,里面存储了网站的公钥和网站明文信息。CA机构对这段数据用自己的私钥加密,服务器保存加密数据,每次有请求来临时先发送这段加密数据,有时候也叫发送证书信息。
  • 4.client发起请求,获取到证书信息后,用内置的CA证书的公钥解密数据获取到服务器的公钥,然后用公钥与服务器协商加密的对称秘钥。最后用对称秘钥进行传输

image

总结:

  • 1.CA秘钥加密证书信息放在s上,s每次请求先传输加密信息
  • 2.c用内置CA公钥解密信息获取服务器公钥
  • 3.c用公钥加密对称秘钥key,发送给s
  • 4.s用自己的私钥解密获取到key
  • 5.c和s通过key来传输信息。
  • 6.公私钥加密算法用到RSA,证书散列信息用到SHA,对称加密算法用到AES。 image