无连接
含义:每次传输完数据后就断开连接。
因为早期互联网规模小,并且http具有瞬时性,突发性,服务器同时处理着多个请求。所以采用无连接的方式。以便于腾出资源处理其他请求。
无状态
顺便说一说无状态
含义:
客户端向服务器请求完资源后断开连接,这个过程不记录任何东西。
产生的问题:
随着时间的推移,必须要记录用户的个人信息,而且需要登陆。
你不希望你前脚刚加入购物车的东西,后脚就不见了吧?
你也不希望你每次点击新的链接都要重新登陆吧?
Cookie和Session横空出世,用于记录用户信息。
无连接产生的问题及解决方案
产生的问题:
随着时间的推移,网页中嵌入了图片和其他元素,并且是以链接的方式嵌入。这就说明,客户端在请求完网页文件后,紧接着又会向服务器请求图片等静态资源。这样的话,无连接+多次请求就极大的浪费了带宽等资源(都浪费在TCP上了)。
解决方案:
使用长Keepalive长连接。
长连接
在HTTP/1.0中,默认使用的是短连接。
从HTTP/1.1起,默认使用长连接。
用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
1 | Connection:keep-alive |
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,一段时间后会断开。
比如:客户端和服务器之间会继续使用这个通道传输图片等资源。
服务器会和客户端保持一段空闲连接,在此期间他们可以无需连接传递数据。空闲时间到期后(默认2h),服务器会发送探测多个报文给客户端,如果都没有回应或回应断开连接的报文,则断开连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
关于TCP的连接,可以看我另一篇博客:TCP三次握手与四次挥手
可以看到,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。
Linux网络优化
由于长连接会占用大量资源,典型的就是出现大量的TIME_WAIT。
可以通过下面的命令查看TIME_WAIT等状态的数量:
1 | netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}' |
可以通过修改内核文件来网络调优:
1 | vim /etc/sysctl.conf |