1Web的结构组件

1.1代理

代理位于客户端和服务端之间,接受所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改)

1.2缓存

将经过代理传送的常用文档保存起来,供下次请求时传送

1.3网关

网管请求时就好像自己是资源的源端服务器一样,客户端可能并不知道自己正在跟一个网管进行通信. 通常用于将HTTP转换成其他协议.

1.4隧道

用于通过HTTP协议传送其他协议的数据包

1.5Agent代理

代表用户发起HTTP请求的客户端程序,例如Web浏览器

2URL语法

每个URL方案的语法格式是不一样的,但是大多数URL语法都建立在这9给部分构成的通用格式上:

<scheme>://<user>:<password>:<port>/<path>:<params>?<query>#<frag> 这里参数为键值对,URL中可以包含多个参数字段,他们之间以及与路径的其余部分之间用分号;分隔 查询组件的内容没有通用格式,用字符?将其与URL的其余部分分隔开来.例如?key1=value1&key2=value2 片段制定了URL资源中的某个章节

  • 参数例子

  • 查询字符串例子

  • 片段例子

3HTTP报文

3.1报文的组成

每个报文都由三个部分组成:

  • 对报文进行描述的起始行(start line)

  • 包含属性的首部行(header)

  • 可选的,包含数据内容的主体部分(body)

3.2报文的语法

  • 请求报文格式

    <method> <request-URL> <version> <headers>

    <entity-body>

  • 响应报文格式

    <version> <status> <reason-phrase> <headers>

    <entity-body>

3.3方法说明

3.3.1GET

用于请求服务器发送某个资源,该方法为安全方法

GET /season1/index-fall.html HTTP/1.1Host: www.joes-hardware.comAccept: *

3.3.2HEAD

与GET方法类似,但服务器在响应中只返回首部,不会返回实体的主体部分. 该方法也是安全方法

HEAD /season1/index-fall.html HTTP/1.1Host: www.joes-hardware.comAccept: *

使用HEAD可以做到

  • 在不获取资源的情况下了解资源的情况

  • 通过查看响应中的状态码,看看某个对象是否存在

  • 通过查看首部,测试资源是否被修改了.

3.3.3PUT

PUT方法往服务器写入文档,该方法的语义就是用让服务器用主体部分来创建或替代一个由所请求的URL命名的新文档.

PUT /product-list.txt HTTP/1.1Host: www.joes-hardware.comCotent-type: text/plainContent-length: 34Updated product list coming soon!

3.3.4POST

向服务器发送数据,常用于POST HTML的表单数据

3.3.5TRACE

由于客户端发起的请求在经过中间节点时,可能会进行修改. 服务器收到该请求时会返回一个TRACE响应,该响应主体中携带它收到的原始请求报文.

TRAC /season1/index-fall.html HTTP/1.1Host: www.joes-hardware.comAccept: *

3.3.6OPTIONS

询问服务器支持的各种功能

OPTIONS * HTTP/1.1Host: www.joes-hardware.comAccept: *

3.3.7DELETE

请求服务器删除指定文档

DELTE /season1/index-fall.html HTTP/1.1Host: www.joes-hardware.com

3.3.8LOCK

允许用户锁定资源,该方法为扩展方法

3.3.9MKCOL

允许用户创建资源,该方法为扩展方法

3.3.10COPY

便于在服务器上复制资源,该方法为扩展方法

3.3.11MOVE

在服务器上移动资源,该方法为扩展方法

3.4状态码说明

  • 100~199 信息性状态码

  • 200~199 成功状态码

  • 300~399 重定向状态码

  • 400~499 客户端错误状态码

  • 500~599 服务器错误状态码

3.5首部说明

可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF. 首部是由一个空行(CRLF)结束,表示首部列表的结束和实体部分的开始.

3.5.1通用首部

通用首部提供了与报文相关的最基本的信息. 它们可以用于任何报文中

通用信息首部
首部 描述
Connection 允许客户端和服务器指定与请求/响应连接有关的选项,所有Connection中列出的首部类型,在报文转发时必须被删除!
Date 报文什么时间创建的
MIME-Version 给出了发送端使用的MIME版本
Trailer 如果报文采用了分块传输编码方式(chunked transfer encoding),就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合
Transfer-Encoding 告知接收端为了保证报文的可靠传输,对报文采取了什么编码方式
Update 给出发送端可能想要转换的新版本或新协议
Via 显示了报文经过的中间节点
通用缓存首部
首部 描述
Cache-Control 用于随报文传输缓存指示
Pragma 另一种随报文传送指示的方式,但不专用于缓存

3.5.2请求首部

请求报文是指在请求报文中有意义的首部

