http学习笔记(3)
几乎所有的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学习笔记(3)的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
随机推荐
- CentOs Linux 文件位置标记
vsFTP默认位置: 匿名:/var/ftp/ 用户:/home/用户名 配置文件:/etc/vsftpd/ (一般安装软件后都会在/etc/下生成一个软件相关的配置文件夹) 防火墙位置: /etc/ ...
- jq入门--选择器
选择器是JQuery一大特色,所有的DOM操作.事件操作.Ajax操作都离不开选择器.熟练掌握JQuery的选择器,可以节省很多代码,很大程序上简化我们的脚本编程工作. JQuery的选择器很类似于样 ...
- Windows7下搭建Django运行环境
一直都是在Linux环境下搭建django的运行环境,开学因为需要叫前端的同学帮忙修改模板,所以需要在Windows下搭建起运行环境,想来PHP倒是有不少集成开发环境,Python倒是少的可怜…只在w ...
- leetcode第31题--Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- MVC5系列——布局视图
MVC5系列——布局视图 目录 系列文章 概述 布局视图 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加 ...
- web开发中的多线程死锁问题,避免死锁
1.什么是死锁,产生死锁的原因,和产生死锁的必要条件 所谓死锁(DeadLock),是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局,当进程或线程处于僵局时,若无外力作用,它们将无法再向前推进 ...
- 免费的编程中文书籍索引 from github
免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿. 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些 ...
- 读书笔记—CLR via C#章节4-7
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- sqlclr创建表值函数案例
----------------------------------------------:定义表值类型:(1.一定返回的是IEnumerable2.一定带参数3.一定有FillRowMethodN ...
- PBKDF2WithHmacSHA1算法
主要用于明文密码加密字符串存入数据库.由棱镜门思考.目前大部分企业中都是明文密码.一旦被攻破.危害非常大.现在主流加密技术是MD5加密.不过MD5的存在小概率碰撞(根据密码学的定义,如果内容不同的明文 ...