Http协议报文格式

2023-05-16

一、整体介绍

    Http协议在传输层基于TCP协议,在Http1.1之前每次请求在TCP层都需进行一轮连接和释放(三次握手、四次握手),从Http1.1开始默认使用长连接。
    Http报文分为两种,请求报文和响应报文,大致格式如下:

1.请求报文结构:

      请求行     {     请求方法(get/post等)+     URL     +     协议版本号     }     
+    头部        {     按照规范,根据自己需要来选择性添加     }
+    包体        {     即数据内容,post请求时,这部分才有数据;get请求时,数据附在URL参数里,格式为【URL?参数名=参数值】     }

2.响应报文格式

      状态行     {     协议版本号     +     状态码     +     状态码说明     }     
+    头部        {     按照规范,根据自己需要来选择性添加     }
+    包体        {     一般为服务端返回给客户端的数据     }

#一、请求报文

结构构成:请求行 + 请求头部 + 请求数据

1.请求行 = 请求方法字段 + URL字段 + HTTP协议版本字段

##.请求方法

HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。GET和POST是最常用的请求方法。
&&. GET请求
        使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。这种方式不适合传送私密数据。
GET方式的请求一般不包含”请求数据”部分。
        由于不同的浏览器对地址的字符限制也有所不同,长度一般不能超过4KB,所以如果需要传送大量数据的时候,也不适合使用GET方式。
&&. POST请求
POST方式对传送的数据大小没有限制, 可以允许客户端给服务器提供信息较多。
POST方法将请求参数封装在HTTP请求数据中,不会显示在URL中。

##.URL

URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有事可以省略(HTTP默认端口号是80,Https默认端口443)

##.HTTP协议版本字段

指定使用的Http协议版本
HTTP/1.1的优化
        长连接 : 在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。
HTTP2.0的优化
    使用二进制格式传递数据:HTTP1.x的解析是基于文本, 传输的是一堆ASCII码串 。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
    多路复用:在同一个TCP连接中,同一时刻可以发送多个请求和响应,下一次的请求不需要等待上一个响应来之后再发送。但响应的顺序是不变的,FIFO(先进先出)。2.0之前是同一个连接只能用一次, 如果开启了keep-alive,虽然可以用多次,但是同一时刻只能有一个HTTP请求。
    HTTP2.0的多路复用主要是指:因为http2.0的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。
    header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用HPACK算法对header的数据进行压缩,避免了重复header的传输,又减小了需要传输数据的大小,基本原理是客户端和服务端分别缓存一份索引表,如果头部存在于索引表,则用对应的索引值;否则进行霍夫曼编码,并加入索引表。

##2.请求头部

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。请求头部通知服务器有关于客户端请求的信息。常见头部字段:

Cache-Control    控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内
Connection    逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将
Accept    用户代理可处理的媒体类型
Accept-Charset    优先的字符集
Accept-Encoding    优先的内容编码
Authorization    Web认证信息
Expect    期待服务器的特定行为
From    用户的电子邮箱地址
Host    请求资源所在的服务器主机名/域名
If-Match    比较实体标记(Etag)
If-Modified-Since    比较资源的更新时间,出现在条件get请求中
If-None-Match    比较实体标记(与If-Match相反)
If-Range    资源未更新时发送实体Byte的范围请求
If-Unmodified-Since    比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards    最大传输逐跳数
Proxy-Authorization    代理服务器要求客户端的认证信息
Range    实体的字节范围请求
Referer    请求中URI的原始获取方
TE    传输编码的优先级
User-Agent    HTTP客户端程序的信息。如果是浏览器则是对应浏览器的用户代理字符串
Content-Encoding    实体主体适用的编码方式
Content-length    实体主体的大小(单位:字节)
Content-Type    实体主体的媒体类型

空行

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

##3.请求数据

请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最高频使用的请求头部是Cntent-Type和Content-Length,分别代表数据类型和数据长度。

部分常用的Content-Type:

text/plain :纯文本格式 .txt

text/xml : XML格式 .xml

image/gif :gif图片格式 .gif

image/jpeg :jpg图片格式 .jpg

image/png:png图片格式 .png

audio/mp3 : 音频mp3格式 .mp3

audio/rn-mpeg :音频mpga格式 .mpga

