图解HTTP
一、了解Web及网络基础
1、网络基础TCP/IP
TCP/IP协议族按层次分别为一下4层:应用层、传输层、网络层和数据链路层
应用层:HTTP
传输层:TCP、UDP
网络层:IP
数据链路层:网络
2、与HTTP关系密切的协议:IP、TCP和DNS
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会改变。
当不在同一局域网时,在进行中转时会利用下一站中转设备的MAC地址来搜索下一中转目标,会采用ARP协议
ARP:是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。
用TCP协议把数据包送出去后,TCP不会对传达后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志——SYN和ACK。
发送端首先发送一个带有SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
3、负责域名解析的DNS服务
DNS服务是和HTTP协议一样位于应用层的协议。他提供域名到IP地址之间的解析服务。
用户通常使用主机名和域名来访问对方的计算机,而不是直接通过IP地址来访问。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
4、各种协议与HTTP的关系
二、简单的HTTP协议
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
响应报文基本上是由协议版本、状态码、用以解释状态码的原因短语、可选的响应式头部字段以及实体主体构成
1、HTTP是不保存状态的协议
HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。
HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
2、请求URI定位资源
HTTP协议使用URI定位互联网上的资源。,在互联网上的任意位置的资源都能访问到。
当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。指定请求URI的方式有很多。
URI为完整的请求URI
GET http://hackr.jp/index.html HTTP/1.1
在首部字段Host中写明网络域名或IP地址
GET index.html HTTP/1.1
Host:hackr.jp
除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用*来代替URI。
OPTIONS * HTTP/1.1
3、告知服务器意图的HTTP方法
GET:获取资源
请求 | GET /index.html HTTP/1/1 Host:www.hackr.jp |
---|---|
响应 | 返回index.html的页面资源 |
请求 | GET /index.html HTTP/1/1 Host:www.hackr.jp if-Modified-Since:Thu, 12 Jul 2012 07:30:00 GMT |
---|---|
响应 | 仅返回2012年7月12日7点30分以后更新过的index.html页面资源。 如果未有页面更新,则以状态码304 Not Modified作为响应返回。 |
POST:传输实体的主体
虽然GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。
请求 | POST /submit.cgi HTTP/1/1 Host:www.hackr.jp Content-Length: 1560(1560字节的数据) |
---|---|
响应 | 返回submit,cgi接收数据的处理结果 |
PUT:传输文件
PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
请求 | PUT /example.html HTTP/1.1 Host:www.hackr.jp Content-Type:text/html Content-Length:1560 |
---|---|
响应 | 响应返回状态码204 No Content(该html已存在于服务器上) |
HEAD:获得报文首部
HEAD方法和GET方法一样,只是不反悔报文主体部分。用于确认URI的有效性及资源更新的日期时间等。
请求 | HEAD /index.html HTTP/1.1 Host:www.hackr.jp |
---|---|
响应 | 返回index.html有关的响应首部 |
DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。
请求 | DELETE /example.html HTTP/1.1 Host:www.hackr.jp |
---|---|
响应 | 响应返回状态码204 No Content |
OPTIONS:询问支持的方法
OPTION方法用来查询针对请求URI指定的资源支持的方法
请求 | OPTION * HTTP/1.1 Host:www.hackr.jp |
---|---|
响应 | HTTP/1.1 200 OK Allow:GET、POST、HEAD、OPTIONS |
TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信返回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。
请求 | TRACE / HTTP/1.1 Host:hackr.jp Max-Forwards:2 |
---|---|
响应 | HTTP/1.1 200 OK Content-Type:message/http Content-Length:1024 TRACE / HTTP/1.1 Host:hackr.jp Max-Forwards:2 |
CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
请求 | CONNECT proxy.hackr.jp:8080 HTTP/1.1 Host:proxy.hackr.jp |
---|---|
响应 | HTTP/1.1 200 OK |
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
4、持久连接节省通信
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,文档中包含大量图片的情况多了起来。
比如,使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
4.1 持久连接
为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面地显示速度也就相应提高了。
在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1.0内并未标准化。虽然有一部分服务器通过非标准化的手段实现了持久连接,但服务器端不一定能够支持持久连接。毫无疑问,除了服务器端,客户端也需要支持持久连接。
4.2 管线化
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
比如,当请求一个包含10张图片的HTML Web页面,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还要快。请求数越多,时间差就越明显。
使用Cookie的状态管理
HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
假设要求登录认证的Web页面本身无法进行状态的管理,那么每次跳转新页面就要再次登录,或者要在每次请求报文中附加参数来管理登录状态。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术,Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
没有Cookie信息状态下的请求
- 发出请求
- 在响应中添加Cookie后返回
第2次以后(存有Cookie信息状态)的请求
请求中添加Cookie后发送
检查Cookie
三、HTTP报文内的HTTP信息
1、HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。
2、请求报文及响应报文的结构
请求报文
请求行
GET/ HTTP/1.1
各首部字段
Host:hackr.jp
User-Agent:Mozilla/5.0 (window NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:ja,en-us;q=0.7,en;q=0.3
Accept-Encoding:gzip,deflate
DNT:1
Connection:keep-alive
Pragma:no-cache
Cache-Control:no-cache
空行(CR+LF)
响应报文
状态行
200 OK
各种首部字段
Date:fri, 27 Oct 2024 13:14:00 GMT
Server:Apache
Last-Modified:Fri, 31 Aug 2007 02:02:20 GMT
ETag:"45beal-16a-46d776ac"
Accept-Ranges:bytes
Content-Length:362
Connection:close
Content-Type:text/html
空行(CR+LF)报文主体
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hackr.jp</title>
</head>
<body>
<img src="hackr.gif" alt="hackr.jp" width="240" height="84" />
</body>
</html>
请求行
包含用于请求的方法,请求URI和HTTP版本
状态行
包含表明响应结果的状态码,原因短语和HTTP版本
首部字段
包含表示请求和响应的各种各样条件和属性的各类首部
一般有4种首部,分别是:通用首部,请求首部,响应首部和实体首部
3、编码提升传输速率
3.1 报文主体和实体主体的差异
报文
是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输
实体
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成
HTTP报文的主体用于传输请求或响应的实体主体。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
3.2 压缩传输的内容编码
向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用ZIP压缩文件之后再添加附件发送。HTTP协议中有一种被称为内容编码的功能也能进行类似的操作。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责编码。
常用的内容编码有以下几种。
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
3.3 分割发送的分块传输编码
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码。
3.4 发送多种数据的多部分对象集合
发送邮件时,我们可以在邮件里写入文字并添加多份附件。因为采用了MIME机制,允许邮件处理文本、图片、视频等多个不同类型的数据。而在MIME扩展中会使用一种称为多部分对象集合的方法,来容纳多份不同类型的数据。
相应的,HTTP协议中页采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下:
multipart/form-data
在Web表单文件上传时使用
mulitipart/byteranges
状态码206响应报文包含了多个范围的内容时使用
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
使用boundary字符串来划分多部分对象集合指明的各类实体。
3.5 获取部分内容的范围请求
以前用户不能使用现在这种高速的宽带访问互联网,当时,下载一个尺寸稍大的图片或文件就已经很吃力了。如果下载过程中遇到网络中断的情况,那就必须重头开始。为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。
要实现该功能需要指定下载的实体范围。指定范围发送的请求叫做范围请求。执行范围请求时,会用到首部字段Range来指定资源的byte范围。
3.6 内容协商返回最合适的内容
同一个Web网站有可能存在着多份相同内容的页面。比如英语版和中文版的Web页面,他们内容上虽然相同,但使用的语言却不同。
当浏览器的默认语言为英语或中文,访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商。
内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以语言、字符集、编码方式等为基准判断响应的资源
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下3种类型。
服务器驱动协商
客户端驱动协商
透明协商:是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。
4、返回结果的HTTP状态码
4.1 状态码告知从服务器端返回的请求结果
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
4.2 2XX 成功
2XX的响应结果表明请求被正常处理了
4.2.1 200OK
表示从客户端发来的请求在服务器端被正常处理了。
4.2.2 204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
4.2.3 206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
4.3 3XX 重定向
3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理
4.3.1 301 Moved Parmanently
永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。
4.3.2 302 Found
临时重定向。该状态码表示请求的资源已被分配了新的URI,希望用户能使用新的URI访问。
4.3.3 303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
4.3.4 304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发送请求未满足条件的情况后,直接返回304,返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。
4.3.5 307 Temporary Redirect
临时重定向。该状态码与302有着相同的含义,尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。
4.4 4XX 客户端错误
4XX的响应结果表明客户端是发生错误的原因所在
4.4.1 400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像200OK一样对待该状态码。
4.4.2 401 Unauthorized
该状态码表示发送的请求需要通过HTTP认证的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于被请求资源的www-authenticate首部用以质询用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
4.4.3 403 Forbidden
该状态码表明对请求的访问被服务器拒绝。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
4.4.4 404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX 服务器错误
4.5.1 500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时故障
4.5.2 503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。