理解HTTP之keep-alive

在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive。两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大家就都迷茫了。HTTP层面的keep-alive是我们接触比较多的,也是大家平时口头上的"keepalive"。下面我们就来谈谈HTTP的keep-alive

短连接&长连接&并行连接

再说keep-alive之前,先说说HTTP的短连接&长连接。

  • 短连接

    所谓短连接,就是每次请求一个资源就建立连接,请求完成后连接立马关闭。每次请求都经过“创建tcp连接->请求资源->响应资源->释放连接”这样的过程

  • 长连接

    所谓长连接(persistent connection),就是只建立一次连接,多次资源请求都复用该连接,完成后关闭。要请求一个页面上的十张图,只需要建立一次tcp连接,然后依次请求十张图,等待资源响应,释放连接。

  • 并行连接

    所谓并行连接(multiple connections),其实就是并发的短连接。

keep-alive

具体client和server要从短连接到长连接最简单演变需要做如下改进:

  1. client发出的HTTP请求头需要增加Connection:keep-alive字段
  2. Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且"应允"client我暂时不会关闭socket连接

在HTTP/1.0里,为了实现client到web-server能支持长连接,必须在HTTP请求头里显示指定

Connection:keep-alive

在HTTP/1.1里,就默认是开启了keep-alive,要关闭keep-alive需要在HTTP请求头里显示指定

Connection:close

现在大多数浏览器都默认是使用HTTP/1.1,所以keep-alive都是默认打开的。一旦client和server达成协议,那么长连接就建立好了。

接下来client就给server发送http请求,继续上面的例子:请求十张图片。如果每次"请求->响应"都是独立的,那还好,10张图片的内容都是独立的。但是如果pipeline模式,上一个请求还没响应,下一个请求就发出,这样并发地发出10个请求,对于10个response client要怎么区分呢?而HTTP协议又是没有办法区分的,所以这种情况下必须要求server端地响应是顺序的,通过Conten-Length区分每次请求,这还只是针对静态资源,那对于动态资源无法预知页面大小的情况呢?我还没有深入研究,可以查看https://www.byvoid.com/blog/http-keep-alive-header

另外注意: 指定keep-alive是一种client和server端尽可能需要满足的约定,client和server可以在任意时刻都关闭keep-alive,彼此都不应该受影响。

Nginx keepa-alive配置

具体到Nginx的HTTP层的keepalive配置有

  • keepalive_timeout
    Syntax: keepalive_timeout timeout [header_timeout];Default:    keepalive_timeout 75s;Context:    http, server, location

The first parameter sets a timeout during which a keep-alive client connection will stay open on the server side. The zero value disables keep-alive client connections. The optional second parameter sets a value in the “Keep-Alive: timeout=time” response header field. Two parameters may differ.

  • keepalive_requests
    Syntax: keepalive_requests number;Default:    keepalive_requests 100;Context:    http, server, location

Sets the maximum number of requests that can be served through one keep-alive connection. After the maximum number of requests are made, the connection is closed.

可以看看Nginx的关于 keepalive_timeout 是实现

