http协议细节

HTTP

特点

无连接,无状态。简单快速,灵活。
连接一次就断开。每次连接无法区分状态。

超文本传输协议。

请求过程

这里我们看一个请求的发出和响应。去请求百度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
➜  curl -v http://www.baidu.com/ #用户发起一个请求
* Trying 182.61.200.7...
* TCP_NODELAY set
* Connected to www.baidu.com (182.61.200.7) port 80 (#0) # 接下来是请求报文
> GET / HTTP/1.1 # 请求行
> Host: www.baidu.com # 请求头
> User-Agent: curl/7.58.0
> Accept: */*
> # 空行
< HTTP/1.1 200 OK # 响应报文
< Accept-Ranges: bytes # 以下都是响应头
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Mon, 04 Nov 2019 14:00:38 GMT
< Etag: "588604c8-94d"
< Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< # 空行
<!DOCTYPE html> # 以下是响应体
</html>
* Connection #0 to host www.baidu.com left intact # 断开

请求内容

  • 请求行
  • 实体

    方法

状态码

  • 1xx
  • 200 ok
  • 206 客户端range。 video 时候206
  • 301 永久重定向
  • 302 临时重定向
  • 304 有缓存
  • 400 语法错误
  • 401 未授权
  • 403 禁止访问
  • 404 不存在
  • 5xx 服务器问题

持久连接

http1.1 通过 keep-alive中间不断开。

管线化。先打包请求,打包一次响应。只有get和head可以进行管线化,由于各种问题,现代浏览器默认不开启管线化。

TLS

加密,对称加密,非对称加密
对称加密:两边都有密钥,都知道怎么加密解密。如果密钥在网络传输中被拦截,就不行了

非对称加密:公钥 私钥。用公钥加密,用私钥解密,私钥只有发公钥的才知道。

http/2

多路复用

以前为了优化,会使用雪碧图,小图内联,多域名cdn。
有了 多路复用,一个tcp可以传输所有数据,解决了统一域名请求数量限制的问题。

二进制传输

把文本变成二进制编码

header 压缩

相同的内容就压缩了,减少了后续header的大小

服务端push

收到某个请求后,主动推送其他资源。兼容性的话,可以 prefetch

HTTP/3

如果多路复用时候丢包了,那性能就差了。

后来google基于udp搞了一个quic协议,使用 http/3
http3最大的改造就是 使用了 quic
细节有点儿没掌握。

请我喝杯咖啡吧~