DNS和TCP
host
每台主机的host会保存运营商提供的IP地址,在使用TCP连接时直接使用本地host配置加快连接速度;
DNS
DNS是一个域名解析系统,通过解析域名与IP建立TCP连接
DNS预解析
DNS-prefetch (DNS 预获取) 是尝试在请求资源之前解析域名。这可能是后面要加载的文件,也可能是用户尝试打开的链接目标
为什么要使用 dns-prefetch?
当浏览器从(第三方)服务器请求资源时,必须先将该跨域域名解析为 IP地址,然后浏览器才能发出请求。此过程称为 DNS解析。DNS 缓存可以帮助减少此延迟,而 DNS解析可以导致请求增加明显的延迟。对于打开了与许多第三方的连接的网站,此延迟可能会大大降低加载性能。
// 语法
<link rel="dns-prefetch" href="https://fonts.googleapis.com/">
TCP的三次握手
- 客户端向服务端发送SYN并进入
SYN_SENT
状态,等待服务器确认;表示客户端拥有发送能力 - 服务端接收到SYN会向客户端发送ack和 SYN+1 x+1此时服务器进入
SYN_RECV
状态; 表示服务端接收到了请求并会发ACK检测客户端是否拥有接收并发送能力 - 客户端接收到服务端的SYN+ACK包,并向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入
ESTABLISHED
(TCP连接成功)状态,完成三次握手
TCP的四次挥手
- 客户端给服务端发送了FIN,用来关闭客户到服务器的数据传送。并将状态改为CLOSE_WAIT
- 服务器收到这个FIN,服务端给客户端发送了ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
- 服务器关闭客户端的连接,发送一个FIN给客户端。
- 客户端发回ACK报文确认,并将确认序号设置为收到序号加1,此时是完全关闭连接了。
连接复用
Connection: keep-alive
Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive,而HTTP/1.1默认是支持长连接的,有没有这个请求头都行。
当然了,协议是这样规定的,至于支不支持还得看服务器(比如tomcat)和客户端(比如浏览器)的具体实现。在实践过程中发现谷歌浏览器使用HTTP/1.1协议时请求头中总会带上Connection: keep-alive,另外通过httpclient使用HTTP/1.0协议去请求tomcat时,即使带上Connection: keep-alive请求头也保持不了长连接。如果HTTP/1.1版本的http请求报文不希望使用长连接,则要在请求头中加上Connection: close,接收到这个请求头的对端服务就会主动关闭连接。
但是http长连接会一直保持吗?肯定是不会的。一般服务端都会设置keep-alive超时时间。超过指定的时间间隔,服务端就会主动关闭连接。同时服务端还会设置一个参数叫最大请求数,比如当最大请求数是300时,只要请求次数超过300次,即使还没到超时时间,服务端也会主动关闭连接。
// 语法
Keep-Alive: parameters
// parameters
// 一系列用逗号隔开的参数,每一个参数由一个标识符和一个值构成,并使用等号 ('=') 隔开。下述标识符是可用的:
timeout:指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。
max:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。
并行连接
- 浏览器都有限制并行连接数,不同浏览器限制数量不同,大部分都是6个,在4~12个不等
- 限制并行是浏览器在同一时间让所有网页共用并行连接数
缺点:有并行数量限制,可以通过并行连接+多路复用(在第一轮并行连接执行完后通过串行复用接着第一轮的请求继续请求第二轮)
HTTP/1.1管道化(HTTP pipelining)
HTTP管道化浏览器默认关闭
问题
- 响应的顺序要和请求的顺序保持一致,不一致导致请求响应对应错乱
- 因为上面这个问题,导致数据处理没有连接复用、并行连接效率高