HTTP - 权威指南(二)

avatarplhDigital nomad
前面太长了,开新坑

4.第四章 连接管理

HTTP规范对HTTP报文解释的清清楚楚,但对HTTP连接介绍的并不多,HTTP连接时关键通道, 下面这一章节,你能了解到如下内容:

  • HTTP时如何使用TCP连接的;
  • TCP连接的演示,瓶颈存在的障碍
  • HTTP优化,包括并行连接,keep-alive(持久连接)和管道连接
  • 管理连接超时应该以及不应该做的事情

4.1 TCP连接,世界上几乎所有的HTTP通讯都是由TCP/IP承载的,TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集,客户端应用程序可以打开一条TCP/IP连接,连接到可能运行在世界任何地方的服务器应用程序,一旦连接建立起来,在客户端和服务器之间交换的报文就永不丢失。

当浏览器受到一个URL的时候,会做如下事情:

  • 解析URL,提取端口号
  • 建立到web服务器的TCP连接
  • 并向服务器发送一条http GET报文,
  • 浏览器从服务器读取这条http报文
  • 浏览器关闭连接

4.1.2 TCP流是分段的,由IP组成分组传送

TCP的数据是通过IP分组的小数据块来发送的,这样子,那么HTTPS 其实HTTP就是TCP和IP之间插入一层(称之为TLS或SSL的)密码加密层。 image 下图很好的诠释了http和https之间的区别。http要传输一条报文的时候,会以流的形式将报文数据的内容穿过打开一条TCP连接按序传输。TCP收到数据流之后,会将数据流砍成几段被称之为段的小数据块,并将段封装在ip中,通过internet进行传输,所有这些都是由TCP/IP来完成的,http程序什么都看不到。

每个TCP段都是由IP分组承载的,从一个ip地址发送到另一个ip地址,每个ip分组中包括:

  • 一个IP分组首部(通常为20个字节)
  • 一个TCP首部(通常为20字节)
  • 一个TCP数据块(0个或者多个字节)

IP首部包含了源和目的IP地址,长度和其他标记,TCP段的首部包含了TCP端口号,TCP控制标记,以及一些用于数据排序和完整性检查的一些数字值,

4.1.3保持TCP连接持续不断地运行

在任意时刻,计算机都有几条TCP连接处于打开状态,TCP是通过端口号来保持这些连接持续不断的运行下去。 端口号和雇员使用的电话分机号很类似,tcp连接通过4个属性来连接 <源ip地址,端口号,目的ip,目的端口号> 上面4个唯一值定义了一条唯一连接。两条不同的tcp不能拥有4个完全相同的地址组件值(但是不同的连接的部分组件可以拥有相同的值)。

4.2 对TCP性能的考虑

HTTP紧接着TCP,位于其上层,所以HTTP事物的性能,很大程度上取决于底层TCP性能。

4.2.1 HTTP事物的时延

HTTP事物的演示主要有以下几点原因

  • (一)客户端首先需要根据URL确定web服务器和其端口号,如果最近都没有访问过URL的话,解析url转ip需要十几秒。
  • (二)接下来,客户端会向服务端发送一条TCP连接请求,并等待服务端回应。
  • (三)一旦服务端连接建立起来,客户端会通过新建立的TCP管道发送HTTP请求,数据一旦到达的时候,web服务器会从TCP连接中读取请求报文,并对请求进行处理,因特网传输请求报文,以及服务器处理报文都需要时间,
  • (四)然后,web服务器会会送HTTP响应,这也要时间。

4.2.2 性能聚焦区域

  • TCP连接建立握手
  • TCP慢启动拥挤法则
  • 数据聚集的Nagle法则
  • 用于捎带确认的TCP延迟算法
  • TIME_WAIT时延的端口耗尽

4.2.3 TCP握手连接握手延时

TCP握手如下步骤

  • 1.请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组,其中设立了一个小的TCP分组,通常40~60多个字节
  • 2.如果服务器接受了连接,就对一系列连接参数进行计算,,并向服务器发送一个TCP分组,这个分组中的SYN和ACK标记都会被置位,
  • 3.最后,客户端向服务器会送一条确认信息,通知他已经成功建立连接,,现代TCP栈都会允许客户端在这个确认分组中,发送数据。

最终结果是,小的HTTP事物可能会在TCP连接上花费50%,

4.3.2串行事物处理延时

如果只对连接进行简单的管理,TCP的性能时延会可能叠加,比如某个页面,htm文件,另外三个图片url,如果每个事物都需要一条新的http请求,这个时候如果是串行,通过以下方法提高连接速度

  • 并行连接 通过多条TCP连接并发的HTTP请求。
  • 持久连接 重用tcp连接,以消除相关的延时。
  • 管道化连接 通过共享的TCP连接发起并发的HTTP请求
  • 复用的连接 交替传送请求和响应的报文

4.4 并行的连接

并行连接肯定很快,但是不可能总是最快,因为这个涉及到一个带宽的问题。

4.5 持久链接

