本文为极客时间《透视HTTP协议》笔记
短链接
HTTP通讯过程采用了简单的”请求-应答“模式,其底层数据传输基于TCP/IP,每次发送请求前要与服务器建立连接,收到响应报文后会立即关闭,因为整个连接时间很短,故称为”短链接“。
短链接有严重的缺点,因为在TCP协议里面,建立连接和关闭连接是非常昂贵的操作。建立连接的三次握手(1.5RTT),关闭连接的四次挥手(2RTT)在整个处理过程中占比过高。
原文中用了打卡机的例子,每次打卡都需要开盖、关盖的操作就相当于短链接的情况。
长链接
针对短连接暴露出的缺点,HTTP协议提出了”长连接“的通信方式。其采用”成本均摊“的思路,既然TCP的连接和关闭非常耗时间,那么就把这个时间均摊到多个”请求-应答“上。
连接相关的头字段
目前在HTTP/1.1中的连接都会默认启用长连接。不需要特殊的头字段指定。当然也可在请求头里加上”Connection:keep-alive“来要求使用长连接。
不过不管客户端是否要求长连接,如果服务器支持长连接,它总会在响应报文里放一个”Connection:keep-alive“来表示我是支持长连接的。
在客户端,可以在请求头里加上“Connection: close"来告诉服务器在这次通信之后关闭连接。
服务器通常不会主动关闭连接,但可以使用一些策略。拿Nginx来举例:
1.keepalive-timeout指令设置长连接的超时时间
2.keepalive-requests 设置长连接上可发送的最大请求次数。
队头阻塞(Head-of-line block)
”队头阻塞“与长连接和短连接无关,而是由HTTP基本的"请求-应答"模型导致的。
在先进先出的”串行“队列中所有的请求无优先级的概念,如果队首的请求因为处理的太慢耽误了时间,就会造成阻塞。
解决队头阻塞的方式。
1.”Concurrent Connections“ 并发连接,也就是同时对一个域名发起多个长连接,用数量解决质量的问题。
2.”domain sharding“ 域名分片 使用多域名指向同一服务器