0%

HTTP报文

HTTP报文

报文结构

HTTP协议也是与TCP/UDP类似,也需要在实际传输的数据前附加一些头数据,它是一个“纯文本”的协议,头数据是ASCII码的文本。

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

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

这其中前两部分起始行和头部字段经常又合称为“请求头(request header)”或“响应头(response header)**”,消息正文又称为“实体”,但与“header”对应,很多时候就直接称为“body”**。

HTTP协议规定报文必须有header,但可以没有body,而且在header之后必须要有一个“空行”(也就
是“CRLF”,十六机制的“0D0A”。)

1612699070216

具体实例:

1612699117260

第一行GET / HTTP/1.1就是请求行,后面的Host,Connection等等都属于header,报文的最后是一个空白行结束,没有body。

起始行start line

  • 请求报文里的起始行是请求行(request line)
  • 响应报文里的起始行是状态行(status line)

请求行request line

请求报文里的起始行也就是请求行(request line),它简要地描述了客户端想要如何操作服务器端的资源。

请求行由三部分构成:

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

这三个部分通常使用空格(space)来分隔,最后要用CRLF换行表示结束。

  • 例子:
1
GET / HTTP/1.1

在这个请求行里,“GET”是请求方法,“/”是请求目标,“HTTP/1.1”是版本号

状态行Status line

响应报文里的起始行。(它不叫“响应行”,而是叫“状态行”(status line),意思是服务器响应的状态。)

这三个部分通常使用空格(space)来分隔,最后要用CRLF换行表示结束:

  1. 版本号:表示报文使用的HTTP协议版本;
  2. 状态码:一个三位数,用代码的形式表示处理的结果,比如200是成功,500是服务器错误;
  3. 原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
1
HTTP/1.1 200 OK

协议版本号是1.1,状态码是200,一切OK。

头部字段Header

请求行或状态行再加上头部字段集合就构成了HTTP报文里完整的请求头(Request Headers)或响应头(Response Headers)

请求头和响应头的结构是基本一样的,唯一的区别是起始行。

头部字段是key-value的形式,用“:”分隔。比如在“Host:127.0.0.1”这一行里key就是“Host”,value就是“127.0.0.1”。

不过使用头字段需要注意下面几点:

  1. 字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
  2. 字段名里不允许出现空格可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合
    法的字段名,而“test name”“test_name”是不正确的字段名;
  3. 字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
  4. 字段的顺序是没有意义的,可以任意排列不影响语义;
  5. 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie。

常用头字段

HTTP协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:

  1. 通用字段:在请求头和响应头里都可以出现;

  2. 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;

  3. 响应字段:仅能出现在响应头里,补充说明响应报文的信息;

  4. 实体字段:它实际上属于通用字段,但专门描述body的额外信息。

Host字段

只能出现在请求头里,且必须出现,Host字段告诉服务器这个请求应该由哪个主机来处理。

User-Agent字段

只出现在请求头里,它使用一个字符串来描述发起HTTP请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。

Date字段

通常出现在响应头里,表示HTTP报文创建的时间,客户端可以使用这个时间
再搭配其他字段决定缓存策略。

Server字段

只能出现在响应头里。它告诉客户端当前正在提供Web服务的软件名称和版本号,

Server字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息