http学习笔记(三)
几乎所有的http通信都是由TCP/IP承载的。http好比一辆汽车,而TCP是一条公路,所有的汽车都要在公路上跑,看看http是如何在tcp这条公路上往返的。

首先简单地看看tcp,TCP连接是通过4个值来识别的:
<源IP地址 源端口号 目的IP地址 目的端口号>
这四个值定义了一个TCP连接,两条不同的TCP连接中这四个值是不可能完全都相同的。
在第一篇中有一个简单的HTTP介绍,下面是一个比较完整的HTTP连接过程:

由此看出,http实际上是在tcp协议(建立连接通信)的基础上传输的,但是tcp有一些本身的机制阻止了http的性能:
①客户端发送一个请求到服务器,建立一个tcp连接是需要消耗一定的时间的,如果我们发送了上百个连接,那么这个时间就会大大增加。
②tcp是慢启动的,也就是说,在tcp连接刚刚建立起来的时候,传输的速度会被限制,假如传输成功,随着连接建立的时间推移,传输速度才会被提升。而在http是无状态的,每次客户端提出一个请求,都要重新建立一个连接。
③TCP中有一个Nagle算法,它鼓励把数据攒到了一定数量了再发包,而一般而言,http中一些小的报文,根本无法积累到那个数量,这样就造成了等待哪些永远都无法到来的额外数据造成的损失。
④tcp有一个运行机制,就是一个连接被关闭的时候,内存中会维护一个信息,在一定的时间范围内,不会创建一个具有相同地址和端口号的新连接。如果http请求被发送,那么端口有可能很快就会被耗尽,毕竟可以用的端口是有限的。
http的连接管理方式
在http中最简单的事务处理,就是串行事务处理了。假设一个页面有两张图片,客户端请求这个页面,一共要发起3个事务(串行地建立)。这种方式效率非常低,要经历三次慢启动和连接延时。
比起串行事务处理,并行连接处理事务的效率就要稍微好一些了,它将先发起一个连接,然后同时发起两个连接加载图片,而不是一个接一个地发起连接,如果这里有很多图片要加载,那么这种方式的连接效率会比串行要高得多了。但是这种方式,依然存在一个问题,就是发起了很多的连接,这样很快就会耗尽端口资源,并且带宽如果不是很宽,所有的连接都去竞争带宽,网页的加载速度就会很慢了。
其实,并行连接,只是让人感觉快一点,因为它发起了和串行一样多的TCP连接,多次延迟和慢启动问题依然没有解决。
所以,一种持久连接被人制定出来。即一次,只打开一条tcp连接,在一个期待的时间范围内,这个连接不会被关闭,在此期间,所有的http事务都会在这条tcp连接中传输。这样就可以节约,由于tcp连接建立,带来的延迟和慢启动的问题了。但是由于,http是无状态的,期待时间并不是一个被承诺的值,这条连接随时都可能被关闭。一个客户端对任何服务器和代理最多只能维护两条持久连接,这样也是为了防止服务器过载。

图片来源:wikepedia
在持久连接的基础上,http/1.1又进行了一个优化——允许建立一个请求管道。当第一条请求发出去后,可以放入多条请求,然后被连续的发送(不必等待响应报文到达就就发送下一条请求报文),这样大大优化了性能。这里应该注意如果我们不确定我们连接是持久的,就不该使用管道。客户端也要做好连接被随时关闭的准备,这意味着一些信息要被重新发送,这些信息不应该是像post这样的重要传输信息,假如我们在网上购物,提交了一份订单,但是因为管道被关闭的问题,post被再次发送,那么会造成一定的混乱。

图片来源:wikepedia
什么时候连接会被关上?
前面多次提到了连接的发起,一个连接会被发起,就会被关闭。那么什么时候它会被关上呢?
第一种自然是tcp的正常关闭了。当一个事务被完成,两端会先关闭输出信道,客户端和服务器都告诉对方,没有更多的数据了之后,两端把输入信道也关闭了。这样连接就被关闭了。
而其他的连接关闭方式,就显得不是很美好了。比如:当一个客户端在写一个比较大的请求报文的时候,连接是空闲的,服务器认为连接已经没有用了,就会关闭连接了。有时候,客户端的网络出现了问题,连接被意外关闭了,但数据还在传输,服务器就要应对这种情况,尽量保证数据的完整性。
这里只是简单地描述了下tcp和http的关系,实际上它们在工作的过程中会遇到诸如网关,代理等因素影响,导致更麻烦的问题。不过一旦了解了这些概念,我们可以就可以更好地优化自己的站点了。
http学习笔记(三)的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- DIV页面布局,开局代码
DIV页面布局,开局代码 主要是style部分和body部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- AngularJS四大特性
Google AnguarJS是一个JS框架,适用于以数据的CRUD操作为主的SPA应用. 四大特性: (1)MVC模型 Model:模型,即数据=>JS中的变量 View:视图,即数据的呈现= ...
- 【Mail】搭建邮件服务器(LAMP+Postfix+Dovcot+PostfixAdmin+Roundcubemail)
大纲 一.mail部署说明 二.安装准备 三.LMAP环境配置 四.配置postfixadmin 五.配置postfix 六.配置dovecot 七.测试SMTP和POP3服务 八.配置Roundcu ...
- IE8的兼容性问题
IE的兼容性问题是前端开发人员的老大难问题,不过随着时代的发展,IE6逐渐的被淘汰,现在以及很少有网站兼容IE6了,一般都兼容到IE8,现在我总结了一些IE8的兼容性问题及解决方法. 1.使用meta ...
- 时间管理的若干Tips
时间管理的若干Tips 记下来 再好的记性也不如一支笔与一个本子. 买一支好点的笔于一个好点的本子,让自己有书写的欲望,将todo事项记下来. 小目标 太大太远的目标会使人气馁.通过将大目标分解再分解 ...
- GridView基础知识
首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...
- vc11(vs2012)下编译php
需要原料: vs2012.php源码 1.本机的mingw没搞定,参考网上文章尝试vs2012编译,借助vs2012自带的命令行工具: 需要去bison官网下载bison.exe放在“c:/windo ...
- angularjs的四大特征
angularjs四大特性: 1.MVC模式: Model:数据,其实就是angular变量($scope.XX,$rootScope.XX); View:数据的呈现,Html+Directive(指 ...
- java设计模式之-----桥接模式
一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又 ...
- HtmlAgilityPack组件
HtmlAgilityPack组件用于解析Html字符串,一个典型的应用场景是用于网页爬虫. 示例程序 using Common.Tools; using Datebase.Entity; using ...