一些关于HTTP的问题

Posted by Keal on March 12, 2021

http基于tcp,http报文包含在了tcp的payload里.

如何解析http报文:

http报文包含了请求行,请求头,和请求体. 三个内容通过\r\n来分隔.因此可以通过\r\n来区分请求行,请求头和请求体.

请求体中的数据有两种可能:如果客户端传递的请求头中包含了Content-length,则可以根据其长度来接收.

如果没有指明Content-length,则一定会通过Transfer-Coding:Chunked来指明以chunk的形式传输. 最后一个chunk是一个长度为0的空chunk,只包含一个\r\n

http连接的复用

目的是希望能够在一个tcp连接里处理多个http的请求,减少频繁建立tcp连接的消耗.

http1.0

通过在请求头中加入Coneection: Keep-alive来实现

http1.1

默认就是keep-alive,除非显示指明Connection: close

Pipeline

Pipeline技术

相较于一次客户端请求对应一次服务端响应. Pipeline技术可以让客户端发送请求后不用等待服务端响应而继续发送下一个请求.

优点:

节约了总的通信时长,因为不需要等上一个请求的响应,所以节省了一个RTT

缺点:

因为根据HTTP/1.1的要求,必须按顺序返回,所以HOL(队头阻塞)无法完全避免

在HTTP2中, 通过多路复用的技术实现了多个http请求同时进行.

Reference

HTTP/1.1 RFC