什么是 keep-alive 连接

https://en.wikipedia.org/wiki/HTTP_persistent_connection

HTTP persistent connection, also called HTTP keep-alive, or HTTP connection reuse, is the idea of using a single TCP connection to send and receive multiple HTTP requests/responses, as opposed to opening a new connection for every single request/response pair. The newer HTTP/2 protocol uses the same idea and takes it further to allow multiple concurrent requests/responses to be multiplexed over a single connection.

https://www.byvoid.com/blog/http-keep-alive-header

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

keep-alive 连接 的 优点

https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1

Persistent HTTP connections have a number of advantages:

      - By opening and closing fewer TCP connections, CPU time is saved
        in routers and hosts (clients, servers, proxies, gateways,
        tunnels, or caches), and memory used for TCP protocol control
        blocks can be saved in hosts.
 
      - HTTP requests and responses can be pipelined on a connection.
        Pipelining allows a client to make multiple requests without
        waiting for each response, allowing a single TCP connection to
        be used much more efficiently, with much lower elapsed time.
      - Network congestion is reduced by reducing the number of packets
        caused by TCP opens, and by allowing TCP sufficient time to
        determine the congestion state of the network.
 
      - Latency on subsequent requests is reduced since there is no time
        spent in TCP's connection opening handshake.
      - HTTP can evolve more gracefully, since errors can be reported
        without the penalty of closing the TCP connection. Clients using
        future versions of HTTP might optimistically try a new feature,
        but if communicating with an older server, retry with old
        semantics after an error is reported.

HTTP implementations SHOULD implement persistent connections.

https://en.wikipedia.org/wiki/HTTP_persistent_connection

Advantages

These advantages are even more important for secure HTTPS connections, because establishing a secure connection needs much more CPU time and network round-trips.

1、 较低的CPU和内存消耗。

2、 启用HTTP管道线功能

3、 减少网络拥塞

4、 减少后续请求的延迟

5、 遇到错误,可以报告错误, 不用强行关闭。

对于 https 连接效果显著, 因为https的握手流程很是耗时!

keep-alive 连接 的 缺点

https://en.wikipedia.org/wiki/HTTP_persistent_connection

Disadvantages

If the client does not close the connection when all of the data it needs has been received, the resources needed to keep the connection open on the server will be unavailable for other clients. How much this affects the server's availability and how long the resources are unavailable depend on the server's architecture and configuration.

浏览器支持性

Use in web browsers

All modern web browsers use persistent connections, including Google Chrome, Firefox, Internet Explorer (since 4.01), Opera (since 4.0)[8] and Safari.

By default, Internet Explorer versions 6 and 7 use two persistent connections while version 8 uses six.[9] Persistent connections time out after 60 seconds of inactivity which is changeable via the Windows Registry.[10]

In Firefox, the number of simultaneous connections can be customized (per-server, per-proxy, total). Persistent connections time out after 115 seconds (1.92 minutes) of inactivity which is changeable via the configuration.[11]

thttpd实验性实现 keep-alive

https://github.com/fanqingsong/thttpd_keepalive

要点:

1、 响应报文头中 connection close 修改为  keep-alive

2、 httpd_get_conn 中 对hc进行 内存初始化 和 设置初始值的 代码分离出独立 函数

httpd_con_initialize_content

httpd_con_initialize_mem

3、 handle_linger 改造, 不再执行延迟关闭了, 修改为 延迟定时器, 并初始化 hc

4、 clear_connection 中, shutdown注释掉,  c->linger_timer初始化或者 延迟。

------- 实验效果 ------

http://www.golaravel.com/

以此网页内容实验, 第一次加载后, 多次刷新页面

之前

1.22    1.46   1.68   1.2    1.03

之后

1.21    1.37   1.16   1.43  1.25

改进不是很显著, 应该与 浏览器的并发无关, 与 thttpd的对于静态资源的单线程机制有关, 已经是串行。

且 本实验不需要DNS解析, 和https握手。

对应的代码打印,一个连接fd,证明keep-alive生效:

https://github.com/fanqingsong/thttpd_keepalive/blob/master/thttpd-2.27/logfile_fqs

服务器段抓包:

https://holmesian.org/Ubuntu_tcpdump

