个人整理。主要来自《图解HTTP》以及百度百科、csdn博客等。
HTTP基础知识
1 HTTP简介
1.1 什么是HTTP
当用户在网页浏览器(Web browser)的地址栏输入URL时,Web浏览器需要从Web服务器端获取文件资源等信息,从而显示出Web页面。为了完成从客户端到服务器端的通信,Web使用了HTTP(HyperText Transfer Protocol,超文本传输协议)。
1.2 HTTP的特点
HTTP具有以下特点:
- HTTP属于应用层协议,在传输层使用TCP,在网络层使用IP。此外,在通信过程中还会用到DNS(解析域名)与ARP(获取MAC地址)等。
- 使用HTTP时,必定是一端担任客户端,另一端担任服务器端。即便实际情况下可能两端都既是服务器端,也是客户端,但仅就一条通信线路而言,客户端与服务器端是确定的。HTTP能够明确区分哪边是客户端,哪边是服务器端。
- HTTP请求必然是由客户端发出,而服务器端回复响应。服务器端在没有接收到请求之前不会发送响应。
- HTTP一种无状态协议,即HTTP自身不对请求和响应之间的通信状态进行保存。每当有新的请求发送时,就会有对应的新响应产生。
- 如果服务器端需要管理客户端状态,可以使用Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
- HTTP的初始版本中,每进行一次HTTP通信就要连接和断开一次TCP连接。后引入了持久连接(Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse)方法,能实现只要任意一端没有明确提出断开连接,则保持TCP连接状态。
1.3 URI与URL
URI全称为Uniform Resource Identifier,统一资源标识符,作用是标识某一互联网资源。
URL全称为Uniform Resource Locator,统一资源定位符,用于表示资源的地点。
URI与URL的联系是它们都能够唯一地确定一个资源,区别是URL是通过资源的地点来确定资源的,而URI除了通过资源的地点,还能用其他字符串句法格式来确定资源。因此,可以说URL是URI的子集。
绝对URI格式:协议方案名://[登录信息@]服务器地址:端口号/带层次的文件路径[?查询字符串][#片段标识符]
1.4 HTTP请求报文
HTTP请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。其中请求方法、请求URI、协议版本组成请求行。
1.5 HTTP响应报文
HTTP响应报文由协议版本、状态码、原因短语、可选的响应首部字段以及内容实体构成。其中协议版本、状态码、原因短语组成响应行。
2 HTTP/1.1中可用的方法
方法用于将客户端的请求告知服务器端。
2.1 GET:获取资源
GET方法用来请求访问已被URI识别的资源,指定的资源经服务器端解析后返回响应内容。
2.2 POST:传输实体主体
POST方法用来传输实体的主体。
2.3 PUT:传输文件
PUT方法用来传输文件。需要在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
2.4 HEAD:获取报文首部
HEAD方法与GET方法一样,只是不返回报文主体部分。一般用于确认URI的有效性及资源更新的日期时间等。
2.5 DELETE:删除文件
DELETE方法用于按请求URI删除指定的资源。
2.6 OPTIONS:询问支持的方法
OPTIONS用法用来查询针对请求URI指定的资源(也可用*代替,表示任意资源)支持的方法。
2.7 TRACE:追踪路径
TRACE方法用于让Web服务器将之前的请求通信返回给客户端。发送请求时,需要在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减一。当数值归零时停止传输,并由最后接收到请求的服务器端返回状态码200 OK的响应。
2.8 CONNECT:要求用隧道协议连接代理
CONNECT方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
3 HTTP状态码
状态码用于当客户端向服务器端发出请求时,描述请求的处理结果。
3.1 1XX:正在处理
1XX的响应结果表示接收的请求正在处理。
3.2 2XX:成功
2XX的响应结果表明请求被正常处理了。
3.2.1 200 OK
表示从客户端发来的请求被服务器正常处理了,在响应报文内会根据请求类型返回相应的信息,如GET方法返回对应资源实体,HEAD方法返回首部等。
3.2.2 204 No Content
表示服务器成功处理了请求,但返回的报文中不含实体的主体部分。一般在只需要从客户端向服务器发送信息,而不需要向客户端发送信息时使用。
3.2.3 206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3.3 3XX重定向
3XX的响应结果表示浏览器应当执行一些特殊处理以正确访问资源。
3.3.1 301 Moved Permanently
永久性重定向,表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
3.3.2 302 Found
临时性重定向,表示请求的资源已被分配的新的URI,希望用户本次能使用新的URI访问。
3.3.3 303 See Other
表示对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。
3.3.4 304 Not Modified
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。
3.3.5 307 Temporary Redirect
请求的资源临时从不同的URI 响应请求。新的临时性的URI 应当在响应的 Location 域中返回。除非这是一个HEAD 请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。
3.4 4XX客户端错误
4XX的响应结果表明客户端的请求发生错误。
3.4.1 400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
3.4.2 401 Unauthorized
当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
3.4.3 403 Forbidden
表示对请求资源的访问被服务器拒绝了。
3.4.4 404 Not Found
表示服务器上无法找到请求的资源,也可以用于拒绝请求而不想说明理由。
3.5 5XX
5XX的响应结果表明服务器本身发生错误。
3.5.1 500 Internal Server Error
表明服务器端在执行请求时发生了错误,也可能是Web应用存在bug或某些临时故障。
3.5.2 503 Service Unavailable
表明服务器暂时处于超负载或正在停机维护,无法处理请求。
4 HTTP首部
4.1 HTTP首部简介
HTTP首部字段是构成HTTP报文的要素之一。在客户端与服务器使用HTTP通信的过程中,无论是请求还是相应都会用到首部字段,它能起到传递额外