调用shutdown单独关闭输入管道或者输出管道,这种方式是比较安全的一种做法。因为如果服务器的输入端和输出端均被关闭,那么用户此时并不知情,将导致用户的输入被重定向,服务器返回的失败的连接将会清空客户端操作系统中的数据缓冲区。比如用户在网页中的任何的输入的数据将会被清空。所以应尽量使用shutdown,而非close,close会将输入端和输出端的socket均被关闭,RST一般为TCP层发出,如下图所示:
使用keepalive 主要是为了减少TCP三次握手与关闭时带来的TIME_WAIT的时延,为了减少网络开销,使用keepalive来在建立的一个TCP连接上执行多个HTTP请求,这样可以带来很好的用户体验。
比如访问百度首页的时候,加载js或者css脚本的时候,会在Connection里面写入keep-alive,并指定Transfer-Encoding 为chunked 表示分块传输,什么时候关闭由服务器端决定,以达到加速小文件传输的效率。
如果服务器端设置的keepalive,长时间没有得到客户端的响应,nginx会根据定时器的实际情况将该条连接断开。当有多条连接的时候,nginx就需要维护多个定时器,nginx的方法是:
设置一个超时时间,然后将这个时间放入到rbtree里面,每次要进行epoll_wait等待的时候,都需要设置超时时间,此时只要寻找rbtree当中最小的超时时间(绝对时间,不是时间段)即可。
涉及:
ngx_epoll_module的ngx_epoll_process_events
ngx_event_find_timer()寻找最早过期时间。
我们可以使用Telnet来模拟浏览器对服务器的访问,来测试一下nginx的反应行为。
nginx会对每个不同的请求来做不同的判断:
当HTTP请求报文为
GET / HTTP/1.1
Host:
此时,返回的是一个HTTP响应报文,但是这个TCP连接并没有被断开,还可以继续使用,但是当使用HTTP/1.0协议的时候,发现nginx会自动断开这个连接。
-
root@asus-desktop:~# telnet localhost 80
-
Trying ::1...
-
Trying 127.0.0.1...
-
Connected to localhost.
-
Escape character is '^]'.
-
GET / HTTP/1.1
-
Host:localhost
-
-
-
HTTP/1.1 200 OK
-
Server: nginx/1.2.9
-
Date: Fri, 21 Feb 2014 07:06:05 GMT
-
Content-Type: text/html
-
Content-Length: 612
-
Last-Modified: Fri, 21 Feb 2014 06:24:49 GMT
-
Connection: keep-alive
-
Accept-Ranges: bytes
-
-
-
////////////
-
Welcome to nginx!
-
-
Thank you for using nginx.
-