HTTP:HTTP报文是什么样子的

引言

  • 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了
  • HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息模式了报文的内容以及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。术语“流入”(inbound)、“流出”(outbound)、“上游”、“下游”都是用来描述报文方向的

HTTP使用术语流入流出来描述事务处理的方向。报文流入源端服务器,工作完成后,会流回用户的Agent代理中。
在这里插入图片描述
所以,我们也把它叫做报文流

报文结构

HTTP报文是简单的格式化数据库。每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应

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

  • 起始行(start line):
    • 对报文进行基本的描述,描述请求或响应的基本信息;
    • 主要用来区分是请求还是响应,如果是请求,就叫做请求行;如果是响应,就叫做响应行
  • 头部字段块(header):
    • 使用 key-value 形式更详细地说明报文的属性
    • HTTP协议和TCP/UDP类似,同样也需要在实际传输的数据前加一些头数据,不过跟TCP/UDP不同的是,它是一个“纯文本”的协议,所以头数据都是ASCII码的文本,阅读很方便,不用经过程序解析也能过看懂
    • 起始行和头部字段经常又合称为“请求头”或“响应头”
  • 消息正文(entity):
    • 消息正文又称为“实体”(“body”)
    • 它是实际传输的数据
      • 它不一定是纯文本,可以是图片、视频等二进制数据。
      • 它可以有,也可以为空
    • 起始行和header是ASCII码文本,但是body就不一定可读了

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

所以,一个完整的 HTTP 报文就像是下图的这个样子,注意在 header 和 body 之间有一个“空行”。
在这里插入图片描述
报文里的 header 就是“大头儿子”的“大头”,空行就是他的“脖子”,而后面的 body 部分就是他的身体了。

看一下我们之前用 Wireshark 抓的包吧。
在这里插入图片描述
在这个浏览器发出的请求报文里,第一行“GET /HTTP/1.1”就是请求行,而后面的“Host”“Connection”等等都属于 header,报文的最后是一个空白行结束,没有 body。

在很多时候,特别是浏览器发送 GET 请求的时候都是这样,HTTP 报文经常是只有 header 而没 body,相当于只发了一个超级“大头”过来,你可以想象的出来:每时每刻网络上都会有数不清的“大头儿子”在跑来跑去。

不过这个“大头”也不能太大,虽然HTTP协议对header的大小没有做限制,但各个web服务器都不允许过大的请求头,因为头部太大可能会占用大量的服务器资源,影响运行效率。

请求行

了解了HTTP报文的基本结构后,我们来看看请求报文里的起始行也就是请求行(request line),它简要的描述了客户端想要如何操作服务器的资源

请求行有三部分组成:

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

这三个部分通常使用空格(space)来分隔,最后要用CRLF 换行表示结束。
在这里插入图片描述
还是用 Wireshark 抓包的数据来举例:

GET / HTTP/1.1

在这个请求行里,“GET”是请求方法,“/”是请求目标,“HTTP/1.1”是版本号,把这三部分连起来,意思就是“服务器你好,我想获取网站根目录下的默认文件,我用的协议版本号是 1.1,请不要用 1.0 或者 2.0 回复我。”

状态行

看完了请求行,我们再看响应报文里的起始行,在这里它不叫“响应行”,而是叫做“状态行(status line)”,意思是服务器响应的状态

比起请求行来说,状态行要简单一些,同样也是由三部分构成:

  • 版本号:表示报文使用的 HTTP 协议版本;
  • 状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500 是服务器错误;
  • 原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
    在这里插入图片描述
    Wireshark 抓包里的响应报文,状态行是:
HTTP/1.1 200 OK

意思就是:“浏览器你好,我已经处理完了你的请求,这个报文使用的协议版本号是 1.1,状态码是 200,一切OK。”

而另一个“GET /favicon.ico HTTP/1.1”的响应报文状态行是:

HTTP/1.1 404 Not Found

意思就是:“抱歉啊浏览器,刚才你的请求收到了,但我没找到你要的资源,错误代码是 404,接下来的事情你就看着办吧。”

头部字段

请求行或状态行 + 头部字段 --> HTTP报文里的完整请求头或者响应头:
在这里插入图片描述
在这里插入图片描述

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

  • 头部字段是 key-value 的形式,key 和 value 之间用“:”分隔,最后用 CRLF 换行表示字段结束
  • 比如在“Host: 127.0.0.1”这一行里 key 就是“Host”,value就是“127.0.0.1”。

总结

  • HTTP 报文结构就像是“大头儿子”,由“起始行 + 头部 + 空行 + 实体”组成,简单地说就是“header+body”;
  • HTTP 报文可以没有 body,但必须要有 header,而且header 后也必须要有空行,形象地说就是“大头”必须要带着“脖子”;
  • 请求头由“请求行 + 头部字段”构成,响应头由“状态行 + 头部字段”构成;
    • 请求行有三部分:请求方法,请求目标和版本号;
    • 状态行也有三部分:版本号,状态码和原因字符串;
  • 头部字段是 key-value 的形式,用“:”分隔,不区分大小写,顺序任意,除了规定的标准头,也可以任意添加自定义字段,实现功能扩展;
  • HTTP/1.1 里唯一要求必须提供的头字段是 Host,它必须出现在请求头里,标记虚拟主机名。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值