2.3 HTTP/1.1的其他问题
HTTP/1.1是一个简单的文本协议。这种简单性也带来一些问题。尽管HTTP消息体可以包含二进制数据(比如图片,以及客户端和服务器能理解的任何格式),但请求和首部需要是文本的形式。文本格式对于人类来说很友好,但对于机器并不友好。HTTP文本消息处理起来很复杂,且容易出错,会导致安全问题。例如,向HTTP首部中添加换行符,可以进行一些HTTP攻击[11]。
HTTP使用文本格式带来的另外一个问题是,HTTP消息较大,这是因为不能高效编码数据(比如使用数字来表达Date首部,而不是使用人类可读的完整文本),而且首部内容也有重复。还是那句话,在早期Web只需要单个请求,这不会有问题,但随着请求数的增长,使用文本格式就显得效率很低了。HTTP首部的应用很广泛,这就带来了很多重复性问题。例如,就算只有主页需要cookie,每个发向服务器的HTTP请求中都会包含cookie。通常,静态资源,如图片、CSS和JavaScript都不需要cookie。域名分片,如本章前面讲过的,主要用来提供更多连接数,但它也用来创建所谓的无cookie域名。出于性能和安全的考虑,浏览器不会向这些域名发送cookie。同样HTTP响应的首部也变得庞大了许多,像Content-Security-Policy这种关于安全的首部,会导致HTTP首部非常大,从而使效率低下的问题越来越突出。很多网站需要加载上百个资源,庞大的HTTP首部可能会带来几十甚至上百KB的数据传输。
性能问题是HTTP/1.1需要改善的其中一个问题。除此之外,它还存在纯文本协议的安全和隐私问题(HTTPS加密很好地解决了这个问题),以及缺少状态的问题(cookie在一定程度上解决了这个问题)。在第10章,我们会对这些问题进行更多的探究。然而对很多人来讲,想要解决这些性能问题,而不引入新问题,并不容易。