video/mpeg4 : 视频mp4格式 .mp4

video/x-mpg : 视频mpa格式 .mpg

video/x-mpeg :视频mpeg格式 .mpeg

video/mpg : 视频mpg格式 .mpg

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式

application/xml : XML数据格式

application/atom+xml :Atom XML聚合格式

application/json : JSON数据格式

application/pdf :pdf格式

application/msword : Word文档格式

application/octet-stream : 二进制流数据(如文件下载)

#二.响应报文

HTTP响应报文 = 状态行(status line) + 响应头部(headers) + 响应数据(也叫响应体或响应正文)(response body)

##1.状态行

状态行 = 协议版本 + 状态码 + 状态码描述。
其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
HTTP状态码
状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:
  1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
  2xx:表示服务器已成功接收到请求并进行处理;
  3xx:表示服务器要求客户端重定向;
  4xx:表示客户端的请求有非法内容;
  5xx:表示服务器未能正常处理客户端的请求而出现意外错误;

##2.响应头部

常见响应头部及描述如下:
Cache-Control    控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内
Connection    逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将不再携带该字段。如果值为close或Keep-Alive则分别表示连接为短/长连接
Accept-Ranges    是否接受字节范围请求
Age    推算资源创建经过时间
ETag    资源的匹配信息
Location    令客户端重定向至指定URI
Proxy-Authenticate    代理服务器对客户端的认证信息
Server    HTTP服务器的安装信息
Vary    代理服务器缓存的管理信息
WWW-Authenticate    服务器对客户端的认证信息
Content-Encoding    实体主体适用的编码方式
Content-length    实体主体的大小(单位:字节)
Content-Type    实体主体的媒体类型

空行

响应头部的最后会有一个空行,表示响应头部结束,接下来为响应数据。与请求报文一致。

##3.响应体

用于存放需要返回给客户端的数据信息。

#头部字段补充说明

HTTP首部字段类型分为四种:

1、通用首部字段(General Header Feilds)
即请求报文和响应报文双方都会使用的首部
2、请求首部字段(Request Header Fields)
从客户端向服务器发送请求时使用的首部。补充了请求的附加内容、客户端信息、响应内容想关优先级等信息。
3、响应首部字段(Response Header Fields)
从服务器向客户端返回响应时使用的首部。补充了相应的附加内容
4、实体首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
注意:仍然是报文的头部字段,只是针对报文数据体作相关说明,并不会存储在报文数据体里。

以下为HTTP/1.1所有头部字段

1.通用头部字段
Cache-Control    控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内
Connection    逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将不再携带该字段。如果值为close或Keep-Alive则分别表示连接为短/长连接
Date    创建报文的日期时间
Pragma    报文指令。是HTTP/1.1之前版本的遗留字段,仅作为与HTTP/1.0的向后兼容而定义
Trailer    报文末端的首部一览
Transfer-Encoding    指定报文主体的传输编码方式
Upgrade    升级为其他协议
Via    代理服务器的相关信息。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发,目的是追踪请求和响应报文的传输路径
Warning    错误通知
2.请求头部字段
Accept    用户代理可处理的媒体类型
Accept-Charset    优先的字符集
Accept-Encoding    优先的内容编码
Authorization    Web认证信息
Expect    期待服务器的特定行为
From    用户的电子邮箱地址
Host    请求资源所在的服务器主机名/域名
If-Match    比较实体标记(Etag)
If-Modified-Since    比较资源的更新时间,出现在条件get请求中
If-None-Match    比较实体标记(与If-Match相反)
If-Range    资源未更新时发送实体Byte的范围请求
If-Unmodified-Since    比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards    最大传输逐跳数
Proxy-Authorization    代理服务器要求客户端的认证信息
Range    实体的字节范围请求
Referer    请求中URI的原始获取方
TE    传输编码的优先级
User-Agent    HTTP客户端程序的信息。如果是浏览器则是对应浏览器的用户代理字符串
3.响应头部字段
Accept-Ranges    是否接受字节范围请求
Age    推算资源创建经过时间
ETag    资源的匹配信息
Location    令客户端重定向至指定URI
Proxy-Authenticate    代理服务器对客户端的认证信息
Server    HTTP服务器的安装信息
Vary    代理服务器缓存的管理信息
WWW-Authenticate    服务器对客户端的认证信息
4.实体头部字段
Allow    资源可支持的HTTP方法
Content-Encoding    实体主体适用的编码方式
Content-language    实体主体的自然语言
Content-length    实体主体的大小(单位:字节)
Content-MD5    实体主体的报文摘要
Content-Range    实体主体的位置范围
Content-Type    实体主体的媒体类型
Expires    实体主体过期的日期时间
Last-Modified    资源的最后修改日期时间
(声明:部分图片引用自网络,侵删!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Http协议报文格式 的相关文章

  • jsp学习(二)

    jsp注释 xff1a html注释 lt gt 注释的内容只在页面上看不到 xff0c Java代码和html源代码都有 java注释 只在java代码中存在 jsp注释 lt gt 只在jsp页面中存在 xff0c 翻译成java文件之
  • 数据结构 _ PAT练习 _ 1064 Complete Binary Search Tree

    1064 Complete Binary Search Tree 原题基本分析代码 原题 点此链接1 基本分析 参考陈越姥姥的解题2 xff0c 主要的难点在于在何处插入新元素使得满足完全搜索二叉树的条件 猜测还有一种更通用的动态插入算法
  • 数据结构 _ 基础练习 _ 7-10 公路村村通

    原题 点此链接1 题目分析 可参考课本 xff08 高等教育出版社 陈越 数据结构 xff09 P225中关于prim算法的描述解题 本题相对于课本描述的算法来说 xff0c 不需要考虑 父节点 xff08 parent xff09 xff
  • KEIL问题二[function的内容空没有显示(占用CPU过高)][报错Error: Encountered an improper argument]

    function的内容空没有显示 不知道怎么回事也没有任何复现的办法 装了各个版本的KEIL都不能够接解决这个问题 最终无意中新建立了一个代码分组彻底解决这个问题 KEIL Functions Bug 当出现 function的bug的时候
  • 数据结构 _ 基础练习 _7-11 关键活动 _ 非递归解法

    1 原题 点此链接1 2 解题思路 写在前面 xff0c 参考博文2 本题其实考察的就是课本 xff08 高等教育出版社 陈越 数据结构 xff09 6 8节 关键路径的内容 课本中给出了三个公式 xff0c 以分别计算三个要素 xff1a
  • 数据结构 _ PAT练习 _ 7-13 Insert or Merge

    原题 点此链接1 解题思路 参考课本 xff1a 高等教育出版社 陈越主编 数据结构 参考视频 xff1a MOOC 浙江大学 数据结构与算法 本题主要考察的是简单插入排序 xff08 课本P268 xff09 以及归并排序的非递归算法 x
  • 数据结构 _ 基础练习 _ 7-14 Insertion or Heap Sort

    原题 点此链接1 题目分析 与前一题 Insert or Merge 相同2 xff0c 同样考察的是插入排序算法以及堆排序算法 算法如下 xff1a 首先需要判断是插入排序还是堆排序 xff0c 由于插入必然是 有序序列 43 相同的序列
  • Matlab v_findpeaks代码

    这里写自定义目录标题 Matlab v findpeaks代码写在前面代码 Matlab v findpeaks代码 写在前面 本函数主要用于寻找数据的上下极值点 xff0c 可以用于求取包络 参考链接 xff1a http www ee
  • Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码

    推荐一款全平台广告聚合SDK ADEasy https blog csdn net u013640004 article details 105416193 对于这套方法我已经封装成库 xff0c 可以直接下载使用 MP4Info1 0 2
  • 如何实现PCB走线开窗上锡

    特别说明 xff1a 电路中需要驱动8路继电器 xff0c 当多路继电器闭合导通时电流大增 xff0c 为保证实际效果 xff0c 在加宽电流线的同时 xff0c 希望去掉电流线上的阻焊层 绿油层 xff0c 板子做出来以后 xff0c 就
  • sqlite3无法使用方向键解决方法

    Question xff1a sqlite3打开数据库后无法使用方向键 xff0c 没有命令回滚功能 Answer xff1a 缺少插件形成 xff0c 解决办法是安装libreadline dev sudo apt get install
  • 关于笔记本linux亮度调节

    Laptop安装linux 系统后 xff0c 开机默认亮度是最大 xff0c 每次开机都很刺眼 xff0c 开机后调节好亮度后 xff0c 重启又恢复了 现在介绍可以永久设置屏幕亮度的方法 xff0c 这样就不用每次开机都设置亮度那么麻烦
  • LINUX下挂载exfat格式u盘或移动硬盘

    我的u盘本来是ntfs格式的 xff0c 本来在linux系统下可以读 xff0c 但由于我双系统 xff0c u盘经常在windows和linux中插来插去 xff0c 后来经常导致u盘在linux中无法挂载 xff0c 提示说未知文件系
  • C语言 消息队列

    消息队列 xff08 也叫做报文队列 xff09 能够克服早期unix通信机制的一些缺点 作为早期unix通信机制之一的信号能够传送的信息量有限 xff0c 后来虽然POSIX 1003 1b在信号的实时性方面作了拓广 xff0c 使得信号
  • Norder软件[FDS和fstorage]

    FDS和fstorage 本文摘录于 xff1a https www cnblogs com iini p 9338169 html只是做学习备份之用 xff0c 绝无抄袭之意 xff0c 有疑惑请联系本人 xff01 这里摘抄重点 根据有
  • C语言 select函数使用

    在编程的过程中 xff0c 经常会遇到许多阻塞的函数 xff0c 好像read和网络编程时使用的recv recvfrom函数都是阻塞的函数 xff0c 当函数不能成功执行的时候 xff0c 程序就会一直阻塞在这里 xff0c 无法执行下面
  • linux 开机grub rescue修复

    安装linux系统后 系统的引导就会变成grub引导 假如对硬盘进行分区管理或一些其它操作后 开机进不去grub引导 界面显示黑屏 然后显示grub rescue gt 的字样时 就需要自己手动修复grub了 1 使用ls命令 ls执行命令
  • Qt5编译时出现<QtGui/QApplication> ---> No such file or directory错误解决办法

    Qt5的更新把目录结构都改变了 然后一些类也去掉了功能 本来我在qt4上写的程序放到qt5编译 马上弹出 lt QtGui QApplication gt gt No such file or directory错误 解决办法 安装libq
  • Qt for iOS,Qt 与Objective C混合编程

    因为我写了一系列Qt的博文以及一本书 Qt on Android核心编程 xff0c 最近有好几个使用Qt的朋友问起 Qt for iOS 的事情 xff0c 因为我在这方面的经验特别少 xff0c 写不出系统的文章来 xff0c 非常抱歉
  • HTML5 section、article和div区别

    在HTML5中 xff0c 规定开发过程中更加注重语义化和代码的结构标准 当中section article和div是非常相似的东西 xff0c 许多人无法区分它们 当初我对于这三个标签也很迷茫 xff0c 觉得都没什么区别 xff0c 用

随机推荐

  • Django安装

    操作系统 xff1a deepin15 1 检查python是否已安装 xff0c 运行命令 python如出现以下信息则python可用 Python 2 7 11 default Dec 9 2015 00 29 25 GCC 5 3
  • libcurl实现http交互

    原因 xff1a 由于涉及到使用libcurl进行http交互 xff0c 故在此进行记录调用流程 概况 xff1a 利用curl模块实现http请求 http介绍 xff1a xff08 hyperText Transfer Protoc
  • linux内核分析-简单的操作系统内核源码解读

    Linux内核分析 MOOC课程http mooc study 163 com course USTC 1000029000 学习笔记 源码组成 xff1a mypcb h mymain c myinterrupt c mypcb h sp
  • GCC 编译过程/编译命令详解/静态库与动态链接库/ error:undefined reference to

    GCC编译 xff1a 预处理 gt 编译 gt 连接 gt 加载 预处理 xff1a 处理程序中 开头的内容编译 xff1a 程序构建过程 xff0c 生成 o文件 xff0c gcc 依赖顺序问题 xff08 从后向前 xff09 xf
  • makefile 语法 /usr/bin/ld: cannot find -lxxxx

    GCC编译错误 1 usr bin ld tmp ccd UkmoA o undefined reference to symbol ERR free strings 64 OPENSSL 1 0 0 lib i386 linux gnu
  • AD10 PCB文件统一设置字体大小(默认字体大小)

    这个网上给我的提示 xff08 http zhidao baidu com link url 61 UNxy0GoaU7jj0QRgCikKIdHIrE7C FOiojG 5nE6a QBqXVuYdublOROizQyNRtfNudH53
  • Cocos2d-x初入学堂(13)-->Tiled Map Editor地图编辑器

    欢迎转载 xff01 转载时请注明出处 xff1a http blog csdn net aa4790139 article details 8135831 我开发的游戏只有第一款游戏 xff0c 没有用到地图编辑器 xff0c 那是我刚进
  • Linux 常用命令脚本源码查看方法总结

    Linux 常用命令脚本源码查看方法总结 下载相关软件包 以32位Ubuntu14 04下 xff0c 获取ls命令的源码为例 xff0c 能够使用例如以下的方法下载源码 xff1a 1 xff09 使用which命令查看ls命令的位置 x
  • 进程和线程的区别与联系

    1 共同点 功能上都是用于实现多任务并发程序设计的技术手段 xff0c 线程的状态包括就绪 执行与阻塞 xff0c 与进程类似 从系统实现的角度看 xff0c 进程实体和线程实体在Linux内核中都是有task struct实现的 xff0
  • AD9的pcb 里面怎样才能从TOP层视图换成从BOTTOM层网上面看,相当于把板子翻过来看

    AD9中更改PCB的视角 切换到3D xff08 view gt switch To 3D xff09 视图 xff0c 然后点击 view gt Orthogonal Rotation 然后在切换到2D视图 xff08 view gt s
  • opencv中三种像素访问方式的运行速度比较

    本文目的 xff1a 在opencv中有三种方式可以读写图像的像素 xff0c 分别为 xff1a 指针读写 迭代器读写 动态地址计算读写 虽然三种方式都可以完成同样的目的 xff0c 但是运行速度却有快有慢 xff0c 尤其是在实现一些复
  • 如何确认系统是采用大端还是小端

    如何确认系统是采用大端还是小端 1 大小端 大端 xff08 存储 xff09 模式 xff1a 是指一个数据的低位字节序的内容放在高地址处 xff0c 高位字节序存的内容放在低地址处 如 xff1a 一个数0x12345678存放在一个4
  • C++ Primer Plus 第六版 所有章节课后编程练习答案

    我的独立博客地址 xff1a www blog4jimmy com xff0c 欢迎大家关注 下面的是C 43 43 Primer Plus 第六版所有章节的课后编程练习的答案 xff0c 都是博主自己写的 xff0c 有不对的地方请大家留
  • 串口发送大数组

    用stm32f4XX发送采集到的数据时 xff0c 如果数据量特别大 xff0c 直接发送一个大数组可能比较占内存 这时候 xff0c 可以逐个发送数据 最好将大数组定义为全局变量 定义在函数内时 xff0c 可能导致栈不够深而报错 其模式
  • IP数据包校验过程

    1 算法思路 xff1a IP ICMP IGMP TCP UDP等协议的校验和算法都是相同的 xff0c 算法如下 xff1a 在发送数据时 xff0c 为了计算IP数据包的校验和 应该按如下步骤 xff1a xff08 1 xff09
  • CMake 和makefile

    1 gcc 它是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器 xff0c 它可以编译很多种编程语言 xff08 括C C 43 43 Objective C
  • ROS CMakeLists中target_link_libraries相对路径设置

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 26 CMakeLists setting relative path 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波
  • AD10 复制问题(复制方法和智能粘贴 拼版)

    ad10PCB复制不成功 频繁的遇到过在PCB界面复制不成功的情况 xff0c 今天终于搞明白了是什么原因造成的 当我们选中元件的时候 xff0c 鼠标箭头就会有一个十字架的形状 xff0c 这时候直接按下CTRL 43 C然后再在其他的地
  • Postman中文版,竟如此简单,秒变中文

    好多小伙伴 xff0c 尤其是刚入门软件测试的 xff0c 对英文版本的Postman很抵触 xff0c 希望有个中文版的 xff0c 不过很遗憾的是Postman只有英文版本 xff0c 但凡事都有例外 xff0c 某天在逛github的
  • Http协议报文格式

    一 整体介绍 Http协议在传输层基于TCP协议 xff0c 在Http1 1之前每次请求在TCP层都需进行一轮连接和释放 xff08 三次握手 四次握手 xff09 xff0c 从Http1 1开始默认使用长连接 Http报文分为两种 x