速读,五分钟深入了解HTTP( 三 )


303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源 。
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法 。
304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码 。
307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法 。
4XX 客户端错误

400 Bad Request :请求报文中存在语法错误 。
401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证) 。如果之前已进行过一次请求,则表示用户认证失败 。
403 Forbidden :请求被拒绝 。
404 Not Found
5XX 服务器错误
500 Internal Server Error :服务器正在执行请求时发生错误 。
503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 。
六、HTTP 首部有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段 。
各种首部字段及其含义如下(不需要全记,仅供查阅):
通用首部字段首部字段名说明Cache-Control控制缓存的行为Connection控制不再转发给代理的首部字段、管理持久连接Date创建报文的日期时间Pragma报文指令Trailer报文末端的首部一览Transfer-Encoding指定报文主体的传输编码方式Upgrade升级为其他协议Via代理服务器的相关信息Warning错误通知
请求首部字段首部字段名说明Accept用户代理可处理的媒体类型Accept-Charset优先的字符集Accept-Encoding优先的内容编码Accept-Language优先的语言(自然语言)AuthorizationWeb 认证信息Expect期待服务器的特定行为From用户的电子邮箱地址Host请求资源所在服务器If-Match比较实体标记(ETag)If-Modified-Since比较资源的更新时间If-None-Match比较实体标记(与 If-Match 相反)If-Range资源未更新时发送实体 Byte 的范围请求If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)Max-Forwards最大传输逐跳数Proxy-Authorization代理服务器要求客户端的认证信息Range实体的字节范围请求Referer对请求中 URI 的原始获取方TE传输编码的优先级User-AgentHTTP 客户端程序的信息
响应首部字段首部字段名说明Accept-Ranges是否接受字节范围请求Age推算资源创建经过时间ETag资源的匹配信息Location令客户端重定向至指定 URIProxy-Authenticate代理服务器对客户端的认证信息Retry-After对再次发起请求的时机要求ServerHTTP 服务器的安装信息Vary代理服务器缓存的管理信息WWW-Authenticate服务器对客户端的认证信息
实体首部字段首部字段名说明Allow资源可支持的 HTTP 方法Content-Encoding实体主体适用的编码方式Content-Language实体主体的自然语言Content-Length实体主体的大小Content-Location替代对应资源的 URIContent-MD5实体主体的报文摘要Content-Range实体主体的位置范围Content-Type实体主体的媒体类型Expires实体主体过期的日期时间Last-Modified资源的最后修改日期时间
七、具体应用连接管理
速读,五分钟深入了解HTTP

文章插图
 
1. 短连接与长连接当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源 。如果每进行一次 HTTP 通信就要新建一个 TCP 连接,那么开销会很大 。
长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信 。
从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;
在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive 。
那么http如何判断一个报文结束? 所有http不外乎2情况:
  • 无entity body,则"rnrn"(两个回车符),判断 。
  • 有entity body,则用"Content-Length“字段值判断 。
参考http消息包的结束标记
2. 流水线默认情况下,HTTP 请求是按顺序发出的,下一个请求只有在当前请求收到响应之后才会被发出 。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间 。
流水线是在同一条长连接上发出连续的请求,而不用等待响应返回,这样可以避免连接延迟 。


推荐阅读