HTTP
前言
为了理解HTTP,首先需要理解TCP/IP协议族(Transmission Control Protocol/Internet Protocol
)。
TCP/IP
原称为互联网协议族(英语:Internet Protocol Suite,缩写IPS),是一个网络通信模型,以及一整个的网络传输协议家族,是网络网际的基础通讯架构。它通常被通称为TCP/IP
协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称为TCP/IP
。
因为该家族有两个核心协议:TCP(传输控制协议)和IP(网际协议),是改家族的最早的标准。
由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作的时候,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈(英语:TCP/IP Protocol Stack)
TCP/IP提供点对点的连接机制,将资料应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软体通信过程抽象化为四个抽象层,采用协议堆叠的方式,分别制定了不同的通信协议。
必须的协议
所有的TCP/IP应用都必须实现IP和ICMP(互联控制信息协议Internet Control Message Protocol)。对于一个路由器(route)而言,有这两个协议就可以运作,虽然从应用的角度来看,这样一个路由器意义不大。实际的路由器一般还需要运行许多“推荐”使用的协议。
TCP/IP的分层管理
TCP/IP协议族将协议分为了四层:应用层、传输层、网络层和数据链路层。
层次化之后,设计变得简单了。处于应用层的应用仅仅需要考虑分派给自己的任务,而不需要弄清楚对方在地球上哪个地方、对方的传输线路是怎样对的、是否能确保传输送达等问题。
应用层
应用层决定了向用户提供应用服务时通信的活动。
通用应用服务:
- FTP——File Transfer Portocol
- DNS——Domain Name System
- HTTP
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
协议:
- TCP——Transmission Control Protocol
- UDP——User Data Protocol
网络层
又名:网络互联层。
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单元。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或者网络设备进行传输的时候,网络层所起的作用就是在众多的选项内选择一条传输路线。
链路层
又名:数据链路层,网络接口层。
用来处理连接网络的硬件部分,包括操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围内。
四层之间的联系
利用TCP/IP协议族进行网络通信的时候,会通过分层的顺序与对方进行通信。发送端会从应用层(Application)往下传递,而接受端则是从下往应用层传递。
我们用HTTP访问为例,比如发送端在浏览器上想要访问Google的首页,会发出一个HTTP请求,请求Google首页的页面。
接着,在传输层(TCP)上,会把从应用层传递过来的数据(HTTP请求报文)进行切片,并在切片后的各个报文上打上标记序号以及端口号之后转发给网络层。
在网络层(IP),增加作为通信目的地的MAC地址之后转发给链路层。
接收端的服务器在链路层上接收从用户端传递过来的数据,按TCP/IP的分层顺序依次往上传递,逐层剥离附加的字段(MAC、IP、TCP首部)当传输到应用层的时候,才算真正接收到了从客户端发送过来的HTTP请求。
Applicaiton-HTTP
协议 | 说明 | 作用 |
---|---|---|
IP | IP,即Internet Protocol ,网际协议位于网络层。几乎所有使用网络的系统都会采用IP协议。TCP/IP协议族中的IP指的就是网际协议。“IP”和“IP地址”中的“IP”都是协议名称。 |
IP协议的作用就是把各种数据包传送给对方,而要确保传输完成,就需要“IP地址”和“MAC地址”。“IP地址”指明了节点被分配到的位置,“MAC地址”是指网卡所属的固定地址。“MAC地址”基本不会变换,但是“IP地址”可以变换。 |
ARP | ARP,即Address Resolution Protocol 。使用ARP协议凭借MAC地址进行通信。 |
ARP用以解析地址的协议,根据通信双方的IP地址就可以反查出对应的MAC地址。 |
TCP | TCP位于传输层,提供可靠的字节流服务(将大数据块分段【Segment,报文段】传输)。 | 准确可靠的传输数据,确保数据不会丢失和出错。可靠传输就需要了解三次握手。 |
DNS | DNS,即Domain Name System ,位于应用层。 |
DNS协议提供通过域名查找IP 地址,或逆向从IP 地址反查域名的服务。 |
一个访问过程的例子
假如我要访https://www.google.com/
。
- 在浏览器地址栏输入
https://www.google.com/
,发出HTTP-GET请求。 - 向DNS服务器获取
Google域名
的IP地址。 - HTTP协议
- 生成HTTP请求报文
- TCP协议
- 将HTTP请求报文分段,按序号分为多个报文段。
- 把每个报文段可靠传输给对方。
- IP协议
- 搜索对方的地址,一遍中转一遍传送。
- TCP协议
- 接受报文段,按照序号还原HTTP请求报文
- HTTP协议的职责
- 响应请求资源
- 请求的处理结果通过TCP/IP通信协议回传。
HTTP特征
特征 | 说明 | 作用 |
---|---|---|
无状态 | HTTP自身不具备保存之前发送过的请求或者响应的功能。 | 这是为了更快的出处理大量的事务,确保协议的可伸缩性,而特意把HTTP协议设计得如此简单。后面采用了cookie作为状态管理。 |
持久连接 |
HTTP/1.1 和一部分的HTTP/1.0 采用了持久连接(HTTP Persistent Connections ,也称为HTTP keep-alive 或HTTP connection reus )的方法。 |
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提高了。(HTTP1.1中,所有连接默认都是持久化连接,在1.0中并为标准化) |
管道化 | 持久连接使得多数请求以管道化(pipelining )方式发送成为可能。 |
能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。 |
HTTP报文
请求报文:
响应报文:
状态码
状态码 | 说明 |
---|---|
1XX | Informational(信息性状态码) |
2XX | Success(成功状态码) |
3XX | Redirection(重定向状态码) |
4XX | Client Error(客户端错误状态码) |
5XX | Server Error(服务器错误状态码) |
请求首部字段
字段 | 说明 | 示例 |
---|---|---|
Accept | 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype 这种形式,一次指定多种媒体类型。 |
text/html |
Accept-Charset | 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。 | Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 |
Accept-Encoding | 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。 | Accept-Encoding: gzip, deflate |
Accept-Language | 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。 | Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3 |
Authorization | 用来告知服务器,用户代理的认证信息(证书值)。 | Authorization: Basic dWVub3NlbjpwYXNzd29yZA== |
Expect | 客户端使用首部字段Expect 来告知服务器,期望出现的某种特定行为。 |
等待状态码 100 响应的客户端在发生请求时,需要指定 Expect:100-continue。 |
From | 告知服务器使用用户代理的用户的电子邮件地址。 | |
Host | 告知服务器,请求的资源所处的互联网主机名和端口号。 | Host: www.google.com |
If-Match | 条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。 | If-Match: “123456” |
If-Range | 告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。 | |
Max-Forwards | 每次转发数值减1。当数值变0时返回响应。 | |
Referer | 告知服务器请求的原始资源的 URI。 | |
User-Agent | 首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。 | User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1 |
响应首部字段
字段 | 说明 | 示例 |
---|---|---|
Accept-Ranges | 首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。 | 可处理范围请求:Accept-Ranges: bytes,当不能处理范围请求时,Accept-Ranges: none |
Age | 首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。 | Age: 600 |
ETag | 告知客户端实体标识。 | ETag: “82e22293907ce725faf67773957acd12” |
Location | 可以将响应接收方引导至某个与请求 URI 位置不同的资源。 | Location: https://www.google.com |
Proxy-Authenticate | 首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。 | |
Retry-After | 首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。 | Retry-After: 120 |
Server | 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。 | Server: Apache/2.2.17 (Unix) |
Vary | 当代理服务器接收到带有 Vary 首部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回。 |
实体首部字段
字段 | 说明 | 示例 |
---|---|---|
Allow | 通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。 | |
Content-Encoding | 告知客户端服务器对实体的主体部分选用的内容编码方式。 | Content-Encoding: gzip |
Content-Language | 告知客户端,实体主体使用的自然语言(指中文或英文等语言)。 | Content-Language: zh-CN |
Content-Length | 表明了实体主体部分的大小(单位是字节)。 | Content-Length: 15000 |
Content-Location | 给出与报文主体部分相对应的 URI。 | |
Content-Range | 返回响应时使用的首部字段 Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。 | Content-Range: bytes 5001-10000/10000 |
Content-Type | 说明了实体主体内对象的媒体类型。 | Content-Type: text/html; charset=UTF-8 |
Expires | 将资源失效的日期告知客户端。 |
HTTPS
HTTP
加上加密处理和认证以及完整性保护后即是HTTPS
。
HTTP的瓶颈
- 一条连接上只发送一个请求
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大。
- 可任意选择数据压缩格式。非强制压缩发送。
HTTP1.0
- 默认支持长连接。
- 节省了每次创建TCP连接的开销。
- 节约带宽
- HTTP1.0支持只发送header信息(不带任何body信息)。
- 如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送body请求,节约了带宽。
- 另外HTTP还
支持传送内容的一部分
。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传
的基础。
- Host域
- 支持多个虚拟站点共享同一个ip和端口。
HTTP2.0
-
SPDY
- 基于TCP开发的应用层协议,在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。考虑到安全性问题,
SPDY
规定通信中使用SSL
。 - 最小化网络延迟,提升网络速度,优化用户体验。
- 主要功能:
- 多路复用——SPDY允许在一个连接上无限制并发流。
- HTTP报头压缩
- 请求优先级
- 高级特征:
- 服务器启动流——服务器启动流能用来分发内容到客户端,而不需要客户端发起请求。
-
推送功能
Server push
:SPDY
通过X-Associated-Content
头实现了服务器推送数据给客户端的选项,用以告诉客户端服务器将在客户端请求资源之前,推送资源给它。对于初始页面下载(例如用户初次访问这个网站),这样能大大提升用户体验。 -
服务器提示功能
Server hint
:相对于自动推送资源到客户端,在服务器事先知道客户端需要的资源的情况下,服务器使用X-Subresources
头建议客户端请求特殊的资源。但是,服务器仍然在发送内容前等待客户请求。通过窄带,这个选项能减少一个客户端发现它所需要的资源的数百毫秒,可能更适合于非初始页面加载。
-
推送功能
- 服务器启动流——服务器启动流能用来分发内容到客户端,而不需要客户端发起请求。
- 基于TCP开发的应用层协议,在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。考虑到安全性问题,
- HTTP Speed + Mobility
- Network-Friendly HTTP Upgrade