HTTP报文 「HTTP

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

  1. 起始行(start line):描述请求或响应的基本信息;
  2. 头部字段集合(header):使用key-value形式更详细地说明报文;
  3. 消息正文(entity):实际传输数据,不一定是纯文本,可以实图片,视频等二进制数据。

HTTP协议起始行和头部是必须要有的,正文可以没有,头部结束有一个空行作为头部的结束。

起始行

请求报文里的起始行叫做请求行,简要的描述了客户端想要如何操作服务器端的资源

响应报文里的起始行叫做状态行,描述了服务器响应的状态

请求行

先看例子

GET / HTTP/1.1\r\n

请求行由三部分组成:

  1. 请求方法:如GET/POST,表示对资源的操作;
  2. 请求目标:通常是一个URI,标记了请求方法要操作的资源;
  3. 版本号:表示报文使用的HTTP协议版本。

这三部分通常使用空格来分割,最后使用换行结束。

这个请求行里,GET是请求方法,之后跟了一个空格,接下来/是请求目标,又跟了个空格,接下来HTTP/1.1是版本号,接下来是/r/n换行。

HTTP/1.1规定了八种方法:

  1. GET:获取资源,可以理解为读取或者下载数据;
  2. HEAD:获取资源的元信息;
  3. POST:向资源提交数据,相当于写入或上传数据;
  4. PUT:类似 POST;
  5. DELETE:删除资源;
  6. CONNECT:建立特殊的连接隧道;
  7. OPTIONS:列出可对资源实行的方法;
  8. TRACE:追踪请求 - 响应的传输路径。

其中GET,POST,HEAD,PUT为常用方法。

URI里只能使用ASCII码,那要是需要使用汉语咋办呢,按照URI转义会把非ASCII码字符转换成十六进制,然后在每个十六进制字节前加上%,一个十六进制是四位,一个字节八位,所以类似于%E4%A7这样。

状态行

同样先看例子

HTTP/1.1 200 OK\r\n

状态行也由三部分组成:

  1. 版本号:表示报文使用的HTTP协议版本;
  2. 状态码:三位数字,用代码表示处理的结果;
  3. 原因:数字状态码的补充。

这个状态行里,HTTP/1.1是版本号,空格,200是状态码表示成功,空格,OK是原因作为对状态码200的补充,换行。

头部

请求行/状态行加上头部的字段就构成了HTTP报文的请求头/响应头

请求头/响应头的字段的类型可能不同,但是结构是相同的,都是字段名 :字段值 换行,字段名不区分大小写,字段名里不允许出现空格,字段名后面必须紧跟着:不能有空格。

头部字段基本可以分为四大类:

  1. 通用字段:在请求头和响应头里都可以出现;
  2. 请求字段:仅出现在请求头里;
  3. 响应字段:仅能出现在响应头里;
  4. 实体字段:属于通用字段,描述body的额外信息。

Host字段

属于请求字段,HTTP/1.1规范要求必须出现的字段。

Host字段告诉服务器这个请求应该由哪个主机来处理。

User-Agent字段

属于请求字段,使用一个字符串来描述发起HTTP请求的客户端,服务器可以一句它来返回最合适此浏览器显示的页面。

Date字段

属于通用字段,表示HTTP报文创建的时间。

Server字段

属于相应字段,告诉客户端当前正在提供WEB服务的软件名称和版本号,不是必须要出现的字段,也不一定要是真实的信息,可以是完全无关的描述信息。

Content-Length字段

属于实体字段,表示报文里body的长度。

参考自极客时间透视HTTP协议

posted @ 2020-11-11 11:19  林静生寒  阅读(124)  评论(0编辑  收藏  举报