精华内容
下载资源
问答
  • 2022-01-02 02:09:34

    一 HTTP请求报文
    例如

    GET /somedir/page.html HTTP/1.1
    Host: www.soneschool.edu
    Connection: close
    User-agent: Mozilla/5.0
    Accept-language:fr

    HTTP请求报文的第一行为请求行,其后继的行叫作首部行
    1 请求行
    请求行有3个字段:方法字段,URL字段和HTTP版本字段
    1)方法字段可以取几种不同的值包括GET POST PUT HEAD DELETE,绝大多数HTTP请求报文使用的是GET方法,例子中使用的是GET方法
    2)URL字段带有请求对象的标识,例子中访问的对象是/somedir/page.html HTML文本文件
    3)HTTP字段是自解释的;在例子中浏览器实现的是HTTP/1.1版本

    2 首部行
    1)Host: www.soneschool.edu指明了对象所在的主机名
    2)Connection:close首部行让该浏览器告诉服务器不要麻烦的使用持续连接,它要求服务器发送完被请求的对象后就关闭这条连接。
    3)User-agent首部行用来指明用户代理,即向服务器发送请求浏览器的类型
    4)Accept-language 首部行表示该浏览器想要获得的对象的语言版本

    3 请求报文格式
    在这里插入图片描述

    二 HTT响应报文
    例如

    HTTP/1.1 200 OK
    Connection: close
    Date:Tue, 18 Aug 2015 15:44:04 GMT
    Server:Apache/2.2.3(CentOS)
    Last-Modified:Tue, 18 Aug 2015 15:11:03 GMT
    Content-Length:6821
    Content-Type:text/html

    (date date date date date)

    HTTP响应报文有三个部分 一个初始状态行,6个首部行,然后是实体行

    1状态行
    状态行有三个字段
    1)协议版本字段
    2)状态码字段
    3)状态码描述字段

    常见的状态码和相关的短语:
    202 OK 请求成功
    301 Moved Permanently
    400 Bad Request
    404 Not Found
    505 HTTP Version Not Support

    2首部行
    1)Connection:close 首部行告诉客服发送完报文后将关闭该TCP连接
    2)Date:首部行指示服务器产生并发送该响应报文的日期和时间
    3)Server:首部行指示该响应报文由一台Apache服务器产生的
    4)Last-Modified:首部行指示了响应报文中的对象创建或最后修改的日期和时间
    5) Content-Length:首部行指示了被发送对象的字节数
    6) Content-Type:首部行指示了实体体中的对象是HTML文本

    3HTTP响应报文格式
    在这里插入图片描述

    更多相关内容
  • HTTP报文格式

    2021-07-10 08:41:05
    在前面的文章中我们提到,HTTP报文格式有两种类型,分别为请求报文和响应报文。 请求报文是客户端发送给服务器端的,而响应报文是服务器端发送给客户端的。本篇内容就是介绍一下这两类报文的格式。 二、HTTP请求报文...

    一、HTTP报文类型

    在前面的文章中我们提到,HTTP报文格式有两种类型,分别为请求报文和响应报文。
    请求报文是客户端发送给服务器端的,而响应报文是服务器端发送给客户端的。本篇内容就是介绍一下这两类报文的格式。

    二、HTTP请求报文

    1、请求报文格式

    请看下面例子:
    在这里插入图片描述

    上图所示的例子中共有5行。
    第一行称之为请求行;
    第二行到第五行是头部行,在头部行给出若干和请求相关的信息。
    例如第二行Host给出资源在哪个主机上面;
    第三行给出客户端软件的类型,
    第四行表示不使用持久连接;
    第五行给出所接收语言的类型。
    注:详细的头部行字段类型在RFC文档中都有。
    在头部行下面需要有一个额外的回车换行来表示结束。若没有回车换行,则解析报文时会出错。
    通过例子可以看到请求报文一般格式如下图:
    在这里插入图片描述
    由如下几部分构成:
    (1)请求行:方法+空格+URI+空格+版本
    URI:对资源的标识符
    版本:HTTP的版本号。
    (2)首部行:首部字段名+空格+值
    (3)空行。
    (4)HTTP报文的实体。实体前面的东西即请求行、首部行和空行是脑袋,它所起的作用是控制。要传输的东西是放在主体中。这也是很多协议所采用的结构方式。

    2、请求方法类型

    如下图所示:
    在这里插入图片描述
    在版本HTTP/1.0中有三个重要的请求方法类型。
    (1)GET:客户端向服务器端请求资源
    (2)POST:把客户端的信息传送给服务器端
    (3)HEAD:服务器收到请求时,用HTTP报文进行响应,但不返回请求对象,主要用在通信的控制操作领域。
    在版本HTTP/1.1中除了上述三个还增加了PUT和DELETE方法。
    (4)PUT:文件在实体主体中被上载到URL字段指定的路径。
    (5)DELETE:删除URL字段指定的文件。
    注:向服务器传送信息POST并不是唯一的方法,在当今应用中使用GET方法向服务器中传送数据是更常用的方法。因为可以把要传送的数据以参数的方式写在URL里,使用GET传送过去,这时服务器可以直接在URL里将相关参数提取出来,实现了和POST类同的方法。但是当传送大量数据时还是需要POST方法。例如上传表单时各字段输入值:
    在这里插入图片描述
    后面有个问号,问号表示后面这几个是参数字段。monkey和banana是animalsearch程序的参数。当参数不多时,这种方法可以将参数上传给服务器同时加快了处理的速度。

    三、HTTP响应报文

    1、响应报文格式

    在这里插入图片描述
    如上图所示,
    (1)状态行:包括版本、状态码和短语。
    (2)首部行:包含了重要的控制信息,依次为:
    不使用持久连接;
    data后面是时间;
    服务器的类型或者是Web服务器的版本;
    对象最近一次被修改的时间;
    对象的长度;
    对象的类型;
    (3)回车换行;
    (4)真正的数据。

    2、响应报文的状态码

    状态码是非常有用的一种参数,它向客户端传递了响应刚才HTTP请求报文的一些控制信息。最常用的是200 OK;200是状态码,表示请求成功。短语可以自己设置。上面例子中使用的状态码也是200 OK。
    常用的状态码有:
    (1)200 OK:请求成功,所请求信息在响应消息中返回;
    (2)301 Moved Permanently:所请求的对象已永久迁移,新的URL在本响应消息的头部指出;
    (3)400 Bad Request:该请求不能被服务器解读;
    (4)404 Not Found:服务器上不存在所请求文档;
    (5)500 Internal Server Error:服务器内部错误。

    展开全文
  • HTTP报文格式详解

    千次阅读 2021-10-18 21:53:37
    HTTP报文格式

    HTTP报文格式

    HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,每个字段的长度是不确定的。HTTP报文传过来的都是一堆的0x ASCII码,例如" 41 63 63 65 70 74"这段十六进制ASCII码串对应的是“accept” 单词。

    这些十六进制的数字经过浏览器或者专用工具比如wireshark或fiddler的翻译,可以得到HTTP的报文结构。

    HTTP有两种报文:请求报文和响应报文。

    请求报文

    以下是通过抓包工具fiddler抓出来的一段HTTP请求报文

    GET http://jsuacm.cn/ HTTP/1.1
    Host: jsuacm.cn
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    
    //”请求数据”(GET方式的请求一般不包含)
    

    可见HTTP的请求报文由四部分组成:请求行(request line)、请求头部(header)、空行和请求数据(request data)

    在这里插入图片描述

    请求行

    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如:GET http://jsuacm.cn/template/jsu/css/modifypage-1.css HTTP/1.1

    1,请求方法
    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。GET和POST是最常用的请求方法。

    GET:最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
    GET方式的请求一般不包含”请求数据”部分,请求数据以地址的形式表现在请求行。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。

    POST:和get一样很常见,对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。

    HEAD: 本质和get一样,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

    其他的请求方法并没有那么常见:
    PUT:和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,可用于替换资源,要求客户端事先知道该位置。

    DELETE:请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。

    CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。

    OPTIONS:获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。

    TRACE:回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。

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

    在这里插入图片描述
    3,HTTP协议版本

    协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1,现在最常用的是1.1

    HTTP 1.0和HTTP 1.1的主要区别是什么?

    1. 长连接 : 在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。
    2. 带宽优化及网络连接的使用 : HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
    3. Host域:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
    4. 错误状态响应码 : 在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
    5. 缓存处理 : 在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

    HTTP2.0的优化

    1. 新的二进制格式:HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
    2. 多路复用:在同一个TCP连接中,同一时刻可以发送多个请求和响应,下一次的请求不需要等待上一个响应来之后再发送。但响应的顺序是不变的,FIFO(先进先出)。2.0之前是同一个连接只能用一次, 如果开启了keep-alive,虽然可以用多次,但是同一时刻只能有一个HTTP请求。
      HTTP2.0的多路复用主要是指:因为http2.0的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。
    3. header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用HPACK算法对header的数据进行压缩,避免了重复header的传输,又减小了需要传输数据的大小,基本原理是客户端和服务端分别缓存一份索引表,如果头部存在于索引表,则用对应的索引值;否则进行霍夫曼编码,并加入索引表。参考
    4. 服务器推送, 当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

    请求头部

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

    空行

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

    请求数据

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

    响应报文

    以下是通过抓包工具fiddler抓出来的一段HTTP响应报文

    HTTP/1.1 200 OK
    Server: nginx/1.18.0 (Ubuntu)
    Date: Wed, 20 Oct 2021 06:46:15 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate
    Pragma: no-cache
    Content-Length: 737265
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    	<meta name="viewport" content="width=device-width, initial-scale=1">
    	<meta name="description" content="">
    	<meta name="author" content="">
    	<link rel="icon" href="../../favicon.ico">
    
    	<title>
    		吉首大学	</title>
    
    

    HTTP响应报文由状态行(status line)、响应头部(headers)、空行(blank line)和响应数据(也叫响应体或响应正文)(response body)4个部分组成。
    在这里插入图片描述

    状态行

    状态行由3部分组成,分别为:协议版本、状态码、状态码描述。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。

    HTTP状态码
    在这里插入图片描述

    响应头部

    常见响应头部及描述如下:
    在这里插入图片描述

    空行

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

    响应体

    用于存放需要返回给客户端的数据信息。fiddler抓出来的一段HTTP响应数据是一段HTML。

    展开全文
  • http 报文格式、状态码

    千次阅读 2022-02-03 16:30:53
    HTTP 报文格式 HTTP 报文由请求行、首部、实体组成,首部和实体之间由 CRLF(回车换行符) 分隔开。 请求报文格式: <method> <request-URL> <version> <headers> <entity-body> ...

    HTTP 报文格式
    HTTP 报文由请求行、首部、实体组成,首部和实体之间由 CRLF(回车换行符) 分隔开。
    在这里插入图片描述

    请求报文格式:

    <method> <request-URL> <version>
    <headers>
    <entity-body>
    
    • 请求方法、请求 URL、协议版本
    GET /2.app.js HTTP/1.1
    Host: 118.190.217.8:3389
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
    Accept: *\/*
    Referer: http://118.190.217.8:3389/
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    
    

    响应报文格式:

    <version> <status> <reason-phrase>
    <headers>
    <entity-body>
    
    • 协议版本、状态码、原因短语(如200跟上OK)
    HTTP/1.1 200 OK
    X-Powered-By: Express
    Accept-Ranges: bytes
    Cache-Control: public, max-age=0
    Last-Modified: Sat, 07 Mar 2020 03:52:30 GMT
    ETag: W/"253e-170b31f7de7"
    Content-Type: application/javascript; charset=UTF-8
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Date: Fri, 15 May 2020 05:38:05 GMT
    Connection: keep-alive
    Transfer-Encoding: chunked
    
    

    幂等和非幂等

    • 幂等:果一个请求不管执行多少次,其执行的副作用都是一样的,这个请求就是幂等的(如:get、head)
    • 非幂等:post(如相同url都是执行新增的操作)
    • POST和PUT很容易让人混淆,之前我总是简单的认为:POST表示创建资源,PUT表示更新资源;但是实际上它们都可用于创建和更新资源,只不过本质的差别就在于幂等性上。POST所对应的URI并非创建资源的本身,而是「资源的接收者」。例如:POST http://lindaidai.wang/articles的语义是在http://lindaidai.wang/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI,所以POST是「非幂等」的。
    • PUT方法所对应的URI是要创建或者更新「资源本身」。这点很容易让人误会它不是幂等的,但其实它是「幂等」的。例如:PUT http://lindaidai.wang/accout/321 的语义是创建或者更新ID为321的帖子。第一次PUT方法执行之后,其在服务器上生成的资源,不能被后续的PUT方法更改,所以对同一URI进行多次PUT的副作用和一次PUT是相同的,因而它是「幂等」的。

    请求方法

    • HEAD:只从服务器获取文档的头部不获取资源,幂等操作

    • PUT:PUT 方法的语义就是让服务器用请求的主体部分来创建一个由所请求的 URL 命名的新文档。 如果那个文档已存在,就覆盖它,幂等操作

    • PATCH:对资源进行局部更新,非幂等操作

    • POST:通常用来向服务器发送表单数据。创建或更新资源,非幂等操作

    • TRACE:客户端发起一个请求时,这个请求可能要穿过路由器、防火墙、代理、网关等。每个中间节点都可能会修改原始的 HTTP 请求,TRACE 方法允许客户端在最终发起请求时,看看它变成了什么样子。幂等操作

      • TRACE 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。 这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否被毁坏或修改过。

    在这里插入图片描述

    • OPTIONS: 预检测,请求 Web 服务器告知其支持的各种功能,(幂等操作)
      在这里插入图片描述

    • DELETE: 让服务器删除请求 URL 所指定的资源。幂等操作

    首部报文

    • 多个字段值用,号连接:Keep-Alive: timeout=15, max=100
    • 若是字段值有可选参数且是多个则用;号连接:Accept: text/html, q=1; application/xml, q=0.8
    • 当有多个字段值的时候,可以指定字段 q 来作为权重,权重范围 0~1。

    通用报文:

    • Connection:允许客户端和服务器指定与请求/响应连接有关的选项
    • Date:提供日期和时间标志,说明报文是什么时间创建的
    • MIME-version:给出了发送端使用的MIME版本
    • Trailer:如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合
    • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
    • Update:给出了发送端可能想要“升级”使用的新版本或协议
    • via:显示了报文经过的中间节点(代理、网关)

    请求报文:

    • client-IPR:提供了运行客户端的机器的IP地址
    • From:提供了客户端用户的E-mail地址
    • Host:给出了接收请求的服务器的主机名和端口号,使用场景:如果一台服务器托管了多个域名,因为它们部署在同一个服务器上,当使用DNS解析的时候会得到相同的IP地址,因此需要在HTTP请求时在Host首部内完整指定主机名或域名的URl
    • Accept:客户端或者代理能够处理的媒体类型
    • Accept-Encoding:优先可处理的编码格式
    • Accept-Language:优先可处理的自然语言
    • Accept-Charset:优先可以处理的字符集
    • Referer:告诉服务器该请求是从哪个URI上来的
    • User-Agent:将发起请求的应用程序名称告知服务器
    • Authorization:web的认证信息
    • lf-Match:值是资源的唯一标识,它的值和ETag一致时服务器才会处理该请求
    • lf-None-Match:与ETag字段配合达到协商缓存的作用,值是资源的唯一标识,它的值和ETag不一致时服务器才会处理该请求,值和ETag不一致时表明服务器的资源被改过了那么本地的缓存就需要更新服务器最新的资源
    • lf-Modified-Since:与Last-Modified字段配合达到协商缓存的作用,值是请求资源的过期时间,它的值和服务器资源的修改时间比较只有不一致时才会处理该请求
    • lf-Unmodified-Since:作用和If-Modified-Since相反
    • lf-Range:它告知服务器如果lf-Range的值(ETag或者时间)的值和服务器资源ETag或者时间一致则作为范围请求处理,也就是返回Range字段中的部分资源;否则就返回整个资源,如果没有指定If-Range而只指定了Range那么则需要进行两次处理
    • Range:获取资源的某个范围的部分用于断点续传,值为某个范围,例如:Range: bytes=5001-10000,响应报文状态行返回206状态码和Partial,响应头中HTTP/1.1 206 Partial Content,Content-Range: bytes 5001-10000/10000,若是无法处理则返回200 OK以及整个资源
    • UA-Color:提供了与客户端显示器的显示颜色有关的信息
    • UA-CPU:给出了客户端CPU的类型或制造商
    • UA-Disp:提供了与客户端显示器(屏幕)能力有关的信息
    • UA-OS:给出了运行在客户端机器上的操作系统名称及版本
    • UA-Pixels:提供了客户端显示器的像素信息

    响应报文:

    • Accept-Ranges:用来告知客户端服务器能否处理范围请求,值有两种:Accept-Ranges: bytes;Accept-Ranges: none
    • Age:告知客户端服务器在多久前创建了响应,若是创建该响应的是缓存服务器则表示缓存后的响应再次发起认证到认证完成的时间值,值的单位是秒:Age: 600
    • vary:代理服务器的缓存信息
    • Location:用于指定重定向之后的URI,—般配合3XX状态码告知客户端需要重定向到Location上
    • Server: 告知客户端当前服务器上安装的HTTP服务器应用程序的信息,server: nginx
    • ETag: 告知客户端资源的实体标识,也就是资源的唯一标识,配合If-None-Match做协商缓存用,强ETag值:无论资源发生了多么细微的改变ETag都会变ETag: “usagi-12234”,弱ETag值:只会用于提示资源是否发生改变,只有资源发生根本改变ETag才会变,若是发生了根本改变:ETag: W/“usagi-12234”

    实体首部报文:

    • Content-Type:实体媒体类型,实体媒体类型
    • Content-Range:针对范围请求,告诉客户端当前返回的是实体的哪个范围的部分,Content-Range: bytes 5001-10000/10000
    • Content-Length: 表明了实体主体部分的大小单位是字节,当使用了内容编码的时候,也就是Accept-Encoding: gzip,不能再使用Content-Length,Content-Length: 6000
    • Content-Encoding:实体的编码格式,配合Accept-Encoding
    • Content-Language:实体的自然语言,配合Accept-Language
    • Allow:告知客户端服务器能够支持的HTTP方法,Allow: GET, POST,HEAD,当服务端收到不支持的方法时会返回405 Method Not Allowed,并且会把所有支持的方法写入响应报文首部字段Allow中返回
    • Last-Modified:资源的最后修改时间,配合lf-Modified-Since失效协商缓存,Last-Modified: Wed, Nov 11 2020 08:00:00 GMT
    • Expires:强缓存的一种方式,设置资源缓存的失效日期,要从原始的源端再次获取此实体的日期和时间,Expires: Wed, Nov 11 2020 08:00:00 GMT
    • Last-Modified:这个实体最后一次被修改的日期和时间

    非标准首部字段

    • x-XSS-Protection:属于响应首部,针对跨站脚本攻击(XSS)的一种对策略
    • X-Frame-Options:属于响应首部,用于控制网站内容在其它Web网站的Frame标签内的显示问题。主要目的是为了防止点击挟持。
    • 协议中对X-前缀的废除:之前是用×-开头来区分是否是非标准的字段但是后来被废除了这个做法。但是对于已经存在的X-开头的字段来说就让它存在吧。
    • Cookie: 客户端传递给服务端的Cookie信息
    • Set-Cookie: 在响应报文首部设置要传递给客户端生成的Cookie信息

    范围请求

    • 接收方(请求):lf-Range和Range
      lf-Range: “usage-12234”
      Range: bytes=5001-10000
    • 发送方(响应):Accept-Ranges和Content-Range
      HTTP/1.1 206 Partial Content
      Accept-Ranges: bytes
      Content-Range: bytes 5001-10000/10000

    指定字符集

    • 接收方(请求): Accept-Chartset
    • 发送方(响应): Content-Type

    数据格式

    • 接收方(请求):Accept
    • 发送方(响应):Content-Type
    • 字段值:text: text/html, text/plain, text/css等,image: image/gif, image/jpeg, image/png 等audio/video: audio/mpeg, video/mp4等,application: application/json, application/javascript,application/pdf,application/octet-stream

    压缩方式

    • 接收方(请求):Accept-Encoding
    • 发送方(响应):Content-Encoding
    • 字段值:gzip:当今最流行的压缩格式,deflate:使用zlib的格式压缩,br:—种专门为HTTP发明的压缩算法,compress:实体采用Unix的文件压缩程序,identity:不对实体进行编码。当没有Content-Encoding首部的时候,就默认这种情况

    内容编码的具体过程主要是:

    • 服务器生成原始响应报文,其中有原始的Content-Type和Content-Length首部字段
    • 接着将原始的响应报文经过内容编码服务器创建编码后的报文。这个编码后的报文同样有Content-Type和Content-Length两个字段,只不过Content-Length是有可能变的,例如主体经过了压缩,那么它的值肯定就变小了。
    • 在编码后的报文中增加Content-Encoding首部,这样收到的应用程序就可以进行解码了。
    • 接收程序收到编码后的报文再进行解码,获得原始报文。

    传输编码

    • 在非长连接的情况下浏览器可以通过连接是否关闭来界定请求或者响应的边界;而对于建立了长连接的情况,也就是设置了Connection: keep-alive这个头部,浏览器没法判断这次的数据是否传输完了,这时候就得计算「实体的长度」,并通过头部告诉浏览器,也就是使用Content-Length这个首部字段。

    • Content-Length如果比实际的长度短,就会造成内容被截断,甚至会影响下一次的请求;如果比实际的长度长,则会造成pending,这个请求一直在等待中直到超时。

    • 因此Content-Length的计算显得尤为重要,它必须真实的反应实体长度。但又由于很多时候实体长度并没有那么容易获得,例如实体来自于网络文件,或者由动态语言生成。而这时候如果需要等待Content-Length的计算的话,无疑会影响到TTFB(Time To First Byte),也就是从客户端发出请求到收到响应的第一个字节所花费的时间。越短的TTFB则能让用户更早的看到页面内容,体验越好。

    • 所以这就是Transfer-Encoding: chunked产生的原因,它解决了:不依赖头部的长度信息,也能知道实体的边界。

    • 设置了此首部之后,表明这是一次分块传输,可以将报文实体改为用一系列分块来传输
      在这里插入图片描述在这里插入图片描述

    • 每个分块会有两部分内容:十六进制的长度和数据(例如a\r\n表示的就是长度为10,因为a是十六进制中的10;后面的0123456789就表示数据)

    • 长度值独占一行,长度不包括它结尾的CRLF(\r\n),也不包括分块数据结尾的CRLF。

    • 最后一个分块的长度值必须是0,且对应分块数据没有内容,它表示的是实体结束。

    支持语言

    • 接收方(请求):Accept-Language
    • 发送方(响应):Content-Language
    • 字段值:zh-CN, zh, en

    图片或文本文件等上传

    • Content-Type: multipart/form-data;
    • Content-Type: multipart/byteranges;状态码206(Partial Content, 部分内容)响应报文包含了多个范围的内容时使用。
      在这里插入图片描述

    状态码

    • 200 OK :请求成功,通常返回的数据中带有响应体。
    • 204 No Content:意思和200一样,不过返回的数据中不带有响应体。
    • 206 Partial Content:客户端进行了范围请求且服务端正常处理,响应报文的首部应该还有Content-Range字段指定实体的范围。使用场景为HTTP分块下载和断点续传。
    • 301 Moved Permanently:永久重定向,最新的URI为响应报文首部的 Location 字段。场景是:例如你的网站换了地址了,之前的地址不用了,若用户还是从之前的地址进的话则会返回301且在Location中带上最新的URI。且浏览器默认会做缓存优化,减少服务器压力,在第二次访问的时候自动访问重定向的那个地址。
    • 302 Found:临时重定向,和301不同,它表示请求的资源临时被移动到了别的URI上,因为是暂时的,所以不会被缓存
    • 303 See Other:临时重定向,请求的资源临时被移动到了别的URI上,但是明确表示客户端应该使用GET方法获取资源。
    • 304 Not Modefied:协商缓存成功就会返回304 Not Modefied,表示请求的资源在服务器上并未发送改变,告诉请求者可以使用缓存
    • 307 Temprary Redirect:临时重定向,但是比302更加明确,重定向的请求方法和实体都不允许变动。场景例如:HSTS协议,强制客户端使用https建立连接,比如你的网站从HTTP升级到了HTTPS,而你还是通过http://xxx访问的话,就会返回307 Internal Redirect
    • 400 Bad Request:请求报文中存在语法错误,但是没有具体指出是哪里。
    • 401 Unauthorized:需要有通过HTTP认证的认证信息或者表示用户认证失败。
    • 403 Forbidden:请求资源被拒绝,原因是:比如法律禁止、信息敏感。
    • 404 Not Found:请求资源未找到,表示没在服务器上找到相应的资源。
    • 500 Internal Server Error:服务器内部错误,但是没有具体指出是哪里,和400有点像。
    • 501 Not Implemented:表示客户端请求的功能还不支持
    • 502 Bad GateWay:服务器自身是正常的,但是代理服务器无法获取到合法响应
    • 503 Service Unavailable:服务器内部处于超负载状态或进行停机维护
    展开全文
  • 程序员必知必会:Http 报文格式

    万次阅读 2021-09-11 17:02:34
    请求报文: 响应报文: 请求行 Method + Path + HTTP 版本 状态行 HTTP 版本 + 状态码 + 状态信息 Http Method GET POST PUT DELETE HEAD HEAD 方法要求与 GET 请求相同的响应,但没有响应主体。这...
  • http报文格式详解!

    千次阅读 2019-03-12 14:47:27
    http报文格式详解! HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文 下面我们来说什么是请求报文: HTTP请求报文 一个HTTP请求报文由...
  • HTTP报文格式及WireShark抓包分析

    千次阅读 2019-01-19 16:40:22
    HTTP请求报文格式 在这个请求格式之中空行是必不可少的一行。空行之后是请求实体。一个具体的HTTP请求报文格式如下: GET /su?wd=www.&amp;action=opensearch&amp;ie=UTF-8 HTTP/1.1 Host: suggestion...
  • HTTP详解(二):HTTP报文格式

    千次阅读 2017-08-06 08:48:53
    HTTP详解(二):HTTP报文格式 HTTP报文格式 上一篇文章呢,主要是说了一下HTTP、TCP/IP和SOCKET的一些区别和联系,今天呢主要是和大家聊一聊HTTP报文的格式问题。HTTP报文这一块,需要了解的点比较多,面试考察的...
  • 网络:HTTP报文格式

    2019-01-22 17:54:26
    报文格式 首先报文的格式如下: 其中空行用于区分报文首部和报文主体内容,是由一个回车符和一个换行符组成。中间使用CR+LF的空行区分(\r\n) CR代表回车 LF代表换行 无论是请求报文还是响应报文都需要有报文...
  • 使用表单上传文件的http报文格式

    千次阅读 2017-12-30 23:09:41
    使用html表单上传文件需要设置一个enctype="multipart/form-data",替代了原来的x-www-form-urlencoded属性值 ...POST / HTTP/1.1 cache-control: no-cache Postman-Token: 99ccab8a-1d74-4d63-8230-4e7c617055
  • 4.1.2.HTTP报文格式解析

    2017-09-18 22:57:27
    不同的请求方式,他们的请求格式可能是不一样的,请求格式就是我们所说的的报文格式。但是,通常来说一个HTTP请求报文由请求行(request line)、请求头(header)、空行和请求数据4个部分组成,如图给出了请求报文...
  • http 报文格式

    2017-06-25 16:22:35
    http报文格式分为请求报文格式和响应报文格式,二者有略微的差别。 先看http 请求报文格式: 《请求行--request line》 《请求头--request header》 《换行》 《请求体》 其中,请求行中,主要包括:...
  • HTTP报文格式(我们研究的是HTTP/1.1版本的) 首先有两种类型的HTTP报文 请求报文 响应报文 不一样,我们分别来介绍哦 HTTP请求报文 下面看一个typical的HTTP请求报文的例子 GET /somedir/page.html HTTP/1.1 Host...
  • HTTP报文格式介绍

    2010-11-03 13:36:02
    HTTP协议(Hypertext Transfer Protocol――超文本传输协议),浏览器端(客户端)向WEB服务器端访问页面的过程和HTTP协议报文格式。 基于HTTP协议的客户机访问包括4个过程,分别是建立TCP套接字连接、发送...
  • 三、HTTP请求报文格式

    千次阅读 2021-01-20 14:05:10
    一、HTTP的请求报文格式 一个HTTP的请求报文的通用格式如下: 请求行 请求行中的方法和其大致作用如下表 请求行中的URL表示请求资源的路径和名称,版本字段是当前HTTP的版本 首部行 首部行中包含一些...
  • 前后端数据交互和HTTP协议/HTTP报文格式/HTTP方法/get和post的区别/HTTP状态码
  • http请求报文格式和响应报文格式

    万次阅读 多人点赞 2019-05-21 11:34:01
    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议。HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;... 下面对请求报文格式进行简单的分析:  ...
  • 报文格式大全

    千次阅读 多人点赞 2020-06-23 23:18:47
    网络开发中非常全面的不同协议报文格式大全: 在线网址:http://www.023wg.com/message/message/cd_feature_cover.html 协议地图: 如果需要离线版本的chm功能,请发送邮件或者私信我。邮箱地址为vip_...
  • 报文的请求消息行,请求消息头;Http响应消息头,Http响应消息行,Http响应消息正文的解析
  • HTTP协议报文格式

    万次阅读 2018-05-24 20:52:05
    HTTP报文有两种:请求报文,响应报文。请求报文GET /search?hl=zh-CN&amp;source=hp&amp;q=domety&amp;aq=f&amp;oq= HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpe...
  • http报文格式、GET与POST的区别

    千次阅读 2017-03-18 12:08:39
    http请求数据包的格式:请求头(请求行+请求头部+空行)+请求数据 (1)请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求...
  • 参考HTTP请求报文(请求行、请求头、请求体) HTTP请求报文由3部分组成(请求行+请求头+请求体): 请求行 ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。 ②为...
  • 应用层 域名( Domain Name)- 顶级域名、二级域名 DNS - DNS服务器、常用命令 DHCP(DISCOVER、OFFER、REQUEST、ACKNOWLEDGE) HTTP HTTP版本、HTTP标准 HTTP报文格式(简) ABNF 报文格式 - 整体 报文格式 - ...
  • 文章目录报文结构HTTP 请求报文的请求行请求方法GET/HEADPOST/PUT其他方法URIURI 的格式URI 的编码HTTP 响应报文的状态行状态码HTTP 请求、响应头部字段 HTTP 协议再规范文档里详细定义了报文格式,规定了组成部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,276
精华内容 40,110
关键字:

http报文格式

友情链接: 提升树.rar