HTTP 报文

HTTP 报文分为请求报文与响应报文。

当客户端发出一个请求,服务器就会做出响应,返回一个响应报文。无论是请求报文还是响应报文都是由三部分组成:Line ,header,body。

请求报文

格式

<Request Method>空格<Request URL>空格<Http版本号>
<Key>:<Value>
<Key>:<Value>
不可缺少的空行
<Entity Body>

请求行(request line)

请求行是由三部分组成:

  • 请求方法:比如GET或者POST,表示对资源的操作
  • 请求目标:是一个URI,请求方法要操作资源的位置
  • 版本号:即HTTP 协议版本 三部分以空格SP来分隔,最后以CRLF结束。 比如:POST /yif.com HTTP/1.1
  • POST:表示请求方法,对资源的操作
  • yif.com:请求资源的web地址
  • HTTP 1.1:HTTP 版本号

请求头

请求头是由键值对组成,key与value之间以":"进行分隔,最后以CRLF表示结束,比如Content-Length:56,这里的Content-Length表示key,value是56。 HTTP头部字段使用非常灵活,我们可以使用已有的头部,还可以自定义头部。但是再使用头部字段需要注意以下几点:

  • 字段名不区分大小写:比如Host,也可以写为host,一样被服务器识别;
  • 字段之间不允许出现空格,可以使用连接符"-",但不能使用下划线"_",比如"ztz-yif"合法,但是"ztz_yif"不合法;
  • 字段后面必须紧跟":",不能有空格,但是冒号前面字段可以有多个空格;
  • 字段可以使用任意的顺序;
  • 字段原则不难重复,除非字段语义运行,比如Set-Cookie;

请求数据

又称为请求体,与请求正文。

响应报文

格式

<Http Version>空格<Status Code>空格<Reason Phrase>
<Key>:<Value>
<Key>:<Value>
不可缺少的空行
<Entity Body>

状态行(status line)

称为服务器响应的状态。用户返回客户端对服务器请求的结果。 状态行也是三部分组成:

  • 版本号:表示HTTP 协议版本号;
  • 状态码:三位数字,比如404:客户端请求资源不存在,也就是客户端出错;
  • 原因短语:对前面状态码的补充,方便理解;

消息报头

格式与意义与请求报文一一致。比如:Header有的只能用在响应报文中,有的只能用在请求报文中,有的两者皆可用。

响应正文

又称之为响应体,就是客户端请求服务器返回的结果内容,可以是文本、音频、视频等等。

HTTP 首部

首都字段有 4 种类型:分为通用首部字段、请求首部字段、响应首部字段和实体首部字段。

  • 通用首部字段:请求报文与响应报文都会使用的首部;
  • 请求首部字段:从客户端向服务器发送报文使用的首部。补充请求的附加信息,客户端信息,响应内容等相关优先级信息;
  • 响应首部字段:从服务器向客户端返回响应报文的首部,补充了响应的附加内容,也会要求客户端附加额外信息;
  • 实体首部字段:针对请求报文与响应报文实体使用的首部。补充了资源内容更新时间与实体信息;

HTTP首部字段将定义成缓存代理与非缓存代理,分为两种类型:

  • 端到端首部:分在此类别的首部会转发请求/响应对应的最终目标,且必须保存在由缓存生成的响应中,另外规定它必须转发
  • 逐跳首部:分在此类别的首部只对单次有效,会应通过缓存或代理不再转发。HTTP 1.1及之后版本,如果使用hop-by-hop字段,则需要connection首部字段。 逐跳首部字段有: 1.connection 2.keep-alive 3,proxy-authenticate 4.proxy-authorization 5.tralier 6.TE 7.transfer-encoding 8.upgrade Transfer-Encoding: chunked表示,意思是报文里的 body 部分不是一次性发过来的,而是分成了许多的块(chunk)逐个发送。 分块传输也可以用于“流式数据”,例如由数据库动态生成的表单页面,这种情况下 body 数据的长度是未知的,无法在头字段"Content-Length"里给出确切的长度,所以也只能用 chunked 方式分块发送。 "Transfer-Encoding: chunked"和"Content-Length"这两个字段是互斥的,也就是说响应报文里这两个字段不能同时出现,一个响应报文的传输要么是长度已知,要么是长度未知。

