如何学习HTTP协议

第一步了解协议报文格式

先初步了解一下报文格式,宏观上把握协议

请求报文

请求报文格式定义

请求报文格式
可以看到请求报文包括三大部分

  • 请求行
  • 请求头部
  • 请求数据
自己动手查看请求报文

输入图片说明

使用 Chrome 开发者工具查看请求报文头部(包含请求行和请求头部)。

响应报文

响应报文格式定义

输入图片说明

可以看到响应报文也是包括三部分

  • 状态行
  • 响应头部
  • 响应正文
自己动手查看响应报文

输入图片说明

使用 Chrome 开发者工具查看响应报文头部(包含状态行和响应头部)

第二步:搞清楚每个字段大概用途

  • 协议既然规定了这么多字段,每个字段都是有重要用途的;
  • 也要记住 HTTP 是应用层的协议,发送和接收细节都可以由应用程序控制,不一定严格遵循协议;
  • 一般业界的客户端程序(比如浏览器)、服务端程序(比如 Nginx、Apache)都是严格遵循的;
  • 这个阶段学习了解大概即可不必深究,防止初学者入坑,走火入魔

请求报文中字段含义

请求方法
URL
协议版本
头部字段--通用
  • Connection
    HTTP 报文是要靠 TCP 连接通信的。每个 HTTP 请求都需要有一个 TCP 连接,这个字段用于控制 TCP 连接是否保持连接。 HTTP 1.1 默认都是长连接的。

    对于请求报文,表示客户端希望TCP连接该如何处理

    • Connection: close 标示客户端不希望保持长连接,服务器根据此值在发送完响应后会将 TCP 连接关闭;
    • Connection: keep-alive 表示客户端希望保持长连接,暗示不远的将来客户端还会有请求发送,没必要每次请求都建立一个 TCP 连接。服务器根据此值一般会将该 TCP 连接保持一段时间。当然服务器也可以忽略这个请求,直接关闭 TCP 连接。

    对于响应报文,表示服务器端最终决定如何处理 TCP 连接:

    • Connection: close 服务器决定立即关闭 TCP 连接
    • Connection: keep-alive 服务器将该 TCP 连接保持
  • Cache-Control
    指定了请求和响应遵循的缓存机制。好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。

    对于请求报文,表示客户端告诉服务器目前客户端缓存情况

    • no-cache:客户端表示我不要(或没有或不相信)缓存中数据,请再给我一份。服务器判断资源有没有变更,没有变更就返回304,有变更就再传一份。
    • max-age:(不清楚发送报文中改值确切含义,猜测是本地我有缓存但是有效期过了,同样需要服务器重新发一份)
    • no-store:
    • max-stale:
    • min-fresh:
    • only-if-cached:
    • no-transform:

    对于响应报文,表示服务器告诉客户端该如何缓存

    • max-age:会附带一个过期时间,表示响应内容你给我存好了,没过期前不要再来找我要
    • public:表示你缓存吧,就连有密码保护的网页也储存,安全性很低
    • private:表示数据内容只能被储存到私有的cache,仅对某个用户有效,不能共享
    • no-cache: 可以缓存,但是只有在跟WEB服务器验证了其有效后,才能使用缓存
    • Must-revalidate:如果缓存过期了,要再次跟服务器确定是否为最新数据,不要问代理 proxy 那个
    • no-store:表示你不要存啊,小崽子,阅后即焚
    • max-stale:允许读取过期时间必须小于max-stale 值的缓存对象
    • proxy-revalidate:
    • s-maxage:
    • no-transform:
头部字段--仅请求使用
  • Referer
    当浏览器向web服务器发送请求时,使用referer,告诉服务器这条请求是从哪个页面过来的,服务器可以据此获得一些信息用于处理。
    来看一个实例,当开源中国社区页面加载时会向阿里云请求广告,这个请求中就有referer字段
    输入图片说明

阿里云服务器通过该请求中的referer字段就知道开源中国社区显示了一条广告,如果广告是按展现付费的话,红薯就有了一笔收入:)

  • User-Agent
    当浏览器向web服务器发送请求时,使用User-Agent告诉服务器访问者是通过什么工具来请求的。
    有些服务器会检查这个字段,如果发现不是浏览器而是爬虫,则拒绝响应。
    正所谓道高一尺魔高一丈,爬虫还是会伪装的。
    使用Chrome发起的请求如下图:
    输入图片说明
    User-Agent通常格式为:
Mozilla/5.0 (平台) 引擎版本 浏览器版本号

这个看起来很乱的写法,有很深的历史背景,暂时不要管它,除非你要写爬虫或者防爬虫。

  • accept-encoding
    浏览器发给服务器,声明浏览器支持的编码类型。服务器据此决定返回的内容该如何编码。
    对请求的内容进行编码可有效减少网络中传输数据量,进而提升web响应速度。 输入图片说明 上图中请求报文中声明支持gzip, deflate, br编码,从响应中可见最终使用的是gzip编码。服务器在返回数据前检查请求报文中声明的编码,从中选择一种对待返回内容进行编码,如使用gzip压缩,浏览器跟据响应报文中content-encoding进行解码。
头部字段--仅响应使用
  • content-encoding
    指明返回内容的编码格式,浏览器据此进行解码。

  • Date
    Date 用于标识消息生成的时间。
    下图为例说明:
    输入图片说明
    有两点需要说明:1. 时间是不带时区的,2. 这个时间是消息从源服务器发出的时间,如果当前请求来自缓存服务器,消息一般还是保持为源服务器的时间。也就是你看到的Date可能比较老。

请求数据

响应报文中字段含义

协议版本
状态码
状态码描述符
头部字段名
响应正文

转载于:https://my.oschina.net/renhc/blog/1807717

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值