tcpdump -X -s 0 -w aaa host 192.9.200.59 and tcp port 8000

https://raw.githubusercontent.com/fanqingsong/thttpd_keepalive/master/thttpd-2.27/tcpdump_result.txt

HTTP协议 keep-alive连接 与 BS(firefox-thttpd)实验的更多相关文章

  1. (转)对Http协议的长连接和短连接新的认识

    转载来自:http://www.cnblogs.com/zuoxiaolong/p/life49.html一直对长连接短连接模模糊糊,看着该博主的文章,豁然开朗~ 引言 最近刚到公司不到一个月,正处于 ...

  2. Websocket协议之握手连接

    Websocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信的问题而设计的,是完全意义上的Web应用端的双向通信技术,可以取代之前使用半双工HTTP协议而模拟全双工通信,同时克服了带 ...

  3. HTTP权威协议笔记-4.连接管理

    4.1 TCP连接 TCP为HTTP提供了一条可靠的比特传输管道,按顺序正确的传输,步骤如下: 浏览器解析主机名. 查询这个主机名的IP地址(DNS) 获得端口号. 浏览器对服务器该端口号发起连接. ...

  4. USB协议-检测设备连接与速度

    在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率.USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备. USB支持3种类型的传输速率:1.5Mb/s的低速 ...

  5. 既然HTTP1.1协议里每个连接默认都是持久连接,那么为何当今所有报文都在使用Connetion:Keep-Alive

    说白了,如果你发起时有,那么服务器支持,回应时也会有,不支持,也就没有了.所以一般客户端都会默认带着发,服务端返回不返回就是服务端的事了. 1. 支不支持长连接,关键在于服务端是否支持. 如果服务端不 ...

  6. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  7. quagga源码学习--BGP协议对等体连接tcp md5签名认证选项

    bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...

  8. 蓝牙协议分析(7)_BLE连接有关的技术分析

    转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...

  9. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

随机推荐

  1. PowerDesigner从Sqlserver中反转为带注释的字典及快捷键操作

    PowerDesigner的操作经常忘记,所以把常用的功能记录下来备忘. 1.修改反转过来的字段 PowerDesigner从数据库反转的时候,默认不带注释,需要先进行修改. 输入如下脚本: {OWN ...

  2. FragmentTabHost + Fragment 使用小记

    由于业务需要,需要在使用Activity的顶部使用一个导航栏,点击导航栏的tab,下面显示内容.决定采用项目中已经使用过的FragmentTabHost + Fragment的方式实现.不同的是之前的 ...

  3. 代码的坏味道(2)——过大的类(Large Class)

    坏味道--过大的类(Large Class) 特征 一个类含有过多字段.函数.代码行. 问题原因 类通常一开始很小,但是随着程序的增长而逐渐膨胀. 类似于过长函数,程序员通常觉得在一个现存类中添加新特 ...

  4. 分享我的开源项目-springmore

    之前有在博客园分享过springmore,不知道是什么原因,被管理员移除首页 在此郑重声明,这是我个人的开源项目,东西不多,也不存在打广告,也没有什么利益可图 完全是出于分享的目的,望博客园管理员予以 ...

  5. 《Javascript高级程序设计第3版》精华总结

    一.JavaScript简介   1.1 javascript简史 1.2 javascript实现 + javascript是一种专为网页交互而设计的一种脚本语言,javascript由三大部分组成 ...

  6. loaded the "ViewController" nib but the view outlet was not set.'

    错误代码: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[U ...

  7. flex中通过代码获取supermap的token

    最近工作中需要使用代码来获取supermap服务启动安全访问限制以后的token值,经过一番尝试,最终成功获取到,记录下里,以供翻阅 //get token public function getTo ...

  8. K米--案例分析

    第三次作业- -K米软件评测 第一部分 调研.评测 评测: 下载并使用.描述最简单直观的个人第一次上手体验: 第一次下载打开.这个简介粗矿的界面让偶着实吓了一跳.界面设计的有板有眼.直接了当.就像是在 ...

  9. 3. sort命令

    转自:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分 ...

  10. Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39

    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39 V1  初步实现sina csdn cnblogs V2  实现qzone sohu 的发帖 ...