HTTP的长链接和短链接实际上是TCP的长连接和短链接。首先我们先介绍一下TCP/IP协议组四层模型。其中包括以下:
- 应用层:HTTP、FTP、DNS、TELNET等协议
- 传输层:TCP、UDP
- 网络层:IP、ARP、RARP、ICMP协议等
- 网络接口层:是TCP/IP协议的基层,负责数据帧的发送和接收。
接下来我们说下常见的几个协议的作用:
HTTP:HTTP协议无状态指的是对事物处理没有记忆能力。也就是说打开一个服务器的网页和上次打开这个网页之间没有任何联系。
IP协议:负责解决网路路由和寻址问题
TCP:解决如何在IP层之上可靠的传递数据包。并且顺序和发送顺序一致,不丢包。TCP协议是可靠的、面相连接的。
UDP:与TCP是对应,是面相非连接的协议,只负责把数据包传过去。数据量小、可靠性不高,可能会掉包。我们经常使用的ping命令就是发送UDP数据包。
好了好了,进入正题,开始说长链接和短链接。
短连接
在HTTP/1.0中默认是使用短连接,客户端每进行一次http请求就建立一次连接,任务结束连接就中断(双方都可以发起close,一般是客户端发起),比如访问一个网页或者其他web资源(img、css、js等),每遇到一个web资源就要建立一次连接。
优缺点:
因为每次通信都需要建立TCP连接,连接的建立都需要三次握手,而释放需要四次握手。所以会浪费时间和带宽。但是优点就是对于服务端来讲,不要进行额外的控制,每条连接都是有用的。
长连接
从HTTP/1.1开始默认使用长连接。使用长连接的HTTP协议会在响应头加入Connection: keep-alive
。当打开一个网页客户端和服务端建立的TCP连接不会关闭。当再次访问服务器时还会使用这个连接。但是这个状态不会永久保持连接,可以在不同的服务器软件(Apache)上设置。
优缺点:
减少了TCP的建立和关闭,减少浪费、节约时间。对于频繁请求适合使用长连接,但是缺点就是随着用户的增多,服务器会扛不住的。所以需要采取一些策略:如关闭长时间没有读写操作的连接。
应用
web网站的http服务一般都是短连接。
保活功能扩展:
如果客户端已经消失但是连接没有断开,服务器会保留一个半开放的连接,而服务器又在等待客户端的数据,此时服务端将会永远等待。保活功能会试图检测半开放状态。如果一个连接2个小时没有任何动作,服务端会发送一个试探报文,根据客户端响应的4个客户端状态进行判断。
客户端机正常运行,且服务器可达,此时TCP响应正常,服务器将保活定时器复位。
客户机已经奔溃,并且关闭或者重新启动。服务端无法收到响应。服务端每隔75秒发一次,一共发10次,若没有收到一个响应,则认为客户端已经关闭并且终止连接。
客户端奔溃并已经重新启动,服务端将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
客户机正常运行,但是服务器不可达。这种情况与第二种类似。