http相关知识

HTTP 报文

HTTP 报文是在 HTTP 应用程序之间发送的数据块。和谐数据块以以西文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。

报文的组成部分

  • 起始行
  • 头部
  • 主体

起始行

  • 请求行:请求报文的起始行,其中包含了一个方法和一个请求 url
  • 响应行:响应报文的起始行,包含响应报文使用的 http 版本,状态码,描述操作状态的文本形式的原因短句

首部

http 首部字段向请求和响应报文添加了一些附加信息。首部有以下分类:

  • 通用首部:可以出现在请求或响应报文中
  • 请求首部:提供更多有关请求的信息
  • 响应首部:提供更多有关响应的信息
  • 实体首部:描述主体的长都和内容,或者资源自身。
  • 扩展首部:规范中没有定义

常见首部实例

1
2
3
4
Date:Tue,3Oct 1997 02:16:03 GMT //服务器产生响应的日期
Content-length:15040 //实体的主体部分包含了一个15040字节的数据
Content-type:image/gif //实体的主体是一个gif图
Accept: image/gif,image/jpeg, text/html //客户端可以接收GIF,JPEG和HTML

实体的主体部分

实体的主体是 HTTP 报文的负荷。可以承载图片,视频,HTML 文档,软件应用程序,邮件等。

首部详解

General Header 通用首部

general header 是 request、response 都可用的, 但是不能用于 entity.以下为通用的信息首部

  • Request URL: 请求地址
  • Request Method: 请求方法
  • Status Code: 状态码
  • Remote Address: 路由地址
  • Referrer Policy: 用于过滤 Referrer 报头内容有以下值
  • no-referrer-when-downgrade
    当发生降级(比如从 https:// 跳转到 http:// )时,不传递 Referrer 报头。但是反过来的话不受影响。通常也会当作浏览器的默认安全策略。
  • same-origin 同源,即当协议、域名和端口(如果有一方指定的话)都相同,才会传递 Referrer。

Request Header 请求首部

request-header fields 允许客户端传递关于 request 和客户端的附加信息到服务端

  • Accept: 告诉服务器能发送哪些媒体类型
  • Accept-Charset: 告诉服务器能发送
  • Accept-Encoding: 告诉服务器能发送哪些编码方式
  • Accept-Language: 告诉服务器能发送哪些语言
  • Host:发送请求的域
  • If-Modified-Since: 除非在某个指定日期后资源被修改过,否则就限制这个请求
  • If-None-Match :如果提供的实体标记(etag)与当前文档的实体标记不符合,则请求文档

    1)请求(客户端->服务端[request])

    GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)
    
    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(客户端请求服务端的时间)
    

Response Header 响应首部

  • access-control-allow-origin:*
  • age: 当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
  • cache-control: 服务器应遵循的缓存机制。
    • public(可以用 Cached 内容回应任何用户)
    • private(只能用缓存内容回应先前请求该内容的那个用户)
    • no-cache(可以缓存,但是只有在跟 WEB 服务器验证了其有效后,才能返回给客户端)
    • max-age = xxx:(本响应包含的对象的过期时间)
    • ALL: no-store(不允许缓存)
  • Expires:缓存过期过期时间
  • content-encoding
  • content-type
  • date

    2)响应(服务端->客户端[response])

    HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)
    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(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)
    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(服务端响应客户端的时间)
    

Expires/Cache-Control Header 是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是 Cache-Control 比 Expires 可以控制的多一些, 而且 Cache-Control 会重写 Expires 的规则。

Last-Modified/If-Modified-Since 和 ETag/If-None-Match 是浏览器发送请求到服务器后判断文件是否 已经修改过,如果没有修改过就只发送一个 304 回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。

状态码

200~299 成功状态码

  • 200: OK
  • 201: created 创建服务器请求
  • 202: accepted 已接受请求,未执行动作
  • 203 Non-Authoritative Information
  • 204 No Content

300~399 重定向状态码

  • 300: Multiple Choices 客户端请求一个实际指向多个资源的 URL 时会返回这个状态码
  • 301: Moved Permanently 请求的 rul 已被移除时使用
  • 302: Found 与 301 类似
  • 303: See Other 告知客户端应该使用另一个 URL 来获取资源
  • 304:Not Modified 客户端可以通过所包含请首部,使其请求变成有条件的。表示资源未修改,不包括主体
  • 305:Use Proxy 必须通过一个代理访问资源,代理位置由 Location 首部给出

400~499 客户端错误状态码

  • 400:Bad Request 告知客户端发送了一个错误的请求
  • 401:Unauthorized 与适当的首部一起返回,在这些首部中请求客户端在获取对象资源的访问权之前,对自己进行认证
  • 403: Forbidden 请求被服务器拒绝了
  • 404:Not Found 服务器无法找到所请求的 URL
  • 408:Request Timeout 请求时间太长

500~599 服务器粗偶状态码

  • 500 Internal Server Error 服务器遇到一个妨碍它为请求提供服务的错误
  • 501 Not Implement 客户端请求超出服务器能力范围(例如不支持的方法)
  • 502 Bad Gateway 作为代理或网管使用的服务器从请求响应链中收到一个伪请求(比如无法链接到父网关)
  • 503 Service Unavailable 用来说明服务器无法为请求提供服务
  • 504 Gateway Timeout 类似 408
  • HTTP Version Not supported 服务器收到的请求使用不受支持的协议版本