HTTP长连接、短连接、Linux网络优化

无连接

含义:每次传输完数据后就断开连接。
因为早期互联网规模小,并且http具有瞬时性,突发性,服务器同时处理着多个请求。所以采用无连接的方式。以便于腾出资源处理其他请求。

无状态

顺便说一说无状态

含义:

客户端向服务器请求完资源后断开连接,这个过程不记录任何东西。

产生的问题:

随着时间的推移,必须要记录用户的个人信息,而且需要登陆。
你不希望你前脚刚加入购物车的东西,后脚就不见了吧?
你也不希望你每次点击新的链接都要重新登陆吧?
Cookie和Session横空出世,用于记录用户信息。

无连接产生的问题及解决方案

产生的问题:

随着时间的推移,网页中嵌入了图片和其他元素,并且是以链接的方式嵌入。这就说明,客户端在请求完网页文件后,紧接着又会向服务器请求图片等静态资源。这样的话,无连接+多次请求就极大的浪费了带宽等资源(都浪费在TCP上了)。

解决方案:

使用长Keepalive长连接。

长连接

在HTTP/1.0中,默认使用的是短连接。
从HTTP/1.1起,默认使用长连接。
用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,一段时间后会断开。
比如:客户端和服务器之间会继续使用这个通道传输图片等资源。

服务器会和客户端保持一段空闲连接,在此期间他们可以无需连接传递数据。空闲时间到期后(默认2h),服务器会发送探测多个报文给客户端,如果都没有回应或回应断开连接的报文,则断开连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
关于TCP的连接,可以看我另一篇博客:TCP三次握手与四次挥手

可以看到,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。

Linux网络优化

由于长连接会占用大量资源,典型的就是出现大量的TIME_WAIT。

可以通过下面的命令查看TIME_WAIT等状态的数量:

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

可以通过修改内核文件来网络调优:

vim /etc/sysctl.conf
	#TCP的配置
	net.ipv4.tcp_syn_retries=2		#最多发起2次SYN请求(默认为5)
	net.ipv4.tcp_fin_timeout=30		#FIN_WAIT_2时间
	net.ipv4.tcp_max_syn_backlog = 4096		#SYN队列长度(默认为1024),增加以容纳更多等待连接数
	net.ipv4.tcp_tw_reuse = 1		#开启TIME-WAIT sockets重用机制(默认为0,即关闭),可重新用于新的TCP连接
	net.ipv4.tcp_tw_recycle = 1		#开启TIME-WAIT sockets快速回收(默认为0,即关闭)
	net.ipv4.tcp_syncookies = 1		#当SYN等待队列溢出时,启用cookies来处理(默认为0,即关闭),可以防范少量SYN攻击
	#http的keepalive长连接的配置
	net.ipv4.tcp_keepalive_time=1200	#空连接可以保持1200s
	net.ipv4.tcp_keepalive_probes=5		#空连接结束后发送探测报文的个数(都未回应则断开连接)
	net.ipv4.tcp_keepalive_intvl=20		#每个探测包的间隔时间
	#其他配置
	net.core.netdev_max_backlog=3000	#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
sysctl -p	#加载内核文件

你可能感兴趣的:(Linux六脉神剑)