HTTP
协议,即超文本传输协议( Hypertext transfer protocol
)。是一种详细规定了浏览器和万维网( WWW = World Wide Web
)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
特点
HTTP
协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用 HTTP
协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
-
支持客户端/服务器模式。支持基本的认证和安全认证。
-
快速简单:客户向服务器请求服务时候,只需要传送请求方法和路径。请求的方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 -
灵活:
HTTP
允许传输任意类型的数据对象。正在传输的类型由Content-Type
加以标记。 -
HTTP 0.9
和1.0
使用非持续连接(无连接):限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1
使用持续连接:不必为每个web
对象创建一个新的连接,一个连接可以传送多个对象。 -
无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
无状态协议
协议的状态指的是下一次传输可以记住这次传输信息的能力。
http
是不会为了下一次的连接而维护这次连接所传输的信息,为了保证服务器的内存。
比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
由于Web
服务器要面对很多浏览器的并发访问,为了提高Web
服务器对并发访问的处理能力,在设计HTTP
协议时规定Web
服务器发送HTTP
应答报文和文档时,不保存发出请求的Web
浏览器进程的任何状态信息。
这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由于Web
服务器不保存发送请求的Web
浏览器进程的任何信息,因此HTTP
协议属于无状态协议(Stateless Protocol
)。
从
HTTP/1.1
起,默认都开启了Keep-Alive
,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP
数据的TCP
连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive
不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache
)中设定这个时间。
http 的工作流程
-
首先客户机与服务器需要建立连接。只要输入某个超级链接,
http
的工作开始。浏览器拿到网址之后首先会将主机名解析出来,如http://www.example.com/hello.html
则会将主机名www.example.com
解析出来。根据主机名,会首先查找IP
,首先查询hosts
文件,成功则返回其对应ip
地址,如果没有查询到,则去查询DNS
服务器,成功就会返回ip
,否则会报告连接错误。 -
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(
URL
)、协议版本号,后边是MIME
信息包括请求修饰符、客户机信息和可能的内容。 -
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是
MIME
信息包括服务器信息、实体信息和可能的内容。 -
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
请求信息
- 请求首部:
- 请求行:包含请求的方法,请求的
URL
和请求的HTTP
版本; - 请求首部字段:从客户端向服务器端发送请求报文是使用的首部。补充说明了请求的附加内容、客户端信息、响应内容优先级等信息;
- 通用首部字段:请求报文和响应报文都会用到的首部;
- 实体首部字段:针对请求报文和响应报文实体部分使用的字段。补充说明了资源内容、更新时间等与实体有关的信息;
- 其他:如
set-cookies
等非HTTP
协议的请求头。
- 请求行:包含请求的方法,请求的
- 空行:
CR+LF
由它来划分; - 报文主体:应该被发送的数据(并不一定要有报文主体)。
// 请求行:
GET http://www.baidu.com/ HTTP/1.1
// 请求头:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:www.baidu.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36
响应信息
- 报文首部:
- 状态行:包含
HTTP
版本号,响应结果状态码和原因语句; - 响应首部字段:从服务器向客户端返回响应豹纹是使用的首部。补充说明了响应的附加内容,也会要求客户端附加额外的内容信息 ;
- 通用首部字段:请求报文和响应报文都会用到的首部;
- 实体首部字段:针对请求报文和响应报文实体部分使用的字段。补充说明了资源内容、更新时间等与实体有关的信息;
- 其他:如
set-cookies
等非HTTP
协议的请求头。
- 状态行:包含
- 空行:
CR+LF
由它来划分; - 报文主体:应该被发送的数据(并不一定要有报文主体)。
// 响应行:
Http/1.1 200 ok
// 响应头:
BDPAGETYPE:1
BDQID:0xbabd68fc00007703
BDUSERID:0
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Cxy_all:baidu+be175779b859a62a7a28a9afd86882b0
Date:Sat, 19 Nov 2016 06:35:48 GMT
Expires:Sat, 19 Nov 2016 06:35:38 GMT
Server:bfe/1.0.8.18
Set-Cookie:BDSVRTM=15; path=/
Set-Cookie:BD_HOME=0; path=/
请求方法
-
OPTIONS
:返回服务器针对特定资源所支持的HTTP
请求方法。也可以利用向Web
服务器发送'*'
的请求来测试服务器的功能性。 -
HEAD
: 向服务器索要与GET
请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。 -
GET
:向特定的资源发出请求。注意:GET
方法不应当被用于产生“副作用”的操作中,例如在web app
中。其中一个原因是GET
可能会被网络蜘蛛等随意访问。 -
POST
: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST
请求可能会导致新的资源的建立和/或已有资源的修改。 -
PUT
:向指定资源位置上传其最新内容。 -
DELETE
:请求服务器删除Request-URI
所标识的资源。 -
TRACE
: 回显服务器收到的请求,主要用于测试或诊断。 -
CONNECT
:HTTP/1.1
协议中预留给能够将连接改为管道方式的代理服务器。 -
PATCH
:用来将局部修改应用于某一资源,添加于规范RFC5789
。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码
405
(Method Not Allowed
);
当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码
501
(Not Implemented
)。
HTTP
服务器至少应该实现GET
和HEAD
方法,其他方法都是可选的。此外,除了上述方法,特定的HTTP
服务器还能够扩展自定义的方法。
常见响应码
-
1xx(信息类):表示接收到请求并且继续处理
100:客户必须继续发出请求;
101:客户要求服务器根据请求转换HTTP
协议版本。 -
2xx(成功):表示动作被成功接收、理解和接受
200:表明该请求被成功地完成,所请求的资源发送回客户端;
201:提示知道新文件的URL
;
202:接受和处理、但处理未完成;
203:返回信息不确定或不完整;
204:请求收到,但返回信息为空;
205:服务器完成了请求,用户代理必须复位当前已经浏览过的文件。 -
3xx(重定向):需要用户代理执行更多的动作
301:Moved Permanently
永久转移(所请求的资源已被指派为新的固定URL);
302:Found
暂时转移(所请求的资源临时位于另外的URL
);
304:文档没有修改(条件GET
);
307:Temporary Redirect
(临时重定向)。 -
4xx(客户差错):请求包含错误语法或不能正确执行
400:Bad Request
请求错误;
401:Unauthorized
未认证(该请求要求用户认证);
403:Forbidden
不明原因的禁止;
404:Not Found
未找到。 -
5xx(服务端错误类):服务器不能正确执行一个正确的请求
500:Internal Server Error
(服务器错误);
501:没有实现;
502:错误的网关(网关或上游服务器来的无效响应);
503:Service Unavailable
(一般是访问人数过多)。
网友评论