HTTP (HyperText Transfe Protocol)超文本传输协议,是一种基于 TCP/IP 的网络协议。
HTTP 是一种无状态的协议,即 客户端向服务器发请求的时候服务器不会存储关于客户的任何信息,这样即使这个客户很快的再次请求同一个资源的时候服务器是不会认识他的,而是再次重新发送这个资源。所以为了支持客户端和服务器的交互,引入了cookie 和 session 技术。
cookie 保存在客户端,session 保存在服务器端。
HTTP 协议现在有两个版本,HTTP/1.0 和 HTTP/1.1
它们的区别包括:
1 缓存处理
2 带宽优化及网络连接的使用
3 错误通知的管理
4 消息在网络中的发送
5 互联网地址的维护
6 安全性及完整性
转载请注明出处:http://blog.csdn.net/m0sh1/article/details/45770429
这里可以说比较主要的一点区别就是 HTTP/1.1 默认开启了 keep-alive .
当使用 HTTP/1.0 访问一个有很多图片资源 css js 的网页时,客户端的每一个请求都需要重复建立连接和关闭连接,既造成了消耗有造成了延迟。
但是使用 HTTP/1.1(开启 keep-alive) 就可以在设定的时间内重复使用之前建立好的连接。即一次连接可以包含多次请求和响应。
我们可以通过浏览器查看一个请求消耗的时间。
也可以查看请求头信息
可以看到设置了 connection: keep-alive ,同时可以看到 timeout设置为20秒
其实这里的 keep-alive 设置的就是 http 长连接(持久连接),通过长连接我们可以使得访问一个网页的速度提升,减少服务器的cpu消耗。
其实在使用浏览器访问 web 页面的时候请求资源是并发的操作。
RFC 文档对此连接数限制是两个,但是不同的浏览器对此的限制并相同。
既然浏览器对于同一个域名的并发请求数量有限制那么我们就可以通过将资源放到不同的域名来提高访问速度。
所以我们通常会需要另外的服务器存放我们的 图片 js css 等资源。
长连接也存在缺点, 那就是每次建立一个长连接服务器都要维护这个连接,从而消耗内存,所以 keep-alive 的timeout 时间也很重要
设置的过短,会重复的大量建立连接,给cpu造成压力。设置过长,系统会堆积许多无用的http连接,消耗大量内存。
Tcp 的keep alive 和 http 的keep alive 是不一样的。 Http 的keep alive 作用如上所述(让连接活久一点,在一定时间内可重复使用)。
而Tcp 的keep alive 是用来检查当前的TCP连接是否还活着,例如当一个TCP连接长时间没有通信的时候,一方会发送
keep-alive包(心跳包),如果对方有回包则表明连接仍然有效则继续维持。否则关闭连接。
其实我们可以把这里的长短连接,类比数据库的长短连接。
例如 使用php 的pdo 连接数据库
$pdo = new PDO($dsn, $dbUser, $dbPass);
建立 长连接
$db = new PDO($dsn, $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
短连接处理流程
连接 -> 数据传输 -> 关闭连接
长连接处理流程
连接 -> 数据传输 -> 保持连接 -> 数据传输 -> 保持连接 -> … -> 关闭连接
同样的如果频繁的需要与数据库通讯这时候使用短链接会消耗cpu资源,如果使用长连接,系统就要维护这些
长连接,消耗内存。网上的一种说法是 用户少通讯频繁可以使用长连接。
就胡乱说这些吧
转载请注明出处:http://blog.csdn.net/m0sh1/article/details/45770429
参考资料:
http://blog.csdn.net/woshixuye/article/details/18862361
http://baike.baidu.com/view/9472.htm
http://www.zhihu.com/question/20474326
http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
此文章通过 python 爬虫创建,原文是自己的csdn 地址: 从HTTP说起,肆意漫谈