./src/http/ngx_http_request.cstatic void
ngx_http_finalize_connection(ngx_http_request_t *r){
...if (!ngx_terminate&& !ngx_exiting&& r->keepalive&& clcf->keepalive_timeout > 0){ngx_http_set_keepalive(r);return;}
...
}static void
ngx_http_set_keepalive(ngx_http_request_t *r){//如果发现是pipeline请求,判断条件是缓存区里有N和N+1个请求同时存在if (b->pos < b->last) {/* the pipelined request */}// 本次请求已经结束,开始释放request对象资源r->keepalive = 0;ngx_http_free_request(r, 0);c->data = hc;// 如果尝试读取keep-alive的socket返回值不对,可能是客户端close了。那么就关闭socketif (ngx_handle_read_event(rev, 0) != NGX_OK) {ngx_http_close_connection(c);return;}//开始正式处理pipeline...rev->handler = ngx_http_keepalive_handler;...// 设置了一个定时器,触发时间是keepalive_timeout的设置ngx_add_timer(rev, clcf->keepalive_timeout);...}static void
ngx_http_keepalive_handler(ngx_event_t *rev){// 发现超时则关闭socketif (rev->timedout || c->close) {ngx_http_close_connection(c);return;}// 读取keep-alive设置从socketn = c->recv(c, b->last, size);if (n == NGX_AGAIN) {if (ngx_handle_read_event(rev, 0) != NGX_OK) {ngx_http_close_connection(c);return;}...}//此处尚有疑惑?ngx_reusable_connection(c, 0);c->data = ngx_http_create_request(c);// 删除定时器ngx_del_timer(rev);// 重新开始处理请求rev->handler = ngx_http_process_request_line;ngx_http_process_request_line(rev);
}

参考资料

  • http://nginx.org/en/docs/http/ngx_http_core_module.html

from: http://www.firefoxbug.com/index.php/archives/2805/

转载于:https://www.cnblogs.com/GarfieldEr007/p/6995502.html

理解TCP之Keepalive相关推荐

  1. 理解TCP长连接(Keepalive)

    TCP Keepalive的起源 TCP协议中有长连接和短连接之分.短连接环境下,数据交互完毕后,主动释放连接: 长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电.死 ...

  2. java tcp keepalive_socket keepalive理解

    java socket编程中有个keepalive选项,看到这个选项经常会误解为长连接,不设置则为短连接,实则不然. socket连接建立之后,只要双方均未主动关闭连接,那这个连接就是会一直保持的,就 ...

  3. tcp retransmission 出现的原因_浅谈TCP的keepalive机制

    相关背景: hbase集群大量regionserver节点进程挂掉,排查log发现每个节点上的有大量的和datanode建立连接失败的报错信息,进一步排查是大量的Too Many Open Files ...

  4. TCP的FIN_WAIT1状态理解|深入理解TCP

    原文链接: https://blog.csdn.net/dog250/article/details/81697403 近期遇到一个问题,简单点说,主机A上显示一条ESTABLISHED状态的TCP连 ...

  5. 理解HTTP之keep-alive(转)

    理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...

  6. 理解HTTP之keep-alive

    理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...

  7. linux tcp keepalive,Linux下TCP的Keepalive相关参数学习

    一 基本原理 TCP的Keepalive可以简单理解成为keep tcp alive,用来检测TCP sockets的连接是否正常或是已经断开. Keeplived的原理很简单,当建立一个TCP连接时 ...

  8. [通俗易懂]深入理解TCP协议(上):理论基础

    转自即时通讯网:http://www.52im.net/ 前言 TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的 ...

  9. wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的

     wireshark的使用教程 --用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的 wireshark是一款抓包软件,比较易用,在平常可以利用它抓包,分析协议或者监控网络,是一个比较好的 ...

最新文章

  1. xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)
  2. java并发编程实战阅读总结(a)
  3. Codeforces 494D Birthday 树形dp (看题解)
  4. ALSA driver --PCM 实例创建过程
  5. Lingo 软件的使用 数学建模 司守奎
  6. 解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题
  7. maven命令指定配置文件
  8. mysql 端口号_mysql的端口号(mysql常用端口号)
  9. Git 学习(篇六 --储藏与清理)
  10. macosx安装之旅(8)-常见问题(转载)
  11. CentOS cowsay “会说话的小动物”
  12. 在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?
  13. 美团人的写作基本功是如何练成的
  14. 淘宝封杀selenium的ua算法分析
  15. 5G时代的来临,我们应该做好哪些网络安全准备?
  16. 怎么查看python的库的函数_如何查看python库函数
  17. 云顶之弈5.26服务器维护,云顶之弈维护到几点 云顶之弈维护公告最新 云顶之弈12月26日几点能上...
  18. 社交APP开发的重要性以及注意事项有哪些
  19. Motoman机器人离线编程——Visio Studio环境配置
  20. 算法分析与设计实验十二

热门文章

  1. 杨建允:2022年315晚会点名后的直播电商,应该怎么运营?
  2. DB2数据库通过日志表恢复数据
  3. win10打开lol后所有声音消失
  4. smtplib、email实现邮件发送
  5. 双十一值得入手的运动耳机哪个牌子好,六款好用的运动耳机分享
  6. unity3d 使用存档图片_Unity3D截图功能总结,并保存在指定的文件夹
  7. 涂鸦Surfaceview
  8. asp.net图书馆借阅归还系统
  9. L1-067 洛希极限(Python3)
  10. 防止电脑弹出广告配置