请求信息首部
首部 描述
Client-IP 客户端的IP
From 客户端用户的E-mail
Host 接收请求的服务器的主机名和端口号
Referer 包含当前请求URI的文档的URL
UA-Color 给出了客户端CPU的类型或制造商
UA-Disp 给出了与客户端显示器能力有关的信息
UA-OS 给出了运行在客户端上的操作系统名称与版本
UA-Pixels 提供了客户端显示器的像素信息
User-Agent 将发起请求的应用程序名称告知服务器
Accept首部
首部 描述
Accept 告诉服务器能够发送哪些媒体类型
Accept-Charset 告诉服务器能够发送哪些字符集
Accept-Encoding 告诉服务器能够发送哪些编码格式
Accept-Language 告诉服务器能够发送哪些语言
TE 告诉服务器可以使用哪些扩展传输编码
条件请求首部
首部 描述
Expect 允许客户端列出某请求所要求的服务器行为
If-Match 如果实体标记与文档当前的实体标记相匹配,就获取这份文档
If-Modified-Since 除非在某个指定的日期之后资源被修改,否则就限制这个请求
If-None-Match 如果提供的实体标记与当前文档的实体标记不相符,就获取文档
If-Range 允许对文档的某个范围进行条件请求
If-Unmodified-Since 除非在某个指定日期之后资源没有被修改过,否则就限制这个请求
range 如果服务器支持范围请求,就请求资源的指定范围
安全请求首部
首部 描述
Authorizatin 包含了客户端提供给服务器的身份认证数据
Cookie 客户端用它向服务器传送一个令牌
Cookie2 说明请求端支持的cookie版本
代理请求首部
首部 描述
Max-Forward 最大转发次数,与TRACE方法一起使用
Proxy-Authorization 与代理服务器进行认证时的身份数据
Proxy-Connection 在与代理建立连接时使用的Connection首部,它主要用于克服Connection首部不被一些代理支持的问题

3.5.3响应首部

响应首部是响应报文专有的首部

响应信息报文
首部 描述
Age 响应持续时间
Public 服务器为其资源支持的请求方法列表
Retry-After 如果资源不可用的话,在此日期或时间重试
Server 服务器应用程序软件的名称和版本
Title 对HTML文档来说,就是HTML的title标签的内容能够
Warning 比原因短语更详细的警告报文
协商报文
首部 描述
Accept-Range 对此资源来说,服务器可接受的范围类型
Vary 服务器查看的其他首部的列表
安全响应首部
首部 描述
Proxy-Authenticate 来自代理的对客户端的质询列表
Set-Cookie 在客户端设置一个令牌,以便服务端对客户端的识别
Set-Cookie2 与Set-Cookie类似
WWW-Authenticate 来自服务器的对客户端的质询列表

3.5.4实体首部

实体首部提供了有关实体及其内容的大量信息

实体信息首部
首部 描述
Allow 列出了可以对此实体执行的请求方法
Location 告知客户端实体实际上处于何处;用于将接收端重定位到资源的新URL上去
内容首部
首部 描述
Content-Base 解析主体中的相对URL时使用的基础URL
Content-Encoding 对主体执行的任意编码方式
Content-Language 理解主体时最适宜使用的自然语言
Content-Length 主体的长度
Content-Location 资源实际所处的位置
Content-MD5 主体的MD5校验和
Content-Range 在整个资源中此实体表示的字节范围
Content-Type 这个主体的对象类型
实体缓存首部
首部 描述
ETag 于此实体相关的实体标记
Expires 实体不再有效,要从原始处在此获取次实体的日期和时间
Last-Modified 这个实体最后一次被修改的日期和时间

3.5.5扩展首部

4连接管理

4.1拖慢HTTP的原因

4.1.1TCP连接的握手延迟

TCP连接的握手协议,决定了握手时的前两个报文(SYN与SYN+ACK报文)是无法携带有效信息的. 这是TCP建立连接的必然花费. ACK报文是可以携带有效信息的,因此不算入花费中

4.1.2延迟确认

TCP会对每个报文分段发送确认分组,由于确认报文很小,通常通过输出有效信息时捎带确认信息. 很多TCP会使用一种延迟确认的分组,即在一个特定的时间段内将分组报文缓存起来,以寻找能够携带它的有效信息分组. 当没有足够的有效信息报文时,对每个确认报文都会有一段缓冲时间,这降低了HTTP的效率

4.1.3TCP慢启动

TCP在刚开始时会限制连接的最大速度,如果数据成功传输才会随着时间的推移逐步提高传输的速度. 这种为了防止因特网的突然过载和拥塞的机制称为TCP的慢启动

4.1.4Nagle算法与TCPNODELAY

Nagle算法要求将几个小的TCP数据组到一个大报文中发送,以便提高网络使用率,然而可能HTTP的小数据包很难填满一个大数据包,这造成了延时. 此外nagle算法与延迟确认之间存在交互的影响–Nagle算法会阻止数据的发送,收到确认分组,但确认分组本身会被延迟算法延迟100-200毫秒. TCPNODELAY又可能因为发送大量的小TCP数据而降低网络使用效率.

4.1.5TIMEWAIT累计与端口耗尽

当TCP关闭连接后,会记录下所关闭连接的IP地址和端口,在一段时间内(一般是2分钟)不会再创建具有相同地址和端口的新连接. 由于可用源端口的数量有限,而且在这段时间内无法重用,因此连接率就被限制住了.

4.2解决方案

4.2.1并行连接

通过多条TCP连接发起并发HTTP请求

4.2.2持久连接

重用TCP连接,以消除连接及关闭时延

4.2.3管道化连接

通过共享的TCP连接发起并发的HTTP请求

4.2.4复用的连接

交替传送请求和响应报文(实验阶段)