初始化之后,可能会陆续发起其他请求,这个时候就好触发持久链接,在事物处理完成之后,连接依然保持,这种就是持久连接,持久于并行连接一起用,会是一种最好的方式,持久连接就是keep-alive。

http1.1逐渐停止了对Keep-alive的连接支持,,用一种持久连接来替代它。(persistent connection)的改进设计取代它,持久连接的目的于keep-alive连接的目的相同,但是机制更加优先。 浏览器默认除非收到一条Connection: close首部,不如,http连接依然处于连接状态。

持久链接的限制和规则,

  • 最后一条请求中应该在报文中带Connection: close首部,
  • 只有当持久连接的所有报文都正确,,自定义报文长度一致,

4.6 管道化连接

持久连接的基础上才能使用管道连接,当你发送第一条连接的时候,还没有返回,第二条也开始发送,这就是管道连接。管道化连接使用原则:

  • 如果无法确认连接是持久化的话,就不应该使用过管道化连接。
  • 不应该使用post请求发送,post有副作用,如果请求出错

第五章 web服务器

实际上web服务器到底做了什么,

  • 建立连接---接受一个客户端,或者不希望于这个客户端建立连接,就关闭)
  • 接受请求---从网络中读取一条HTTP请求,报文
  • 处理请求---对请求报文进行解析,并采取行动
  • 访问资源---访问报文中指定资源,
  • 构建响应---创建带有正确http响应的报文
  • 发送响应---将响应送给客户端。
  • 记录事物处理过程---将已完成事物有关的内容记录在一个日志文件

第一步-----打开客户端连接

如果客户端已经打开一条服务器持久连接,可以使用那条连接来发送请求,否则,打开一条新的到服务器的连接。

第二步-----接受请求报文

连接上有数据的时候,

第七章,缓存

当web请求抵达缓存时候,,如果本地有副本就不会再次请求其他东西。瞬间拥挤,很多人同时去访问某个web文档,

距离问题

将缓存放在距离数千万公里远的美国,,就算以光速计算,也有15ms延迟,如果某个页面有20个图片,那么就有240ms延迟,如果是在国内要去美国服务器下载,距离6700英里,延时就会有600ms,中等页面,会有多达6s延迟,如果内容没有变化,就返回304Not Modified进行响应。

代理缓存的层次结构

过期日期和使用期

http/1.0的expires首部,http/1.1的Cache-Control:max-age响应首部指定过期日期,推荐使用Cache-Control:max-age,

第八章 网关

事实证明web就是一个强大的内容发布工具,

8.1 网关

它是资源和应用程序之间的粘合剂,应用程序可以通过网关,来处理一些请求,,网关提供一条响应,向数据库发送查询请求,同时,有些网关会自动将HTTP浏览转换成其他协议,这样http客户端就无需了解其他协议了,就能和应用程序进行交互,比如:

https ===>  网关 ===> http

8.5 隧道

使用web隧道最常见的原因就算要在http中嵌入非HTTP流量,这样就可以穿过防火墙了。 最初开发web隧道,就是为了通过防火墙来传输加密的SSL流量,同时,为了不让隧道被滥用,默认只能为https的端口443打开隧道。

第九章 web机器人

web机器人会在网上游荡,比如图形股票机器人,就会不定期向股票市场发送,HTTP GET,用于得到股票市场信息,或者同于万维网扫荡网络统计信息。再比如购物机器人,会自动扫荡商品。

web爬虫则是一种递归机器人,对web站点进行遍历,所以就叫做爬虫(crawler)或者蜘蛛(spider)。

9.1.1 从哪开始

爬虫被放出去之前,需要一个起始节点,挑选根集合,应该在不同站点的url,这样爬遍的连接才是所有你感兴趣的连接,一般就是a链接吧。 链接的提取以及转化,需要不停的处理html页面,迅速扩张。但是实际过程中,经常遇到的就是循环引用的链接。

9.1.5 面包屑留下的痕迹

记录曾经去过哪是不容易的,如果要爬取世界范围内的web内容,那就要做好访问数十亿URL的准备,记录哪些URL已经访问过了,是很不容易的事情。

数十亿的URL需要具备快速搜索的结构,所以速度很重要,以下是一些有用的经验

  • 树和散列表 复杂的机器人可能会用到搜索树或者散列表来标记已访问的URL,这是加速URL查找的软件数据结构
  • 有损的存在位图 为了减小空间,,使用有损数据结构,比如存在位数组,用一个散列函数,将每个URL都转化成一个定长的数字,爬过一个URL时候,就认为已经爬过了,
  • 检查点 一定要将已反问的URL列表保存在硬盘中,以防机器人崩溃。
  • 分类 集群爬取数据。因为单台机器会崩溃

9.1.7 规范化URL

  • 如果没有端口 就默认添加80端口
  • 将所有%xx转化成等价字符串
  • 删除#标签
  • 机器人需要知道web服务器是否大小写无关

9.1.10 避免循环 和重复

可以做一些事情避免重复循环

  • 规范化URL,
  • 以广度优先的爬行
  • 节流
  • 限制URL的大小
好吧,后面的真的没法看,就看到第四章就打止吧。