通用首部字段

字段名

说明

Cache-Control

控制缓存行为

Connection

控制不再转发给代理的首部字段、管理持久连接

Date

创建报文的日期时间

Pragma

用于包含实现特定的指令

Trailer

报文末端首部一览

Transfer-Encoding

指定报文传输的编码格式

Upgrade

升级HTTP协议

Via

代理服务器相关信息

Warning

错误通知

请求首部字段

Accept:用户代理可处理的媒体类Accept:用户代理可处理的媒体类A型

  • 文本文件:text/html、text\plain、text\css等 = 图片文件:image/jped、image/png,image/gif
  • 视频文件:video/mpeg、video/quicktime
  • 应用程序使用的二进制文件:application/zip

比如:Accept:text/html、application/xml;q=0.8 在媒体类型后用分号隔开,使用q来表示权重,优先级,没有指定q即为1.0,优先级最高,范围是0-1可以精确到小数后3位。

if-xxx的请求字段,都可以成为条件请求,服务器接收到请求后,只有判断条件为真才会执行。 比如:

  • if-match:"123456" 会告知服务器需要匹配资源所用的实体字段值(ETag),只有if-match与资源的ETag值一致,才会执行请求,而if-none-match相反,不一致才会执行请求。
  • if-modified-since:指定日期后,资源更新,服务器才会接收请求,否则无法接收请求。
  • if-unmodified-since相反,指定日期后,资源更新就无法接收请求
  • if-range :if-range字段值与etag值或者更新日期时间匹配一直,就做范围请求,否则返回全体资源

User Agent:用户代理,作为访问者来代理发起请求,即Http协议里的请求方客户端。 通常浏览器在发送请求时都会带着"Accept-Encoding"头字段,里面是浏览器支持的压缩格式列表,例如 gzip、deflate、br 等,这样服务器就可以从中选择一种压缩算法,放进"Content-Encoding"响应头里,再把原数据压缩后发给浏览器。

通过Range来获取范围请求,并指定资源byte的范围 比如:

5001-10000字节
Range:bytes=50001-10000
5000后的全部
Range: bytes = 5000-
1300-4000,5000-10001两个范围
Range: bytes = 1300-4000,5000-10001 
Range: bytes = -500;获取最后500个字节
Range:bytes = 0-0,-1;仅要第一个与最后一个字节

Range 条件请求:指的是如果客户端已经得到这部分响应,想要该响应未过期前,获取其他部分响应,常与If-Unmodified-Since或者If-Match头部共同使用。 比如:断点续传中,使用到条件请求,来查看服务器是否修改资源,资源是否过期;服务器资源是否在两次下载之间发生改变,如果发生了变化。通过412状态码知道发生变换,得重新获取响应。

字段名

说明

Accept

客户端可以接受的媒体类型

Accept-Charset

客户端可以接受的字符编码集

Accept-Encoding

浏览器支持服务器返回的压缩格式列表

Accept-Language

浏览器可以支持的语言

Authorization

Web认证信息

Expect

请求服务器的特定行为

From

发出请求的用户邮箱地址

Host

请求资源所在的服务器地址

If-Match

只有请求内容与实体一样才有效

If-Modified-Since

如果请求的内容在指定时间之后被修改则请求成功,未被修改返回304状态码

If-None-Match

请求内容与资源ETag值不一致,相反则请求成功

If-Range

如果实体未改变,发送客户端没有的部分,否则发送整个实体

If-Unmodified-Since

只有在指定时间后未被修改才请求成功

Max-Forwards

限制信息通过代理与网关的时间

Proxy-Authorization

代理服务器要求客户端的认证信息

Range

实体字节的范围请求

Referer

浏览器对来自某一页面的内容中自动添加头部

TE

