HTTP协议

Catalogue   

HTTP 协议的请求报文和响应报文的结构基本相同,主要由三大部分组成:

  • 状态行(status line):描述响应的基本信息,也就是服务器响应的状态;
  • 头部字段集合(header):使用 key-value 形式更详细地说明报文;
  • 消息正文(entity):实际响应的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

header参数

请求头

  • Request URL( 请 求 的 地 址 )
  • Request Method(请求的方式)
  • Status Code(状态码)
  • Accept: /(客户端能接收的资源类型)
  • Accept-Language: en-us( 客 户 端 接 收 的 语 言 类 型 )
  • Connection: Keep-Alive(维护客户端和服务端的连接关系)
  • Host:localhost:8080(连接的目标主机和端口号)
  • Referer: http://localhost/links.asp(告诉服务器我来自哪里)
  • User-Agent:Mozilla/4.0(客户端版本号的名字)
  • Accept-Encoding:gzip, deflate(客户端能接收的压缩数据的类型)
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT( 缓 存 时 间 )
  • Cookie(客户端暂存服务端的信息)
  • Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间)

响应

  • Location:http://www.baidu.com(服务端需要客户端访问的页面路径)
  • Server:apache tomcat(服务端的Web服务端名)
  • Content-Encoding:gzip(服务端能够发送压缩编码类型)
  • Content-Length:80(服务端发送的压缩数据的长度)
  • Content-Language:zh-cn(服务端发送的语言类型)
  • Content-Type:text/html;charset=GB2312(服务端发送的类型及采用的编码方式)
  • Last-Modified:Tue, 11 Jul 2000 18:23:51 GMT(服务端对该资源最后修改的时间)
  • Refresh:1;url=http://www.it315.org(服务端要求客户端一秒钟后,刷新,然后访问指定的页面 路径)
  • Content-Disposition:attachment;filename=aaa.zip(服务端要求客户端以下载文件的方式打开 该文件)
  • Transfer-Encoding:chunked(分块传递数据到客户端)
  • Set-Cookie:SS=Q0=5Lb_nQ;path=/search(服务端发送到客户端的暂存数据)
  • Expires:-1//3种(服务端禁止客户端缓存页面数据) Cache-Control:no-cache(服务端禁止客户端缓存页面数据) Pragma:no-cache(服务端禁止客户端缓存页面数据)
  • Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)
  • Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间)
  • Cache-Control:缓存配置
    • private: 客户端可以缓存
    • public: 客户端和代理服务器都可缓存
    • max-age=xxx: 缓存的内容将在 xxx 秒后失效
    • no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
    • no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发

状态码

1xx

1×× 类状态码属于提示信息,是协议处理的中间状态,实际能够用到的时候很少。

2xx

2×× 类状态码表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码。

  • “200 OK”是最常见的成功状态码,表示一切正常,服务器如客户端所期望的那样返回了处理结果。
  • “204 No Content”是另一个很常见的成功状态码,它的含义与“200 OK”基本相同,但响应头后没有 body 数据。
  • “206 Partial Content” 一般用于分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现,它与 200 一样,也是服务器成功处理了请求,
    但 body 里的数据不是资源的全部,而是其中的一部分。状态码 206 通常还会伴随着头字段“Content-Range”,表示响应报文里 body 数据的具体范围,
    供客户端确认,例如“Content-Range: bytes 0-66/888”,意思是此次获取的是总计 888 个字节的前 66 个字节。

3xx

3×× 类状态码表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,也就是通常所说的“重定向”,包括“著名”的 301、302 跳转。

  • “301 Moved Permanently”俗称“永久重定向”,含义是此次请求的资源已经不存在了,需要改用新的 URI 再次访问。与它类似的是“302 Found”,曾经的描述短语
    是“Moved Temporarily”,俗称“临时重定向”,意思是请求的资源还在,但需要暂时用另一个 URI 来访问。

  • “304 Not Modified” 是一个比较有意思的状态码,它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,
    但可以理解成“重定向已到缓存的文件”(即“缓存重定向”)。

4xx

4××类状态码表示客户端发送的请求报文有误,服务器无法处理,它是具有真正的“错误码”含义的状态码了。

  • “400 Bad Request”是一个通用的错误码,表示请求报文有错误,但具体是数据格式错误、缺少请求头或者还是其他错误则不会明确指示,因此在Web开发时
    一般会尽量避免给客户端返回 400,使用其他更有明确含义的状态码。
  • “403 Forbidden”实际上不是客户端的请求出错,而是表示服务器禁止访问资源。原因可能多种多样,例如信息敏感、法律禁止等。
  • “404 Not Found”可能是我们最常看到的一个状态码,它一般指资源在本服务器上未找到,所以无法提供给客户端。
  • 405 Method Not Allowed:不允许使用某些方法操作资源,例如不允许 POST 只能 GET;
  • 406 Not Acceptable:资源无法满足客户端请求的条件,例如请求中文但只有英文;
  • 408 Request Timeout:请求超时,服务器等待了过长的时间;
  • 409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;
  • 413 Request Entity Too Large:请求报文里的 body 太大;
  • 414 Request-URI Too Long:请求行里的 URI 太大;
  • 429 Too Many Requests:客户端发送了太多的请求,触发了服务器的限制;
  • 431 Request Header Fields Too Large:请求头某个字段或总体太大。

5xx

5×× 类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”。

  • “500 Internal Server Error” 与 400 类似,也是一个通用的错误码,服务器究竟发生了什么错误我们是不知道的。不过和 400 的响应相反,
    开发人员通常不会把服务器内部的出错详细信息返回给访问端。虽然不利于调试,但能够防止黑客的窥探或者分析。

  • “501 Not Implemented” 表示客户端请求的功能还不支持,类似于“即将开业,敬请期待”的意思。

  • “502 Bad Gateway” 通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的。

  • “503 Service Unavailable”表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码 503。

HTTP请求过程

参考