这个问题主要是想说一下HTTP协议头connection设置的一些问题。
之前就遇到过无论是作为客户端还是服务端出现了端口出现一些不正常的状态(比如:CLOSE_WAIT、CLOSING等),造成端口不被释放资源浪费,更严重的情况可能会把主机的句柄耗尽导致服务挂起。
讲connection设置之前先说一下,必须对tcp四次分手的过程很熟悉,以下截图是四次分手的各种情况下端口对应的状态值。
主要分为主动断开和被动断开两种情况。
http协议目前有3个版本:
1、1.0默认是短连接的,所以长连接需要设置connection为keepAlived
2、1.1默认是长连接,connection的值默认是keepAlived状态
3、2.0协议目前还使用不广,暂不进行分析
之前认为设置keepAlived是告诉自己这个是长连接,所以导致在分析问题的时候走了不少弯路。后来经过测试,证实connection的设置其实是告知对方如何处理当前连接。
如果设置不一样就会出现文章开头说的各种端口异常的情况;
比如:如果客户端请求头设置keepAlived,服务端应答头设置为close
>>> 服务端收到请求后被告知是长连接,那么返回应答后不会主动断开连接。而客户端收到服务的是close,认为短连接就会主动关闭tcp连接。这样就会导致服务的端口进入close_wait状态,导致客户端口为FIN_WAIT2状态
所以就会导致端口(句柄泄漏),所以客户端和服务短对于connection的设置必须一致。
但是有一些web服务端的connection是不允许手动设置的,自动会保持和客户端connection一样的设置,这样就避免了这样的问题。比如python的uwsgi设置就会报错。
这个文件遇到好多次,所以第一篇就把这个问题写出来了。