传输编码的优先级

User-Agent

Http 客户端的信息

响应首部字段

  • Age:告知客户端,源服务器在多久前创建了响应,单位是秒。自源服务器发出响应(或者验证过期缓存),到使用缓存响应发出时经过的秒数。
  • ETag:告知客户端资源实体标识,可将资源以字符串的形式做唯一标识的方式。 当资源更新时,ETag也会更新。资源被缓存时,就会分配唯一的标识,比如中文版浏览器访问谷歌就会返回中文版搜索资源,英文就返回英文搜索资源。并且ETag有强弱之分,强无论实体发生多么细微的改变,都会改变其值,而弱,只有实体发生根本的改变,才会改变其值,这时会在字段开始位置加W/。
  • Server字段是响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号。用于帮助客户端定位问题和统计数据。 Server 字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用 bug 攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息。比如 GitHub,它的 Server 字段里就看不出是使用了 Apache 还是 Nginx,只是显示为“GitHub.com”。

字段名

说明

Accept-Ranges

是否接受字节范围请求

Age

自源服务器发出响应(或者验证过期缓存),到使用缓存响应发出时经过的秒数

ETag

资源的匹配信息

Location

令客户端重定向至指定 URI

Proxy-Authenticate

代理服务器对客户端的认证信息

Retry-After

对再次发起请求的时机要求

Server

向客户端提供 Web 服务的软件名称和版本号,用于帮助客户端定位问题和统计数据

Vary

代理服务器缓存的管理信息

WWW-Authenticate

服务器对客户端认证信息

实体首部字段

字段名

说明

Allow

对某网络资源的有效的请求行为,不允许则返回405

Content-Encoding

服务器支持返回的压缩编码格式

Content-Language

实体主体语言

Content-Length

实体主体大小

Content-Location

请求资源可以替代的备用另一个地址

Content-MD5

返回资源MD5校验值

Content-Range

实体主体位置范围

Content-Type

实体主体过期类型

Expires

实体主体过期时间

Last-Modified

资源最后修改的时间

状态码

http 状态码分为五类。

  • 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
  • 2××:请求成功,报文已经收到并被正确处理;
  • 3××:资源重定向,它的位置发生变动,需要客户端重新发送请求;
  • 4××:客户端错误,请求报文有误,服务器无法处理;
  • 5××:服务器错误,服务器在处理请求时内部发生了错误;

100-199 信息性状态码

  • 100:HTTP 1.1新增,服务器告诉客户端收到了请求,请客户端继续。常用于上传大文件前使用;
  • 101:协议升级,服务器告知客户端,其(服务端)正将协议切换为请求头Update指定的协议;

200-299 成功状态码

  • 200:客户端请求成功;
  • 201:有新资源在服务器被创建;
  • 204:该状态码表示服务器已经接收到请求,但返回的响应报文不含实体主体部分,当浏览器发出请求后,返回204,表示浏览器显示的页面不发生更新;
  • 206:是 HTTP 分块下载或断点续传的基础,在客户端发送范围请求、要求获取资源的部分数据时出现,body 里的数据不是资源的全部,而是其中的一部分。并且通常还会伴随着头字段Content-Range,表示响应报文里 body 数据的具体范围,供客户端确认,比如:Content-Range: bytes 0-200/1000,表示此次获取的是总计 1000 个字节的前 200 个字节。

300-399 重定向状态码

  • 301:永久重定向,请求资源资源不存在,需要修改为新的URI才能访问;
  • 302:临时重定向,请求资源还存在,但需要临时使用另一个URI来访问;
  • 304:常用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,重定向已到缓存的文件,也就是缓存重定向。当客户端拥有可能过期的缓存,会携带etag,时间等信息询问服务器缓存是否可用,304是告诉客户端可以复用缓存;
  • 307:重定向请求必须使用原请求方法和包体发起访问;

400-499 客户端错误状态码

