咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

深入解析HTTP--Chunk分块发送

需求

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

客户端给服务器发送数据也一样可以使用 Chunk 传输,比如,客户端要上传数据,但是数据没有完全生成,通过chunk分块传输,就可以一边生成数据一边上传,典型的比如:上传录音。

服务端接收数据

1
2
3
4
5
@PostMapping(value = "/upload")
public String upload(@RequestBody byte[] body){

return "PONG:"+body.length;
}

postman一次发送body,如下图:

postman_post_body.png

客户端分块发送

  1. chunk 需要加入头:Transfer-Encoding: chunked
  2. 每个 chunk 块的格式都是:[chunk size][CRLF][chunk data][CRLF]
  3. 结束 chunk 块是0,也就是:[0][CRLF][CRLF]

举例:

发送一个请求,body 内容为 12HELLO,其中 12 是一个 chunk 包,HELLO是一个 chunk 包。

分块请求体:

1
2
3
4
5
6
7
8
9
10
11
POST /test/upload HTTP/1.1\r\n
Host: 192.168.0.223:7878\r\n
Connection: keep-alive\r\n
Content-Type: text/plain\r\n
Transfer-Encoding: chunked\r\n
\r\n
2\r\n
12\r\n
5\r\n
HELLO\r\n
0\r\n\r\n

原始数据:

1
2
3
4
5
6
7
8
9
10
11
12
504f5354202f746573742f75706c6f616420485454502f312e310d0a
486f73743a203139322e3136382e302e3232333a373837380d0a
436f6e6e656374696f6e3a206b6565702d616c6976650d0a
436f6e74656e742d547970653a20746578742f706c61696e0d0a
5472616e736665722d456e636f64696e673a206368756e6b65640d0a
0d0a
32
0d0a
3132
0d0a
350d0a48454c4c4f0d0a
300d0a0d0a