什么是HTTP协议
HTTP(HyperText Transfer Protocol, 超文本传输协议)。Web使用该协议作为规范,完成客户端到服务器端一系列运作流程。Web是建立在HTTP协议上通信的。
当我们在网页浏览器输入URL时,WEB是如何呈现的?
Web浏览器从Web服务器获取文件资源等信息,从而显示在Web页面。
这种通过发送请求获取服务器资源的Web浏览器等,都可称为客户端。
HTTP协议的演变
- HTTP 1.0
HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用。相对于HTTP 0.9 增加了如下主要特性:
- 请求与响应支持头域
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
- 支持长连接(但默认还是使用短连接),缓存机制,以及身份认证
- HTTP 1.1
HTTP协议的第三个版本是HTTP 1.1,是目前使用最广泛的协议版本 。HTTP 1.1是目前主流的HTTP协议版本,因此这里就多花一些笔墨介绍一下HTTP 1.1的特性。
HTTP 1.1引入了许多关键性能优化:keepalive连接,chunked编码传输,字节范围请求,请求流水线等
Persistent Connection(keepalive连接)
允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,一遍未来的HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。
在HTTP1.0中使用长连接需要添加请求头 Connection: Keep-Alive,而在HTTP 1.1 所有的连接默认都是长连接,除非特殊声明不支持( HTTP请求报文首部加上Connection: close )
参考:https://www.cnblogs.com/andashu/p/6441271.html
HTTP协议格式
HTTP协议是用于客户端与服务器端之间的通信。与TCP/IP一样协议族内的其他协议一样。
请求访问文本或图像资源的一段是客户端,提供资源响应的一端是服务器端。HTTP协议能够明确区分客户端和服务器端。
- HTTP请求
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
- 首行:请求方法 + URI + 协议版本。
- Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body:空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;
- HTTP响应
响应报文是由响应版本、状态码、解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中。
- HTTP 常见header
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
HTTP请求方法
- GET:获取资源
GET方法用来请求那些已经被URI识别的资源,指定的资源经服务器端解析之后返回响应内容。
也就是说,如果请求的资源是本文,保持原样返回,如果是像 CGI(Common Gateway Interface, 通用网关接
口) 那样的程序, 则返回经过执行后的输出结果。
- POST:传输实体主体
POST 方法用来传输实体的主体。
- PUT:传输文件
PUT 方法用来传输文件。 就像 FTP 协议的文件上传一样, 要求在请求报文的主体中包含文件内容, 然后保存到请求 URI 指定的位置。
- HEAD:获得报文首部
HEAD 方法和 GET 方法一样, 只是不返回报文主体部分。 用于确认URI 的有效性及资源更新的日期时间等。
- DELETE:删除文件
DELETE 方法用来删除文件, 是与 PUT 相反的方法。 DELETE 方法按请求 URI 删除指定的资源。
- OPTIONS:询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
- TRACE:追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/ 篡改的。 这是因为, 请求想要连接到源目标服务器可能会通过代理中转, TRACE 方法就是用来确认连接过程中发生的一系列操作。
- CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道, 实现用隧道协议进行 TCP 通信。 主要使用 SSL(Secure Sockets Layer, 安全套接层) 和 TLS(Transport Layer Security, 传输层安全) 协议把通信内容加密后经网络隧道传输。
HTTP状态码
状态码的职责是当客户端向服务器端发送请求时, 描述返回的请求结果。 借助状态码, 用户可以知道服务器端是正常处理了请求, 还是出现了错误。
响应类别有以下5种。
2XX 请求成功
- 200 OK
表示从客户端发来的请求在服务器端被正常处理了。
在响应报文内, 随状态码一起返回的信息会因方法的不同而发生改变。 比如, 使用 GET 方法时, 对应请求资源的实体会作为响应返回; 而使用 HEAD 方法时, 对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部, 不会返回实体的主体部分) 。
- 204 No Content
表示请求已成功处理,但是在响应报文中不包含实体的主体部分。
一般在只需要从客户端往服务器发送信息, 而对客户端不需要发送新信息内容的情况下使用。
- 206 Partial Content
该状态码表示客户端进行了范围请求, 而服务器成功执行了这部分的GET 请求。 响应报文中包含由 Content-Range 指定范围的实体内容。
3XX 重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
- 301 Moved Permanently
永久性重定向。 该状态码表示请求的资源已被分配了新的 URI, 以后应使用资源现在所指的 URI。 也就是说, 如果已经把资源对应的 URI保存为书签了, 这时应该按Location 首部字段提示的 URI 重新保存。
- 302 Found
临时性重定向。 该状态码表示请求的资源已被分配了新的 URI, 希望用户(本次) 能使用新的 URI 访问。
- 303 See Other
该状态码表示由于请求对应的资源存在着另一个 URI, 应使用 GET方法定向获取请求的资源。
- 304 Not Modified
该状态码表示客户端发送附带条件的请求时, 服务器端允许请求访问资源, 但未满足条件的情况。 304 状态码返回时, 不包含任何响应的主体部分。 304 虽然被划分在 3XX 类别中, 但是和重定向没有关系。
4XX 客户端错误
- 400 Bad Request
该状态码表示请求报文中存在语法错误。 当错误发生时, 需修改请求的内容后再次发送请求。 另外, 浏览器会像 200 OK 一样对待该状态码。
- 401 Unauthorrized
该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证) 的认证信息。 另外若之前已进行过 1 次请求, 则表示用 户认证失败。
返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate 首部用以质询(challenge) 用户信息。 当浏览器初次接收到 401 响应, 会弹出认证用的对话窗口。
- 403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。 服务器端没有必要给出拒绝的详细理由, 但如果想作说明的话, 可以在实体的主体部分对原因进行描述, 这样就能让用户看到了。
未获得文件系统的访问授权, 访问权限出现某些问题(从未授权的发送源 IP 地址试图访问) 等列举的情况都可能是发生 403 的原因。
- 404 Not Found
该状态码表明服务器上无法找到请求的资源。 除此之外, 也可以在服务器端拒绝请求且不想说明理由时使用。
5XX 服务器错误
- 500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。 也有可能是 Web应用存在的 bug 或某些临时的故障。
- 503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护, 现在无法处理请求。 如果事先得知解除以上状况需要的时间, 最好写入RetryAfter 首部字段再返回给客户端。