HTTP的报文段
1. HTTP特性
1.1 HTTP的定义
HTTP 协议,用于客户端和服务器端之间的通信,请求从客户端发出,最后服务器端响应该请求并返回。
HTTP=请求+响应。
请求 = 请求方法 + 请求的资源对象URI + HTTP版本号 + 请求首部 + 内容实体。
响应 = HTTP版本号 + 结果响应代码和原因 + 响应首部 + 资源实体。
1.2 HTTP的持久化(keep-alive)
HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接,如果请求的资源很多,势必会增大通信开销。后来,有人提出了持久化连接。它的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态,从而大大减轻了服务器端的负载。
1.3 HTTP的管线化(pipelining)
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。多个请求可以并发发送,不需要等待响应了。
1.4 HTTP的状态管理(Cookie)
使用 HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。为了方便管理HTTP的状态,引入了Cookie技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
第一次请求之后: 服务器端生成一个只属于该客户端的Cookie,把它和一个”Set-Cookie“的首部字段信息放入响应报文内并发给客户端,通知客户端保存 Cookie。
第二次发送请求时: 服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
2. HTTP报文
2.1 报文的定义
全称:hypertext transfer protocol(超文本传输协议),是 TCP/IP 协议族的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
通俗的讲,当客户端或者浏览器连接上服务器之后,若想获得 web 服务器中的 web 资源,就必须与 服务端进行通信,通信的双方必须能够解析发送的消息,那么这个消息就要符合一定的通讯格式,HTTP 就是用于定义双方的通信格式。
2.2 报文的结构
HTTP报文由四部分组成,由上到下依次为 起始行、头部字段、空白行和消息正文(实体)。其中,请求行和头部字段又一起被称为“请求头”或者“响应头”。请求头和响应头与 “body” 中间有一个空行(CRLF)作为区分两者的边界,记住是第一个空行(CRLF),如果有多个空行,那么其他的空行则被归为“body”。所以一个完整的报文如下图所示
下面我们具体来看一下请求报文和响应报文的结构。先来看一下请求报文的,其结构如下所示:
(1)请求行:包括请求方法、请求目标和协议版本
请求方法:
GET:获取资源。用来请求访问已被 URI 识别的资源,指定的资源经服务器端解析后返回响应内容。
POST:传输实体主体。
PUT:传输文件,但是自身不带验证机制。
DELETE:删除文件,但是自身不带验证机制。
HEAD:获得报文首部。用于确认URI 的有效性及资源更新的日期时间等。
OPTIONS:询问支持的方法。
TRACE:追踪路径,让 Web 服务器端将之前的请求通信环回给客户端的方
法。发送请求时,客户端在 Max-Forwards 首部字段中填入数值,每经过一个服
务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,服务器发出响应。
CONNECT:用隧道协议连接代理服务器,可以加密通信内容。
请求目标
URL(Uniform Resource Locator,统一资源定位),通过描述资源的位置来标识资源。
注意:URI (Uniform Resource Indentifier,统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成。URN(Uniform Resource Name,统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。
协议版本
格式为HTTP/主版本号.次版本号,常用为:HTTP/1.1 HTTP/1.0
(2)请求头部
头部字段是由字段名和字段值构成的,中间用冒号“:” 分隔,可以有多个值。
Host:接受请求的服务器地址,可以是IP或者是域名
User-Agent:发送请求的应用名称
Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)
Accept-Charset:通知服务器端可以发送的编码格式
Accept-Encoding:通知服务器端可以发送的数据压缩格式
Accept-Language:通知服务器端可以发送的语言
(3)空白行
(4)请求体
接下来我们再来看一下响应报文的结构,如下所示:
(1)状态行
协议版本:同请求报文
状态码:100-199表示请求已收到继续处理,200-299表示成功,300-399表示资源重定向,400-499表示客户端请求出错,500-599表示服务器端出错。常见的有以下几个:
200:响应成功
301:资源(网页等)被永久转移到其它URL
302:资源临时移动
400:客户端有语法错误
403:forbidden,服务器理解请求客户端的请求,但是拒绝执行此请求。请求资源被拒绝,通常原因是服务器上某些文件或目录设置了权限,客户端权限不够
404:not found,用户输入错误的链接,该链接指向的网页不存在(资源请求不存在)。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
500:internal server error 服务器内部错误(比如浏览器代理除了问题,ip,端口不对等)该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
502:Bad Gateway,作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503:服务器超载或停机维护
504:Gateway Timeout网关超时 服务器作为网关或代理,未及时从上游服务器接收请求。
状态码描述:作为状态行的补充说明
(2)响应头部字段
Server:服务器应用软件的名称和版本
Content-Type:响应正文的类型
Content-Length:响应正文的长度
Content-Charset:响应正文所使用的编码
Content-Encoding:响应正文使用的数据压缩格式
Content-Language:响应正文使用的语言
(3)空白行
(4)响应体