Http协议

words: 811    views:    time: 3min

Http(HyperText Transfer Protocol)超文本传输协议是一种用于在网络中传输网页、图像、音视频等超媒体数据的客户端-服务器通信协议,构成了万维网数据交换的基础。

报文格式

Http协议的报文格式比较简单,具体的请求方法、请求头和响应状态码,可以参考链接:https://http.dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 客户端拼接一个Http请求报文
try(Socket socket = new Socket("127.0.0.1", 8080);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// autoFlush = true
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))){
writer.println("GET /hello?name=shanhm HTTP/1.1");
writer.println("Host: 127.0.0.1:8080");
writer.println("Connection: keep-alive");
writer.println();

String line = null;
while((line = reader.readLine()) != null){
System.out.println(line);
}
}

// 服务端拼接一个Http响应报文
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 12
Date: Wed, 09 Jun 2021 08:09:49 GMT

hello shanhm

Http版本

HTTP/1.0(1996)

  • 默认短连接:服务器处理完成后立即断开TCP连接(发送Fin);
  • 无状态:服务器不跟踪每个客户端也不记录过去的请求;

HTTP/1.1(1997)

  • 支持Keep-Alive选项,默认长连接,避免建立和释放的开销;
  • 通过Content-Length来判断当前请求数据是否已经全部接受;

与HTTP/1.0的主要区别:

  1. 长连接:减少了建立和关闭连接的消耗和延迟。
  2. 缓存处理:1.1添加更多的缓存控制策略(如:Entity tag,If-Match);
  3. 网络连接的优化:1.1支持断点续传;
  4. 错误状态码的增多:1.1新增了24个错误状态响应码,丰富的错误码更加明确各个状态;
  5. Host头处理:支持Host头域,不在以IP为请求方标志,Host的引入使得虚拟主机托管成为可能,一台服务器可以承载多个域名网站;

HTTP/2.0(2015)

引入二进制数据帧和流的概念,其中帧对数据进行顺序标识;因为有了序列,服务器可以并行的传输数据。

与HTTP/1.1的主要区别:

  1. 新的传输格式:2.0使用二进制格式,1.0依然使用基于文本格式;
  2. 多路复用:连接共享,不同的request可以使用同一个连接传输(最后根据每个request上的id号组合成正常的请求);
  3. header压缩:由于1.X中header带有大量的信息,并且得重复传输,2.0使用encoder来减少需要传输的hearder大小;
  4. 服务端推送:同google的SPDUY(1.0的一种升级)一样;

HTTP/3.0(2022)

  • 基于QUIC(Quick UDP Internet Connections)协议,默认使用TLS 1.3加密;
  • 解决了HTTP/2.0在TCP层面的队头阻塞问题(丢包时不再阻塞所有流);
  • 连接迁移:在网络切换(如Wi-Fi切4G)时连接无需重新建立;

redirect & forward

  • redirect 重定向是两次请求,不能使用request对象来共享数据转发,地址栏会发生变化,可以访问其他站点(服务器)的资源;

  • forward 转发是一次请求,可以使用request对象共享数据,地址栏路径不变,只能访问当前服务器下的资源;


参考: