栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

http消息简介

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

http消息简介

文章目录
    • 前言
    • http报文简介
      • 消息头
    • 抓包展示
      • 请求报文结构
      • 响应报文结构
    • 代码展示
      • 背景介绍
      • 源码展示
    • 其他

前言

看代码的时候遇到这个点,顺道整理下。

略。


http报文简介

参考书籍:《图解HTTP》上野宣
参考链接:HTTP 消息结构 - 菜鸟教程、HTTP 消息 - MDN、HTTP Headers

下面是"HTTP请求报文结构"和"HTTP响应报文结构",来自《图解HTTP》。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAFeVgdg-1655180685448)(image/3_response.png)]

消息头

根据不同上下文,可将消息头分为:

  • General headers: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
  • Request headers: 包含更多有关要获取的资源或客户端本身信息的消息头。
  • Response headers: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
  • Entity headers: 包含有关实体主体的更多信息,比如主体长 (Content-Length) 度或其 MIME 类型。

抓包展示 请求报文结构

请求行:

  • 请求行:GET / HTTP/1.1rn。

  • GET方法用来请求访问已被URI识别的资源。上面请求资源的URI标识为/,默认应该是index.html。指定了HTTP 1.1版本。

  • 除了常见的GET和POST方法,其他的请求方法见:HTTP 请求方法

请求首部字段:

  • HOST请求头指明了请求将要发送到的服务器主机名和端口号。
  • Upgrade-Insecure-Requests用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应。服务器现在可以重定向到这个站点的安全版本。
  • User-Agent部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
  • Accept用来告知(服务器)客户端可以处理的内容类型。服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type 应答头通知客户端它的选择。
  • Accept-Encoding会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding 中通知客户端该选择。
  • Accept-Language请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用 Content-Language 应答头通知客户端它的选择。

通用首部字段:

  • Connection决定当前的事务完成后,是否会关闭网络连接。Keep-Alive允许消息发送者暗示连接的状态。注意这是个逐条消息头。

实体首部字段:

  • 该请求报文无该部分内容。

小饼干:

  • HTTP Cookie

报文主体:


响应报文结构

状态行:

  • 服务端返回的状态行HTTP/1.1 304 Not Modifier
  • 304 Not Modified说明无需再次传输请求的内容,也就是说可以使用缓存的内容。

响应首部字段:

  • Server包含了处理请求的源头服务器所用到的软件相关信息。
  • ETag资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

通用首部字段:

  • Data含了报文创建的日期和时间。
  • Connection决定当前的事务完成后,是否会关闭网络连接。Keep-Alive允许消息发送者暗示连接的状态。注意这是个逐条消息头。

实体首部字段:

非标准响应头:

  • X-Powered-By: Next.js ,可参考What does “x-powered by” mean?、Next.js

代码展示

目标:编写一个http client去请求http服务器;使用http-parse解析返回的报文。

思路:我们使用Boost.Asio来解决网络通信;使用Boost.Beast提供的低层次HTTP/1;再画蛇添足的使用http-parse来解析报文信息。(因为boost-beast已经可以从response中提取内容了)

背景介绍

boost-asio-网络通信简介:

推荐阅读《Boost程序完全开发指南》12.3.4网络通信。要点如下:

  • address类封装了ip地址。
  • endpoint类封装了ip地址和端口。
  • socket类是TCP通信的基本类。
  • acceptor类对应Socket API的accept的函数功能。

boost-beast简介:

暂时没有找见比较好的中文资料。暂时不大会用。我抄了下官方文档中的Simple HTTP Client。倒霉孩子的是,我看了http::response和basic_flat_buffer,没搞清楚这两者是如何结合使用的。

http-parse简介:

这个仓库倒不是很复杂,只有一个头文件和一个源文件。要点如下:

  • 申请http_parse解析器
  • 初始化解析器
  • 设置回调函数
  • 执行解析
源码展示
#include "http_parser.h"

#include 
#include 

#include 
#include 
#include 

using namespace std;

int on_headers_complete(http_parser*) {
    cout<<"--------------headers complete--------------"< req{ boost::beast::http::verb::get, target, version };
    req.set(boost::beast::http::field::host, host);
    req.set(boost::beast::http::field::user_agent, BOOST_BEAST_VERSION_STRING);

    boost::beast::http::write(socket, req);

    boost::beast::flat_buffer buffer;

    boost::beast::http::response res;

    boost::beast::http::read(socket, buffer, res);

    // 不使用http_parse,从res中提取出报文信息
    // cout<< res << endl;
    // for(auto const& field : res) {
    //     cout<--------------message beagin----------------
Header field: Server
Header value: nginx/1.10.3 (Ubuntu)
Header field: Date
Header value: Tue, 14 Jun 2022 03:45:15 GMT
Header field: Content-Type
Header value: text/html; charset=utf-8
Header field: Content-Length
Header value: 54876
Header field: Connection
Header value: keep-alive
Header field: X-Powered-By
Header value: Next.js 7.0.0
Header field: ETag
Header value: "d65c-w4yONx6s6KFZXG9Xtq1AfDpPCIQ"
--------------headers complete--------------
Body:  
其他 

略。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972687.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号