罗剑锋透视HTTP协议学习笔记---09 | HTTP报文是什么样子的?

44 篇文章 6 订阅

09 | HTTP报文是什么样子的?

报文结构

  • HTTP/1.1是纯文本协议,它的报文结构是header+body, header又可以细分为起始行和头部。
    在这里插入图片描述

  • 起始行,在请求报文里称为请求行,响应报文里称为状态行。

请求行格式

  • 请求行包括方法,URI,版本三部分,之间用空格分隔,最后以CRLF结尾,即\r\n或0d0a, 如:GET / HTTP/1.1
    在这里插入图片描述

  • 状态行包括版本,状态码,原因三部分,也是用空格分隔,最后以CRLF结尾, 如:HTTP/1.1 200 OK
    在这里插入图片描述

头部字段

  • 就是一组键值对,如Host: www.baidu.com
  • 头字段一行一个,键值对没有规定大小写,一般“键”为首字母大写,:后一个空格,“值”小写,最后以CRLF结束,最后一个头字段再跟一个空行,表示头字段结束。即连续2个0d0a表示头字段结束。
  • 头字段还可以细分为通用头字段,请求头字段,响应头字段和实体头字段

常用头字段

  • Host: URI 请求头字段,必须,可用来区分虚拟主机
  • Connection:keep-alive/close, 通用头字段,可选,表示是否支持长连接。
  • Server: xxx 响应头字段,可选,返回服务器类型,版本等信息
  • User-Agent:xxx 请求头字段,可选,表示客户端类型,web服务器可据此返回适合该客户端的页面。
  • Date:xxx 通用头字段,可选,返回消息产生时间
  • Content-length: xxx, 通用头字段,可选,表示body的长度

Telnet 获取百度首页命令

GET / HTTP/1.1
Host: www.baidu.com

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Sun, 10 Jan 2021 12:14:37 GMT
Etag: “575e1f72-115”
Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

补充说明:
请求行: Methond SP request-target SP HTTP-version CRLF
其中request-target包括4种格式
origin-form = absolute-path["?" query],即可带查询的绝对路径
absolute-form = absolute-URL,包括完整的URI,即scheme+domain+path,用于向正向代理proxy发起请求时,防止老旧正向代理丢失scheme,domain信息。
authority-form = authority, 仅用于CONNECT方法建立隧道,如CONNECT www.example.com:80 HTTP/1.1,和指定的主机【域名:端口】建立隧道,所以不指向具体的资源。
asterisk-form = “*”,仅用于OPTIONS方法。

通用UA格式

User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>

Chrome UA:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36

Firefox UA:

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

课后作业

如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?

  • 分不同场景讨论,如果基于HTTP编程,头字段多加一个CRLF,则空行后面的头字段会被当做body的一部分处理;如果是Telnet,它不允许这么做,即头字段如果空了一行,则认为头字段输入结束。

讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?
无论0个,1个或多个空格,对于HTTP其在语义上是等价的,标准建议用1个空格,即易于阅读,也节省带宽。更高阶的解读则要参考ABNF的语法定义。
btw:如果包含多个空格,则会原样发出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值