http 协议是一个 parse 效率不高的协议
2012-06-12 09:24
239 查看
需要使用连续的两个 CRLF 来判断 header 部分的结束,而不是使用头部字节设置 header 的长度,这就造成解析器需要扫描 TCP 内容流去查找分割点,性能下降。
chunked transfer-encoding 中每个 chunk 的长度使用 hex 标识,但是长度信息还是使用 CRLF 来终结,这个也降低了性能。
其实很多其他的协议,如电信短信系统的 SGIP/SMPP 和 BS 的 WebSocket 协议,它们对协议包大小都采用固定长度前导字节的方式。
下面对比看看 WebSocket 协议:
每个 frame 的头部第一字节标明该 frame 的总长度,1-126 字节的长度就够用了,如果 frame 长度超过 126 字节,则使用 127 标明下面的双字节 UInt16 代表 frame 的总长度,128 代表下面的 UInt64 代表 frame 的总长度。
可以看出,http 协议其实可以重新设计
header 如果是 UInt8 只有 256 byte,肯定是不够的,而使用 UInt16 标明自己的长度,共有 64K 的长度足够 header 使用了,考虑到Request URL, Referer,
Cookie 和 User-Agent 都是较长的串,header 总长度一般应该超过 256,因此就直接设定 header 长度标识为固定的 UInt16BE 即可
chunked transfer-ecoding 可以完全照搬 WebSocket 协议。
虽然 http 的设计对于 parse 效率考虑不周,但是由于它的广泛使用,其设计已经成为事实上的标准,虽毒害万千,但也是无法改变的现实了。
chunked transfer-encoding 中每个 chunk 的长度使用 hex 标识,但是长度信息还是使用 CRLF 来终结,这个也降低了性能。
其实很多其他的协议,如电信短信系统的 SGIP/SMPP 和 BS 的 WebSocket 协议,它们对协议包大小都采用固定长度前导字节的方式。
下面对比看看 WebSocket 协议:
每个 frame 的头部第一字节标明该 frame 的总长度,1-126 字节的长度就够用了,如果 frame 长度超过 126 字节,则使用 127 标明下面的双字节 UInt16 代表 frame 的总长度,128 代表下面的 UInt64 代表 frame 的总长度。
可以看出,http 协议其实可以重新设计
header 如果是 UInt8 只有 256 byte,肯定是不够的,而使用 UInt16 标明自己的长度,共有 64K 的长度足够 header 使用了,考虑到Request URL, Referer,
Cookie 和 User-Agent 都是较长的串,header 总长度一般应该超过 256,因此就直接设定 header 长度标识为固定的 UInt16BE 即可
chunked transfer-ecoding 可以完全照搬 WebSocket 协议。
虽然 http 的设计对于 parse 效率考虑不周,但是由于它的广泛使用,其设计已经成为事实上的标准,虽毒害万千,但也是无法改变的现实了。
相关文章推荐
- 开源一个C++实现的简单HTTP协议处理库
- Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器
- 谈谈一个重要的http协议头标:X-Forwarded-For
- 一个不了解HTTP协议的程序员不是一个好的Web开发者
- HTTP简介,http是一个属于应用层的面向对象的协议
- 一个重要的http协议头标:X-Forwarded-For
- http协议8---响应信息头案例三(content-Type作用,实现发送一个文件(html,XML,image))
- 谈谈一个重要的http协议头标:X-Forwarded-For
- 一个重要的http协议头标:X-Forwarded-For
- wget用法wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.
- HttpLib - 一个对 Http 协议进行封装的库
- HTTP本身是一个无状态的连接协议
- 记录一个http协议说明
- Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器
- 用C语言编写一个HTTP协议的目录浏览和文件下载服务器
- HTTP协议与cookie技术:——一个周日下午
- Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器
- HTTP是一个无状态的协议
- 一个下载SVN源码+http协议的java实现
- 一个朴素的基于HTTP协议的项目