图解HTTP
第一章
web使用HTTP (HyperText Transfer Protocol,超文本传输协议)协议作文规范,完成从客户端到服务器端等一系列运作流程。
协议:计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。
TCP/IP 协议族分层:
TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
把 TCP/IP 层次化是有好处的。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。
层次化之后,设计也变得相对简单了。每一层可以只考虑分派给自己的任务,而不需要弄清下一层完成任务的具体细节。
应用层:
应用层决定了向用户提供应用服务时通信的活动。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)和HTTP 协议。
传输层:
传输层提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。
网络层:
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
链路层(又名数据链路层,网络接口层):
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。
IP协议
Internet Protocol 网际协议
IP 协议的作用是把各种数据包传送给对方。其中两个重要的条件是 IP 地址和 MAC地址(Media Access Control Address)。
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址。IP 地址可变换,但 MAC地址基本上不会更改。
ARP (Address Resolution Protocol)是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
ARP用途:通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的 MAC地址来搜索下一个中转目标。like 快递。
TCP协议
Transmission Control Protocol 传输控制协议
提供可靠的字节流服务。
字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。
可靠的传输服务是指,能够把数据准确可靠地传给对方。
一言以蔽之,
TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
为了准确无误地将数据送达目标处 ,TCP 协议采用了三次握手(three-way handshaking)策略。
握手过程中使用了 TCP 的标志(flag) ------ SYN(synchronize,同步) 和ACK(acknowledgement,回执)。
发送端首先发送一个带 SYN 标志的数据包给对方 。接收端收到后,回传一个带有 SYN/ACK 标志的数据包 以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表"握手"结束。
DNS协议
Domain Name System 域名系统
是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。
计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。
DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
URI和URL
URL(Uniform Resource Locator,统一资源定位符)指定文档所在地址。
URL正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。
URI (Uniform Resource Identifier)用字符串标识某一互联网资源,而 URL表示资源的地点(互联网上所处的位置)。可见 URL是 URI 的子集。
URI举例:
第二章
http用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP是无状态协议
HTTP 协议自身不对请求和响应之间的通信状态进行保存。
有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
HTTP/1.1 中可使用的方法
GET:获取资源
将数据附加在 URL 之后,以查询字符串(Query String)的形式。数据以键值对的方式表示,并用 &
连接。查询字符串以 ?
开头。
POST:传输实体主体,用于向服务器提交数据
将数据放在 HTTP 请求的主体部分(body),而不是 URL 中。这使得 POST 可以传输较多数据,并且适合传递敏感信息。
PUT:传输文件
HEAD:获得报文首部
DELETE:删除文件
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
HTTP keep-alive
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
管线化(pipelining):不用等待响应亦可直接发送下一个请求。同时并行发送多个请求,而不需要一个接一个地等待响应。
Cookie
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
第四章
状态码告知从服务器端返回的请求结果,状态码如 200 OK,以 3 位数字和原因短语组成。
第五章
物理层面只有一台服务器,使用虚拟主机的功能,则可以假想已具有多台服务器。
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。
代理
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。
持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。
转发时,需要附加Via 首部字段以标记出经过的主机信息。
为什么使用代理服务器?
利用缓存技术(稍后讲解)减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。
当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。
网关
利用网关可以由 HTTP 请求转化为其他协议通信。工作机制和代理十分相似。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
网关可以连接数据库,使用SQL语句查询数据。
隧道
隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
可以和远距离 的服务器安全通信。
隧道不会去解析 HTTP 请求,在通信双方断开连接时结束。
缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本 。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。
第六章
HTTP 首部
HTTP 请求报文
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。
HTTP 响应报文
在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段 3 部分构成。
HTTP 首部字段
通用 首部字段(General Header Fields)
请求报文和响应报文两方都会使用的首部。
请求 首部字段(Request Header Fields)
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应 首部字段(Response Header Fields)
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体 首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。
Keep-Alive是逐跳首部。
HTTP/1.1 通用首部字段
Cache-Control:控制缓存的行为
Connection:控制不再转发给代理的首部字段,管理持久连接。
HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection 首部字段的值为 Close。
Date:表明创建 HTTP 报文的日期和时间。
Trailer:说明在报文主体后记录了哪些首部字段,应用在 HTTP/1.1 版本分块传输编码时。
Transfer-Encoding:传输报文主体时采用的编码方式。
Upgrade:用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。
Warning:告知用户一些与缓存相关的问题的警告。
请求首部字段
Accept:用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。q( quality factor)是权重。
Authorization:用户代理的认证信息。
From:告知服务器使用用户代理的用户的电子邮件地址。
Host :虚拟主机运行在同一个 IP 上,因此使用首部字段 Host 加以区分。
If-Match:形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-None-Match :在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求。与 If-Match 首部字段的作用相反。
Referer:告知服务器请求的原始资源的 URI。
User-Agent:将创建请求的浏览器和用户代理名称等信息传达给服务器。
响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
Age:首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
ETag:告知客户端实体标识,服务器会为每份资源分配对应的 ETag值。它是一种可将资源以字符串形式做唯一性标识的方式。
强 ETag 值,不论实体发生多么细微的变化都会改变其值。
弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。
Location:使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
Allow:用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。
Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式。
内容编码是指在不丢失实体信息的前提下所进行的压缩。gzip、compress、deflate、identity。
Content-Languag:首部字段 Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。
Expires:将资源失效的日期告知客户端。
Last-Modified:指明资源最终修改的时间。
为 Cookie 服务的首部字段
Cookie 是用户识别及状态管理。
Set-Cookie:当服务器准备开始管理客户端的状态时,会事先告知各种信息。