一、简介
超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。该协议虽然通常基于 TCP/IP 层,但可以在任何可靠的传输层上使用;也就是说,不像 UDP,它是一个不会静默丢失消息的协议。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。
无状态协议是一种通信协议,在该协议中,接收方(通常是服务器)不保留任何会话信息。
二、总结
HTTP 是简单的,是可扩展的
HTTP本质是无状态的,使用Cookies可以创建有状态的会话。
HTTP依赖于面向连接的TCP进行消息传递,但连接并不是必须的。
HTTP/1.1以及更早的HTTP协议报文都是语义可读的。在HTTP/2中,这些报文被嵌入到了一个新的二进制结构,帧。
三、HTTP报文
1、请求
1)method
方法 | 语法 |
---|---|
GET 方法请求指定的资。 |
GET /index.html |
POST 方法 发送数据给服务器。 |
POST /index.html |
OPTIONS 方法 用于获取目的资源所支持的通信选项。 |
OPTIONS /index.html HTTP/1.1 OPTIONS * HTTP/1.1 |
HEAD 方法 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致 |
HEAD /index.html |
HEAD
方法该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.
2)Path
要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port(HTTP一般在80端口)。
3)Version of the protocol
HTTP协议版本号。
4)Headers
对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。
2、响应
1)Version of the protocol
HTTP协议版本号。
2)Status code
一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。
3)Status message
一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
4)Headers
HTTP headers,与请求头部类似。
HTTP 消息头允许客户端和服务器通过 request和 response传递附加信息。一个请求头由名称(不区分大小写)后跟一个冒号“:”,冒号后跟具体的值(不带换行符)组成。该值前面的引导空白会被忽略。
-
General headers: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
- 最常见的通用首部包括:
Date
、Cache-Control
或Connection
。
- 最常见的通用首部包括:
-
Request headers: 包含更多有关要获取的资源或客户端本身信息的消息头。
Accept
、Accept-*
、If-*
允许执行条件请求。Cookie
,User-Agent
和Referer
描述了请求本身以确保服务端能返回正确的响应。- 并非所有出现在请求中的 HTTP 首部都属于请求头,如
Content-Length
。
-
Response headers: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
Age
,Location
和Server
都属于响应头,他们被用于描述响应。- 并非所有出现在响应中的http header都属于响应头,如
Content-Length
。
-
Entity headers: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。
Content-Length
,Content-Language
,Content-Encoding
之类的报头都是实体报头。
4)资源body
可选项,比起请求报文,响应报文中更常见地包含获取的资源body。