HTTP/1.x 协议是一个文本协议,可读性非常好,但是并不高效
解析
- 解析一个完整的 HTTP 请求,首先要正确读出 HTTP header。HTTP header 各个 fields 使用
\r\n
分隔,然后跟 body 之间使用\r\n\r\n
分隔。解析完 header 之后,才能从 header 里面的content-length
拿到 body 的 size , 从而读取 body - 这套流程其实并不高效,因为我们要读取多次,才能将一个完整的 HTTP 请求给解析出来,虽然在代码上有很多的优化方法:
- 一次将一大块数据读取到 buffer 里面,避免多次 IO 开销
- 读取的时候直接匹配
\r\n
的方式流式解析
- 主要问题在于, HTTP/1.x 协议是一个文本协议,是给人看的,对机器并不友好,二进制才是更好的选择
Request/Response
- HTTP/1.x 另一个问题就在于它的交互模式,一个连接每次只能一问一答,也就是client 发送了 request 之后,必须等到 response,才能继续发送下一次请求。
- 这套机制是非常简单,但会造成网络连接利用率不高。如果需要同时进行大量的交互,client 需要跟 server 建立多条连接,但连接的建立也是有开销的,所以为了性能,通常这些连接都是长连接一直保活的,虽然对于 server 来说同时处理百万连接也没啥太大的挑战,但终归效率不高。
Push
- HTTP/1.x 并没有推送机制。所以通常两种做法:
- Long polling 方式,也就是直接给 server 挂一个连接,等待一段时间(譬如 1 分钟),如果 server 有返回或者超时,则再次重新 poll。
- Web-socket,通过 upgrade 机制显式的将这条 HTTP 连接变成裸的 TCP,进行双向交互
网友评论