目录
HTTP权威指南-学习笔记
HTTP (Hypertext Transfer Protocol, 超文本传输协议)
HTTP: Web的基础
- Web客户端和服务器: Web内容都是存储在服务器上的,Web服务器使用的是HTTP协议。
- 资源: Web服务器是Web资源(Web resource)的宿主,Web资源是Web内容的源头。
- HTTP仔细地给每种要通过Web传输的对象都打上名为MIME(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展)类型的数据格式标签。
- 统一资源标识符(Uniform Resourse Identifier, URI), 唯一标识并定位信息资源。
- URL(统一资源定位符,大量使用中)和URN(统一资源名)两种对象。
- 一条HTTP事物由一条请求命令和一个响应结果组成。HTTP报文(HTTP message)格式化数据块进行的。
- 每条HTTP请求都包含一个方法: 该方法告诉服务器要执行什么动作: 获取一个Web网页,运行一个网关程序,删除一个文件等。
- GET: 从服务器向客户端发送命名资源。
- PUT: 将客户端的数据存储到一个命名的服务起资源中去。
- DELETE: 从服务器中删除命名资源。
- POST: 将客户端数据发送到一个服务器网关应用程序。
- HEAD: 仅发送命名资源响应中的HTTP首部。
- 每条HTTP响应报文返回时都会携带一个状态码(状态码时一个三位数的代码)。
- HTTP报文时由一行一行的简单字符串组成的。
- HTTP报文都是纯文本,不是二进制代码,可以很方便地进行读写。
- 起始行、首部、主体。(请求报文,request message; 响应报文,response message)。
- HTTP是个应用层协议,HTTP无需操心网络通信的具体细节,它把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。
- TCP: 无差错的数据传输,按序传输(数据总是会按发送的顺序到达),未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
- 可以通过Telnet程序直接与Web服务器进行对话。
- Web的结构组件:
- 代理: 位于客户端和服务器之间的HTTP中间实体。
- 缓存: HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
- Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,将代理传送的常用文档复制保存起来。
- 网关: 连接其他应用程序的特殊Web服务器。
- 网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用,通常用于将HTTP流量转换成其他的协议
- 隧道: 对HTTP通信报文进行盲转发的特殊代理。
- 隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据盲转发的HTTP应用程序。
- HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
- HTTP隧道的一种常见用途时通过HTTP连接承载加密的安全套接字层(SSL, Secure Sockets Layer)流量。
- Agent代理: 发起自动HTTP请求的半智能Web客户端。
- Web浏览器。
- HTTP代理服务器时Web安全、应用集成以及性能优化的重要组成模块。(代理作为转发所有Web流量的可信任中间节点使用)
- 代理可以对请求和响应进行过滤。
URL与资源
- URL就是因特网资源的标准化名称。
- URL语法,URL编码核字符规则, 常见的URL方案, URL的未来(URN).
- URI是一种通用的资源标识符, URL实际上是它的一个子集。
- URL的第一部分是URL方案,第二部分是服务器的位置,第三部分是资源路径。
- URL资源可以通过HTTP, FTP, SMTP来访问。
-
<scheme>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
. - 方案名与大小写无关,URL支持使用片段(frag)组件来白哦是一个资源内部的片段。
- http默认端口是80端口号,https默认端口号是443,rtsp(实时流传协议,Real Time Streaming Protocol)解析音视频媒体资源的标志符。
- 永久统一资源定位符(persistent uniform resource locators, PURL): 搜索资源的过程引入一个中间层,通过一个中间资源定位符服务器对资源的实际URL进行登记核跟踪。
HTTP报文
- HTTP报文相当于包裹(是在HTTP应用程序之间发送的数据块),HTTP报文的三个组成部分(起始行,首部和实体的主体部分)。
- 术语"流入"和"流出","上游"和"流出"来描述报文方向。
- 所有报文的发送者在接收者的上游(upstream)。
- HTTP报文的三个部分: 起始行,首部,主体。
- 起始行和首部就是行分割的ASCII文本,报文的主体是可选数据块(主体可以包含文本或二进制数据,也可以是空,Content-Type说明主体是什么,Content-Length说明了主体有多大)。
- 所有的HTTP报文可以分为两种: 请求报文(request message)和响应报文(response message):
- 请求报文的格式:
<method> <request-URL> <version>
<headers> <entity-body>- 响应报文格式:
<version> <status> <reason-phrase>
<headers> <entity-body> - HTTP常用的方法:
- GET: 从服务器获取一份文档。
- HEAD: 只从服务器获取文档的首部。
- POST: 向服务器发送需要处理的数据。
- PUT: 将请求的主体部分存在服务器上。
- TRACE: 对可能经过代理服务器传送到服务器上去的报文进行追踪。
- OPTIONS: 决定可以在服务器上执行哪些方法。
- DELETE: 从服务器上删除一份文档。
- 状态码分类:
- 100~199: 信息提示。
- 200~299: 成功。(200-成功)
- 300~399: 重定向。
- 400~499: 客户端错误。(401-未授权,404-未找到)
- 500~599: 服务器错误。
连接管理
- HTTP的优化: 并行连接,keep-alive(持久连接)和管道化连接。
- TCP为HTTP提供一条可靠的比特传输管道,从TCP连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。
- TCP流是分段的,由IP分组传送: TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。
- HTTP事务的性能很大程度上取决于底层TCP通道的性能,HTTP时延很多情况是由网络时延构成。
- 最常见的TCP相关时延:
- TCP连接建立握手;
- SYN/SYN+ACK(IP分组)会产生一个可测量的时延,TCP连接的ACK分组通常都足够大,可以承载整个HTTP请求报文,而且很多HTTP服务器响应报文都可以直接放入一个IP分组中去。
- 针对小的HTTP事物进行优化,因为小的HTTP事物可能会在TCP建立上花费50%的时间在建立连接上。
- TCP慢启动拥塞控制;
- 每个TCP段都有一个序列号和数据完整性校验和,收到完好的段时会回送一个小的确认分组,发送者在指定时间内没有收到确认信息,就会重发数据;
- TCP将返回的确认信息和输出的数据分组结合在一起,可以有效地利用网络。
- 为了增加确认报文找到同向传输数据分组的可能性,很多TCP栈都实现了一种"延时"确认算法。
- 确认算法会在一个特定窗口时间(100~200毫秒)内将输出确认存放在缓冲区中,以寻找能够捎带它的输出数据分组(没有找到就将确认信息放在单独的分组中传输)。
- HTTP具有双峰特征的请求 -- 应答行为降低了捎带信息的可能(延迟确认算法可能会给HTTP引入相当大的时延)。
- 在对TCP栈的任何参数进行修改之前,一定要对自己在做什么有清醒的认识。
- TCP数据传世的性能还取决于TCP连接的使用期(age),TCP连接会随着时间进行自我协调,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度 -- 这种协调被称作TCP慢启动(slow start), 用于防止因特网的突然过载和拥塞。
- TCP慢启动限制了一个TCP端点在任意时刻可以传输的分组数,由于已调谐连接更快一些,所以HTTP中有一些可以重用现存连接的工具(HTTP持久连接)。
- 数据聚集的Nagle算法;
- TCP有一个数据流接口,应用程序可以通过它将任意尺寸的数据放入TCP栈中(但是每个TCP段中都至少装载了40个字节的标记和首部,所以TCP发送大量包含少量数据的分组,网络性能就会严重下降)。
- Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络效率。
- Nagle算法鼓励发送全尺寸(LAN上最大尺寸得分组约是1500字节,在因特网上是几百字节)得段。
- 只有当其他分组都被确认后,Nagle算法才允许发送非全尺寸得分组。
- Nagle算法会因小的HTTP报文等待额外数据产生时延。Nagle算法会阻止数据的发送,直到有确认分组抵达为止,但确认分租自身会被延迟确认算法延迟100~200毫秒。
- HTTP应用程序常常会在自己的栈中设置参数TCP_NODELAY禁用Nagle算法,提高性能。
- 用于捎带确认的TCP延迟确认算法;
- TIME_WAIT时延和端口耗尽。
- TIME_WAIT端口耗尽是很严重的性能问题,会影响到性能基准。
- 当某个TCP端点关闭TCP连接时,会在内存中维护一个很小的控制块,用来记录最近关闭连接的IP地址和端口号;这类信息会维持一小段时间,通常是估计的最大分段使用.
- TCP连接建立握手;
- HTTP允许在客户端和最终的源端服务器之间存在一串HTTP中间实体(代理、高速缓存等)。
- HTTP的Connection首部字段中有一个由逗号分割的连接标签列表,这些标签为连接指定了一些不会传播到其他连接中去的选项。
- 并行连接: 通过多条TCP连接发起并发的HTTP请求。
- 持久连接: 重用TCP连接,以消除连接及关闭的时延。
- 管道化连接: 通过共享的TCP连接发起并发的HTTP请求。
- 复用的连接: 交替传送请求和响应报文。
- 每条HTTP响应都应该有精确的Content-Length首部,用以描述响应主体的尺寸。
- 尽管用户Agent代理可能会让操作员来选择是否对请求进行重试,但一定不能自动重试非幂等方法或序列。
- 完全关闭与半关闭:
- close()会将TCP连接的输入和输出信道都关闭,称为完全关闭。
- shutdown()单独关闭输入或输出信道,这称为半关闭。
- 使用半关闭来防止对等实体收到非预期的写入错误很关键。正常关闭的应用程序首先应该关闭它们的输出信道,然后等待连接另一端的对等实体关闭它的输出信道。
- 先半关闭其输出信道,然后周期性地检查其输入信道的状态(查找数据,或流的末尾)。如果在一定时间内对端没有关闭信道,应用程序可以强制关闭连接,以节省资源。
HTTP结构
HTTP服务器,代理,缓存,网关和应用程序。
Web服务器
- web服务器会对HTTP请求进行处理并提供响应。所有的Web服务器都能够接收请求资源的HTTP资源的HTTP请求,将内容回送给客户端。
- Web服务器实现了HTTP和相关的TCP连接处理。负责管理Web服务器提供的资源,以及对Web服务器的配置,控制及扩展方面的管理。
- 多线程Web服务器都会对线程/进程的最大数量进行限制。
- 复用I/O的服务器,在复用结构中,要同时监听所有连接上的活动,当连接的状态发生变化时,就对那条连接进行少量的处理;处理后,将连接返回到开放连接列表中,等待下一次状态变化。
- 复用的多线程Web服务器,多线程中的每一个都在观察打开的连接,并对每条连接执行少量的任务。
- Web服务器的文件系统中会有一个特殊的文件夹专门用于存放Web内容,文档的根目录(document root, docroot).
- 服务器不能让相对URL退到docroot之外,将文件系统的其余部分暴露出来。
- 虚拟托管Web服务器会根据URI或Host首部的IP地址或主机名来识别要使用的正确文档根目录。
- 虚拟托管的Web服务器会在同一台Web服务器上提供多个Web站点,每个站点在服务器上都有自己独立的文档根目录。
- 很多Web服务器还提供了对服务器包含项(SSI)的支持。
- 如果一个呃呃超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。状态码303 See Other和307 Temporary Redirect可用于重定向。
代理
Web代理(proxy)服务器是网络的中间实体,代理位于客户端和服务器之间,扮演中间人的角色,在各端点之间来回传送HTTP报文。
- HTTP的代理服务器即是Web服务器又是Web客户端,HTTP客户端会向代理发送请求报文,代理服务器必须像Web服务器一样,正确地处理请求和连接,然后返回请求报文。
- 单个客户端专用的代理被称为私有代理,众多客户端共享的代理被称为公共代理。
- 高速缓存代理服务器,会利用用户间的请求,汇入同一个代理服务器的用户越多,高速缓存服务器就越有用。
- 代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。
- 网关扮演的是协议转换器的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事物处里。
- 商业化的代理服务也会实现网关的功能来支持SSL安全协议,SOCKS防火墙,FTP访问,以及基于Web的应用程序。
- 代理服务器可以看到并接触到所有流过的HTTP流量,所以代理可以监视流量并对其进行修改,以实现很多有用的增值的Web服务。
- 网络安全工程师通常会使用代理服务器来提高安全性。
- 反向代理提高访问慢速Web服务器上公共内容时的性能。反向代理称为服务器加速(Server accelerator)。
- 代理如何获取流量:
- 修改客户端,手工配置,预先配置浏览器,代理的自动配置(Proxy Auto-Configuration, PAC), WPAD的代理发现,Web代理自动发现协议。
- 修改网络
- 修改DNS的命名空间
- 修改Web服务器
- 代理可以作为访问控制设备使用,HTTP定义了一种名为代理认证(Proxy authentication)的机制,这种机制可以阻止对内容的请求,直到用户向代理提供了有效的访问权限证书为止。
缓存
缓存减少了冗余的数据传输,缓存缓解了网络瓶颈的问题,缓存降低了对原始服务器的要求,缓存降低了距离时延(较远的地方加载页面会更慢一些)。
- 缓存还可以缓解网络的瓶颈问题. 缓存在破坏瞬间拥塞(Flash Crowds)时显得非常重要。
- 缓存的拓扑结构:
- 缓存可以是单个用户专用的,也可以是数千名用户共享的,专用缓存被称为私有缓存(private cache),共享的缓存被称为公有缓存(public cache).
- 不同的Web服务器为HTTP cache-control和Expiration首部的设置提供了一些不同的限制。
- 专门有算法来计算文档的使用期和缓存的新鲜度: 已缓存副本的使用期和已缓存副本的新鲜生存期(freshness lifetime)
集成点: 网关,隧道及中继
- Web是一种强大的内容发布工具(数据库内容或动态生成的HTML页面)。
- 在HTTP和其他协议及应用程序之间起到接口作用的网关。
- 允许不同类型的Web应用程序互相通信的应用程序接口。
- 允许用户在HTTP连接上发送非HTTP流量的隧道。
- 作为一种简化的HTTP代理,一次将数据转发一跳的中继。
网关
网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法,网关是资源和应用程序之间的粘合剂。
- 网关可以向数据库发送查询语句,或者生成动态的内容。
隧道
- HTTP的另一种用法 -- Web隧道(Web tunnel), 这种方式可以通过HTTP应用程序访问使用非HTTP协议的应用程序。
- SSL隧道,隧道会通过一条HTTP连接来传输SSL流量,以穿过端口80的HTTP防火墙。
中继
- HTTP中继(relay)是没有完全遵循HTTP规范的简单HTTP代理,中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。
- 盲中继存在一个常见的问题是,由于他们无法正确处理Connection首部,所以在潜在的挂起keep-alive连接的可能。
Web机器人
- Web爬虫是一种机器人,它们会递归地对各种信息性Web站点进行遍历,获取第一个Web页面,然后获取那个页面指向的所有Web页面,然后是哪些页面指向所有Web页面,以此类推。
- 爬虫开始访问的URL初始集合被称作根集(root set).
- 文件系统中的符号连接会造成特定的潜在环路,因为它们会在目录层次深度有限的情况下,造成深度无限的假象。
- 爬虫的自动化程度越高(人为的监管越少),就越可能陷入麻烦之中,有些技术的使用可以使机器人有更好的表现:
- 规划化URL: 将URL转换为标准形式以避免语法上的别名。
- 广度优先的爬行,将环路的影响最小化。
- 节流: 限制一段时间内机器人可以从一个Web站点获取的页面数量。
- 限制URL的大小,URL/站点黑名单,模式检测,内容指纹(计算校验和,checksum),人工监视。
- 大格局:
- Web发展初期,搜索引擎就是一些相当简单的数据库,Web上有数十亿可访问的页面,搜索引擎已经称为因特网用户查找信息不可缺少的工具。
- 现在的搜索引擎都构建了一些名为全文索引的复杂本地数据库,装载了全世界的Web页面,以及这些页面所包含的内容。全文索引就是一个数据库,给一个单词,它可以立即提供包含这个单词的所有文档,创建索引后,就不需要对文档自身进行扫描了。
- 相关性排名(relevancy ranking), 对一系列搜索结果的评分和排序处理。
- 用网关应用程序来生成一些在某些特定单词上可以更好欺骗搜索引擎相关性算法的假冒页面。
- HTTP-NG: 模块化三层: 报文传输层,远程操作层和Web应用功能层。
识别,认证与安全
客户端识别与cookie机制
- 承载用户身份信息的HTTP首部
- 客户端IP地址跟踪,通过用户的IP地址对其进行识别,用户登录,用认证方式来识别用户,胖URL,一种在URL中嵌入识别信息的技术。
- cookie是当前识别用户,实现持久会话的最好方式: 会话cookie和持久cookie。
- 会话cookie睡一种临时cookie,它记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就被删除了。
- 持久cookie的生存时间更长一些,它们存储在硬盘上,浏览器退出,计算机重启时它们任然存在,通常会用持久cookie维护某个用户会周期性访问的站点的配置文件或登录名。
- cookie是可以禁止的,而且可以通过日志分析或其他方式来实现大部分跟踪记录,所以cookie自身并不是很大的安全隐患。
基本认证机制
- HTTP提供了一个原生的质询/响应(challenge/response)框架,简化了对用户的认证过程。
- 基本认证便捷灵活,但极度不安全,用户名和密码都是以明文形式传送的,没有采取任何措施防止对报文的篡改。
- 摘要认证的改进:
- 永远不会以明文方式在网络上发送密码。
- 可以防止恶意用户捕获并重放认证的握手过程。
- 可以有选择地防止对报文内容的篡改。
- 防范其他集中常见的攻击方式。
- 使用传输层安全(Transport Layer Security, TLS)和安全HTTP(Secure HTTP, HTTPS)协议更安全一些。
- MD5摘要,用随机数防止重放攻击,摘要认证的握手机制:
- 服务器会计算出一个随机数,并将随机数放到WWW-Authenticate质询报文中。
- 客户端选择一个算法,计算出密码和其他数据的摘要,将摘要放在一条Authorization报文中发回服务器。
- 服务器接收摘要,选中的算法以及支撑数据,计算出与客户端相同的摘要。
- 多重质询: 如果服务器不了解客户端能力,就可以即提供基本认证质询,又提供摘要认证质询;客户端面对多重质询时,必须以它所支持的最强的质询机制来应答。
- 域值,与被访问服务器的标准根URL结合在一起,定义了保护空间。
安全HTTP
重要的事务需要将HTTP和数字加密技术结合起来使用,才能保证安全。
- HTTPS是最流行的HTTP安全形式,数据都要通过安全层(SSL或TLS)进行加密处理。
- 密码: 对文本进行编码,使偷窥者无法识别的算法。
- 密钥: 改变密码行为的数字化参数。
- 对称密钥加密系统: 编解码使用相同密钥的算法。
- 不对称密钥加密系统: 编解码使用不同密钥的算法。
- 公开密钥加密系统: 一种能够使数百万计算机便携地发送机密报文的系统。
- 数字签名: 用来验证报文未被伪造或篡改的校验和。
- 数字证书: 由一个可信的组织验证和签发的识别信息。
- 流行的对称密钥加密算法包括: DES, Triple-DES, RC2和RC4.
内容发布与分发
Web主机托管
- 对内容资源的存储、协调以及管理的职责称为Web主机托管(主机托管使Web服务器的主要功能之一)。
- 主机托管服务,专用托管,虚拟主机托管
重定向与负载均衡
- HTTP并不是独立运行在网上,很多协议都会在HTTP报文的传输过程中对其数据进行管理:
- HTTP 重定向
- DNS 重定向
- 任拨路由
- 策略路由
- IP MAC转发
- IP地址转发
- WCCP(Web缓存协调协议)
- ICP(缓存间通信协议)
- HTCP(超文本缓存协议)
- NECP(网元控制协议)
- CARP(缓存阵列路由协议)
- WPAD(Web代理自动发现协议)
- 网络中的重定向的优点: 可靠地执行HTTP事务,最小化时延,节约网路带宽。