Web基础知识 gaunthan Posted on Jan 25 2017 ? HTTP ? ? Application Layer ? ? Computer Networking ? ## 使用HTTP协议访问Web **Web**(World wide web,万维网)使用一种名为*HTTP*的协议作为规范,完成从客户端到服务器等一系列运作流程。可以说,Web是建立在HTTP协议上通信的。 三项万维网构建技术: - 把**SGML**(Standard Generalized Markup Language,标准通用标记语言)作为页面的文本标记语言的**HTML**(HyperText Markup Language,超文本标记语言); - 作为文档传递协议的**HTTP**; - 指定文档所在地址的**URL**(Uniform Resource Locator,统一资源定位符)。 ## 与HTTP关系密切的协议 ### 负责传输的 IP 协议 按层次分,**IP**(Internet Protocal,网际协议)位于网络层。它的作用是把各种数据包传送给对方。而要保证确实传送到目的地,需要满足各类条件,其中最重要的条件是**IP地址**和**MAC地址**(Media Access Control Address)。 IP地址指明了网络结点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。结点的IP地址可变动,但MAC地址基本上不会更改。 IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是通过多态计算和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用**ARP协议**(Address Resolution Protocal)。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。 ### 确保可靠性的 TCP 协议 按层次分,**TCP**(Transmission Control Protocol,传输控制协议)位于传输层,提供可靠的字节流服务。 所谓的**字节流服务**(Byte Stream Service)是指,为了方便传输,将大块数据分割成以**报文段**(segment)为单位的数据包进行管理,以此向用户提供无障碍的顺序字节传输服务。而可靠的传输服务是指,能够把数据准确可靠地传给对方。 为了准确无误地将数据送达目标处,TCP协议采用了**三次握手**(three-way handshaking)策略。用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的**标志**(flag):**SYN**(synchronize)和 **ACK**(acknowledgement)。 握手过程简述如下: 1. 发送端首先发送一个带SYN标志的数据包给对方。 2. 接收端收到后,回传一个带有SYN+ACK标志的数据包以示传达确认信息。 3. 最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。 若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。 ### 负责域名解析的 DNS 服务 **DNS**(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。 计算机既可以被赋予IP地址,也可以被赋予主机名和域名。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。 ## 改进Web的技术 ### 持久连接 HTTP/1.1和一部分的HTTP/1.0想出了**持久连接**(HTTP Persistent Connections,HTTP keep-alive或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,就保持TCP连接状态。 持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。 ### 流水化 持久连接使得多数请求以管线化方法发送成为可能。**流水化**(pipelining)技术使得客户方可以连续发送多个请求,而不需要一个接一个地等待响应后再发送请求。 ### 使用Cookie的状态管理 Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。 Cookie会根据从服务器端发送的响应报文内的一个叫做`Set-Cookie`的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。 服务器端发现客户端发送过老的Cookie后,会去检查究竟是从哪个客户端发来的连接请求,然后比对服务器上的记录,最后得到之前的状态信息。 ### Web缓存 **Web缓存器**(Web cache)也叫**代理服务器**(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。代理服务器有自己的硬盘存储空间,并在存储空间保存用户最近请求过的对象的副本。 可以配置用户的所有HTTP请求首先指向代理服务器。一旦某浏览器被配置,每个对某对象的浏览器请求都首先被定向到该代理服务器。具体过程为: 1. 浏览器建立一个到代理服务器的TCP的连接,并向其发送一个HTTP请求,请求获取特定对象; 2. 代理服务器进行检查,查看请求的对象是否已经存储在本地。如果有,则使用HTTP响应向客户浏览器返回该对象; 3. 如果代理服务器没有存储该对象,它就打开一个与该对象的初始服务器的TCP连接,然后发送一个对该对象的HTTP请求。在收到请求后,初始服务器向该代理发送具有该对象的HTTP响应; 4. 当代理接收到该对象时,它在本地存储空间存储一份副本(缓存),并用HTTP响应向客户浏览器发送该对象(通过先前与浏览器建立的TCP连接)。 从上面过程可以看出,代理既是服务器又是客户。代理服务器通常由ISP购买并安装。 在因特网上部署代理服务器有两个原因: - 可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远远低于客户与代理服务器之间的瓶颈带宽时。 - 从整体上大大降低因特网上的Web流量,从而改善了所有应用的性能。 ### 条件GET方法 尽管高速缓存能减少用户感受到的响应时间,但同时也带来了一个问题:存储在代理服务器中的对象副本可能是陈旧的。 幸好,HTTP有一种机制,允许代理服务器证实它的对象是最新的。这种机制就是**条件GET**(conditional GET)方法: 1. 使用GET请求报文; 2. 请求报文中包含一个`If-Modified-Since:`首部行。 代理服务器通过向初始服务器发送条件GET获悉对象副本是否过期。该报文告诉初始服务器,仅当自指定日期之后该对象被修改过,才发送该对象。因此如果对象没有被修改过,则初始服务器返回的响应报文没有包含该对象。另外,该响应报文的状态行为`304 Not Modified`。 ### 编码提升传输速率 HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。 #### 压缩传输的内容编码 内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。 #### 分割发送数据的分块传输编码 在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为**分块传输编码**(Chunked Transfer Coding)。 分块传输编码会将实体主体分成多个块,每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用`0(CR+LF)`来标记。 使用分块传输编码的实体主体会由接收的客户端负责解码,并恢复到编码前的实体主体。 HTTP/1.1中存在一种称为**传输编码**(Transfer Coding)的机制,可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。 ### 发送多种数据的多部分对象集合 **MIME**(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,允许邮件处理文本、图片、视频等多个不同类型的数据。在MIME扩展中会使用一种称为**多部分对象集合**(Multipart)的方法,来容纳多份不同类型的数据。相应地,HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含多类型实体。 多部分对象集合包含的对象如下: - multipart/form-data。在Web表单文件上传时使用。 - multipart/byteranges。状态码 206(Partial Contend,部分内容)响应报文包含了多个范围的内容时使用。 在HTTP报文中使用多部分对象集合时,需要在首部字段里面加上`Content-type`。 MIME使用`boundary`字符串来划分多部分对象集合指明的各类实体。在`boundary`字符串指定的各个实体的起始行之前插入"--"标记(例如:--AaB03x、--THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入"--"标记(例如:--AaB03x--、--THIS_STRING_SEPARATES--)作为结束。 多部分对象集合的每个部分类型中,都可以含有首部字段。 ### 获取部分内容的范围请求 指定内容范围的发送请求叫做**范围请求**(Range Request)。执行范围请求时,会用到首部字段`Range`来指定资源的byte范围。byte范围的指定形式如下: - 5001 ~ 10 000 字节 ```html Range: bytes=5001-10000 ``` - 从5001字节之后全部的 ```html Range: bytes=5001- ``` - 从一开始到3000字节和5000 ~ 7000字节的多重范围 ```html Range: bytes=-3000, 5000-7000 ``` 针对范围请求,响应会返回状态码为`206 Partial Content`的响应报文。另外,对于多重范围的范围请求,响应会在首部字段`Content-Type`表明multipart/bytesranges后返回响应报文。如果服务器端无法响应范围请求,则会返回状态码`200 OK`和完整的实体内容。 ### 内容协商 - 返回最合适的内容 当浏览器的默认语言为英语或中文,访问相同URI的Web页面则会显示对应的英语版或中文版的Web页面。这样的机制称为**内容协商**(Content Negotiation)。 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。 包含在请求报文中的某些首部字段就是判断的基准。如下: - Accept - Accept-Charset - Accept-Encoding - Accept-Language - Content-language 内容协商技术有以下3种类型 |内容协商技术|说明| |--| |服务器驱动协商(Server-driven Negotiation)|由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。| |客户端驱动协商(Agent-driven Negotiation)|由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用javaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器类型,自行切换成PC版页面或手机版页面。| |透明协商(Transparent Negotiation)|是服务器驱动和客户端驱动结合体,是由服务器端和客户端各自进行内容协商的一种方法。| ## References - 上野 · 宣 著, 于均良. 图解 HTTP[M]. 人民邮电出版社, 2014. 赏 Wechat Pay Alipay HTTP Status Code URI and URL