常见的:

  • 400 :请求报文中存在语法错误;
  • 401 :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败;
  • 403 Forbidden :请求被拒绝。如果想看说明,可以在实体主体部分对原因进行说明,用户就可以看到;
  • 404 Not Found:表示服务器上,无法找到请求的资源,也可以用来服务器拒绝请求,且不想说明理由时使用;

不常见的:

  • 405 Method Not Allowed:不允许使用某些方法操作资源,例如不允许 POST 只能 GET;
  • 406 Not Acceptable:资源无法满足客户端请求的条件,例如请求中文但只有英文;
  • 408 Request Timeout:请求超时,服务器等待了过长的时间;
  • 409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;
  • 412:在 HTTP 协议中,响应状态码 412 Precondition Failed(先决条件失败)表示客户端错误,意味着对于目标资源的访问请求被拒绝。这通常发生于采用除 GET 和 HEAD 之外的方法进行条件请求时,由首部字段 If-Unmodified-Since 或 If-None-Match 规定的先决条件不成立的情况下;
  • 413 Request Entity Too Large:请求报文里的 body 太大;
  • 414 Request-URI Too Long:请求行里的 URI 太大;
  • 416 Range Not Satisfiable :无法提供range请求中指定的那段包体;
  • 417 Expection Failed:对于Except请求头部期待的情况无法满足时的响应码;
  • 418 茶壶,触发网页反爬会返回这个状态码;
  • 426 Upgrade Required:服务器拒绝基于当前协议提供服务,通过Upgrade头部告知客户端必须升级协议才能继续处理;
  • 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;往往会发送503状态码;
  • 431 Request Header Fields Too Large:请求头某个字段或总体太大;
  • 451 Unavailable For Legal Resons:由于法律原因资源不可访问;

500-599 服务器错误状态码

  • 500 Internal Server Error :服务器正在执行请求时发生错误。有可能是web应用存在bug或某些临时性故障;
  • 501:客户端请求功能还不支持;
  • 502 Bad Gateway:服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的;
  • 503 Service Unavailable:表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码 503; 503 是一个临时的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以 503 响应报文里通常还会有一个Retry-After字段,指示客户端可以在多久以后再次尝试发送请求。
  • 504:代理服务器无法及时的从上游获取响应;
  • 505:请求使用的Http版本协议不支持;
  • 507:服务器没有足够的空间处理请求;
  • 511:代理服务器发现客户端需要进行身份验证才能获取网络访问权限;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTP 请求方法

    Http的请求方法代表了客户端想对服务器进行的操作,比如:POST、GET、HEAD、PUT、DELETE、TRACE、OPTIONS。 常用的不过于CRUD...

    Yif
  • UI 刷新

    与屏幕刷新相关的有很多,比如刷新流程,屏幕缓存,周期刷新,vsync信号,SurfaceFlinger。

    Yif
  • Groovy高级用法

    在根工程下自定义config.gradle可以直接在根project引用apply from:'config.gradle' 如果需要在app project...

    Yif
  • 编程体系结构(07):JavaEE之Web开发

    客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软件更新时需要同时更新客户端和服务器端,整体模式相比BS架构要复杂,...

    知了一笑
  • HTTP协议入门

    HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。

    帅地
  • 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。

    用户1263954
  • HTTP 协议入门

    HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

    javascript.shop
  • 浅析http报文

    在上述过程中第三步浏览器给服务器发送的是http请求报文,第五步服务器将资源发送给浏览器的过程中发送的是http响应报文。

    你的益达
  • ES对磁盘的要求都有哪些,大部分你可能不知道

    有一个问题被关注的比较少,就是ES对本地磁盘的占用情况。有人可能觉得这个问题的答案显而易见,不就是ES软件本身占用的空间,还有索引数据持久化占用的磁盘空间,另外...

    用户7634691
  • 浏览器工作原理

    我们在浏览器输入网址,其实就是要向服务器请求我们想要的页面内容,所有浏览器首先要确认的是域名所对应的服务器在哪里。将域名解析成对应的服务器IP地址这项工作,是由...

    千往

扫码关注云+社区

领取腾讯云代金券