精华内容
下载资源
问答
  • HTTP 协议再规范文档里详细定义了报文格式,规定了组成部分,解析规则,还有处理策略,所以可以在 TCP/IP 层之上实现丰富灵活的功能,例如连接控制、缓存管理、数据编码、内容协商 报文结构 HTTP 协议是一个”纯...


    HTTP 协议再规范文档里详细定义了报文的格式,规定了组成部分,解析规则,还有处理策略,所以可以在 TCP/IP 层之上实现丰富灵活的功能,例如连接控制、缓存管理、数据编码、内容协商

    报文结构

    HTTP 协议是一个”纯文本“的协议,在实际传输的数据前要附加一些头数据,不过头数据都是ASCII码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂

    HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:

    • 起始行(start line)描述请求或响应的基本信息
    • 头部字段集合(header)使用 key-value 形式更详细说明报文
    • 消息正文(entity)实际传输的数据,不一定是纯文本,可以是图片、视频等二进制数据

    其中前两部分起始行和头部字段经常合称为”请求头“或”响应头“,消息正文又称为”实体“,但与”header“对应,很多时候就直接称为”body“

    HTTP协议规定报文必须有header,但可以没有body,而且在header之后必须要有一个“空行”,也就是“CRLF”,十六机制的“0D0A”

    所以,一个完整的HTTP报文就像下图的这样,注意在header和body之间有一个“空行”
    在这里插入图片描述
    接下来看上一篇提到的获取的 GET 请求报文信息
    在这里插入图片描述
    在这个浏览器发出的请求报文里,第一行“GET / HTTP/1.1”就是请求行,而后面的“Host”“Connection”等等都属于header,报文的最后是一个空白行结束,没有body

    其实浏览器发送GET请求的时HTTP报文经常是只有header而没body。,虽然HTTP协议对header的大小没有做限制,但各个Web服务器都不允许过大的请求头,因为头部太大可能会占用大量的服务器资源,影响运行效率

    HTTP 请求报文的请求行

    请求报文里的起始行也就是请求行(request line),简要描述了客户端想要如何操作服务器端的资源

    请求行由三部分构成:

    • 请求方法:是一个动词,如GET/POST,表示对资源的操作
    • 请求目标:通常是一个URI,标记了请求方法要操作的资源
    • 版本号:表示报文使用的HTTP协议版本

    这三个部分通常使用空格(space)来分隔,最后要用CRLF换行表示结束
    在这里插入图片描述
    还是用Wireshark抓包的数据来举例:

    GET / HTTP/1.1
    

    在这个请求行里,“GET”是请求方法,“/”是请求标,“HTTP/1.1”是版本号,把这三部分连起来,意思就是“服务器你好,我想获取网站根目录下的默认文件,我用的协议版本号是1.1

    请求方法

    蒂姆·伯纳斯-李最初设想的是要用HTTP协议构建一个超链接文档系统,使用URI来定位这些文档,也就是资源。那么,该怎么在协议里操作这些资源呢?

    所以,就出现了“请求方法”。实际含义就是客户端发出了一个“动作指令”,要求服务器端对URI定位的资源执行这个动作

    HTTP/1.1规定了八种方法,单词都必须是大写的形式:

    • GET:获取资源,可理解为读取或下载数据
    • HEAD:获取资源的元信息
    • POST:向资源提交数据,相当于写入或上传数据
    • PUT:类似 POST
    • DELETE:删除资源
    • CONNECT:建立特殊的连接隧道
    • OPTIONS:列出可对资源实行的方法
    • TRACE:追踪请求-响应的传输路径

    在这里插入图片描述
    有点像对文件或数据库的“增删改查”操作,只不过这些动作操作的目标不是本地资源,而是远程服务器上的资源,所以只能由客户端“请求”或者“指示”服务器来完成

    既然请求方法是一个“指示”,那么客户端自然就没有决定权,服务器掌控着所有资源,也就有绝对的决策权力。它收到HTTP请求报文后,看到里面的请求方法,可以执行也可以拒绝,或者改变动作的含义,毕竟HTTP是一个“协议”,两边都要“商量着来”

    比如,发起了一个GET请求,想获取“/orders”这个文件,但这个文件保密级别比较高,不是谁都能看的,服务器就可以有如下的几种响应方式:

    • 假装这个文件不存在,直接返回一个404 Not found报文
    • 稍微友好一点,明确告诉你有这个文件,但不允许访问,返回一个403 Forbidden
    • 再宽松一些,返回405 Method Not Allowed,然后用Allow头告诉你可以用HEAD方法获取文件的元信息

    举几个个比较常用的方法说明:

    GET/HEAD

    请求从服务器获取资源,这个资源既可以是静态的文本、页面、图片、视频,也可以是由PHP、Java动态生成的页面或者其他格式的数据

    GET方法虽然基本动作比较简单,但搭配URI和其他头字段就能实现对资源更精细操作,例如,在URI后使用“#”,可以在获取页面后直接定位到某个标签所在的位置;使用If-Modified-Since字段就变成了“有条件的请求”,仅当资源被修改时才会执行获取动作;使用Range字段就是“范围请求”,只获取资源的一部分数据

    HEAD方法与GET方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只传回响应头,就是资源的“元信息”。可以看做是GET方法的一个“简化版”或者“轻量版”。因为它的响应头与GET完全相同,所以可以用在很多并不真正需要资源的场合,避免传输body数据的浪费

    比如,想要检查一个文件是否存在,只要发个HEAD请求就可以了,没有必要用GET把整个文件都取下来。

    再比如,要检查文件是否有最新版本,同样也应该用HEAD,服务器会在响应头里把文件的修改时间传回来

    POST/PUT

    GET和HEAD方法是从服务器获取数据,而POST和PUT方法则是相反操作,向URI指定的资源提交数据,数据就放在报文的body里

    比如,上论坛灌水,敲了一堆字后点击“发帖”按钮,浏览器就执行了一次POST请求,把你的文字放进报文的body里,然后拼好POST请求头,通过TCP协议发给服务器。

    又比如,上购物网站,看到了一件心仪的商品,点击“加入购物车”,这时也会有POST请求,浏览器会把商品ID发给服务器,服务器再把ID写入你的购物车相关的数据库记录

    PUT的作用与POST类似,也可以向服务器提交数据,但与POST存在微妙的不同,通常POST表示的是“新建”“create”的含义,而PUT则是“修改”“update”的含义

    在实际应用中,PUT用到的比较少。而且,因为它与POST的语义、功能太过近似,有的服务器甚至就直接禁止使用PUT方法,只用POST方法上传数据

    其他方法

    DELETE方法指示服务器删除资源,因为这个动作危险性太大,所以通常服务器不会执行真正的删除操作,而是对资源做一个删除标记。当然,更多的时候服务器就直接不处理DELETE请求

    CONNECT是一个比较特殊的方法,要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,这时Web服务器在中间充当了代理的角色

    OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回。它的功能很有限,用处也不大,有的服务器(例如Nginx)干脆就没有实现对它的支持

    TRACE方法多用于对HTTP链路的测试或诊断,可以显示出请求-响应的传输路径。它的本意是好的,但存在漏洞,会泄漏网站的信息,所以Web服务器通常也是禁止使用

    URI

    URI,也就是统一资源标识符(Uniform Resource Identifier)包含有URL和URN两个部分,在HTTP世界里用的网址实际上是URL,即统一资源定位符(Uniform Resource Locator)。但因为URL实在是太普及了,所以常常把这两者简单地视为相等

    URI 的格式

    URI本质上是一个字符串,这个字符串的作用是唯一地标记资源的位置或者名字,它不仅能够标记万维网的资源,也可以标记其他的,如邮件系统、本地文件系统等任意资源。而“资源”既可以是存在磁盘上的静态文本、页面数据,也可以是由Java、PHP提供的动态服务

    下面的这张图显示了URI最常用的形式,由scheme、host:port、path和query四个部分组成,但有的部分可以视情况省略
    在这里插入图片描述

    • scheme:“协议名”,表示资源应该使用哪种协议访问,浏览器通过你的应用程序看到URI里的scheme,就知道下一步该怎么走了,会调用相应的HTTP或者HTTPS下层API。在scheme之后,必须是三个特定的字符 : / / ,把scheme和后面的部分分开
    • host:port,即主机名加端口号,表示资源所在主机,主机名可以是IP地址或者域名的形式,必须要有,否则浏览器就会找不到服务器。但端口号有时可以省略,浏览器等客户端会依据scheme使用默认的端口号,例如HTTP的默认端口号是80,HTTPS的默认端口号是443
    • Path,有了协议名和主机地址、端口号,再加上后面标记资源所在目录,浏览器就可以连接服务器访问资源。URI里path采用了类似文件系统“目录”“路径”的表示方式,因为早期互联网上的计算机多是UNIX系统,所以采用了UNIX的“/”风格。URI的path部分必须以“/”开始
    http://nginx.org
    协议名 http
    主机名 nginx.org
    端口号省略,对于 http 协议默认 80
    路径部分也被省略,默认就是一个“/”,表示根目录
    	
    http://www.chrono.com:8080/11-1
    主机名 www.chrono.com 
    端口号 8080
    路径是 /11-1
    
    HTTP协议标准文档RFC7230的URI
    https://tools.ietf.org/html/rfc7230
    主机名 tools.ietf.org
    路径是 /html/rfc7230
    
    file:///D:/http_study/www/
    协议名 file,表示这是本地文件
    三个斜杠里的前两个属于URI特殊分隔符 ://
    主机名被省略,file类型URI的“特例”,它允许省略主机名,默认是本机localhost
    路径是 /D:/http_study/www/
    
    但对于HTTP或HTTPS这样的网络通信协议
    主机名是绝对不能省略的,会导致浏览器无法找到服务器
    
    • 查询参数:URI后面还有一个“query”部分,它在path之后,用一个“?”开始,但不包含“?”,表示对资源附加的额外要求。

      查询参数query有一套自己的格式,是多个“key=value”的字符串,这些KV值用字 符“&”连接,浏览器和客户端都可以按照这个格式把长串的查询参数解析成可理解的字典或关联数组形式

      例如:获取商品图片,但想要一个32×32的缩略图版本;获取商品列表,但要按某种规则做分页和排序;跳转页面,但想要标记跳转前的原始页面

    URI的完整格式
    在这里插入图片描述
    第一个多出的部分是协议名之后、主机名之前的身份信息“user:passwd@”,表示登录主机时的用户名和密码,但现在已经不推荐使用这种形式了(RFC7230),因为它把敏感信息以明文形式暴露出来,存在严重的安全隐患

    第二个多出的部分是查询参数后的片段标识符“#fragment”,它是URI所定位的资源内部的一个“锚点”或者说是“标签”,浏览器可以在获取资源后直接跳转到它指示的位置。

    但片段标识符仅能由浏览器这样的客户端使用,服务器是看不到的。也就是说,浏览器永远不会把带“#fragment”的URI发送给服务器,服务器也永远不会用这种方式去处理资源的片段

    URI 的编码

    在URI里只能使用ASCII码。对于ASCII码以外的字符集和特殊字符做一个特殊的操作,把它们转换成与URI语义不冲突的形式。这在RFC规范里称为“escape”和“unescape”,俗称“转义”

    HTTP 响应报文的状态行

    看完了请求行,我们再看响应报文里的起始行,在这里它不叫“响应行”,而是叫“状态行”(status line),意思是服务器响应的状态

    比起请求行来说,状态行要简单一些,同样也是由三部分构成:

    • 版本号:表示报文使用的HTTP协议版本
    • 状态码:三个数字,表示处理的结果,比如200是成功,500是服务器错误
    • 原因:对状态码的一个解释说明

    在这里插入图片描述
    看一下之前 Wireshark 抓包里的响应报文,状态行是:

    HTTP/1.1 200 OK
    

    意思就是:“浏览器你好,我已经处理完了你的请求,这个报文使用的协议版本号是1.1,状态码是200,一切OK。”

    另一个“GET /favicon.ico HTTP/1.1”的响应报文状态行是:

    HTTP/1.1 404 Not Found
    

    意思是:抱歉啊浏览器,刚才你的请求收到了,但我没找到你要的资源,错误代码是404

    状态码

    它是一个十进制数字,表示服务器对请求的处理结果。客户端可以依据代码适时转换处理状态,例如继续发送请求、切换协议,重定向跳转等,有那么点TCP状态转换的意思

    目前RFC标准里规定的状态码是三位数,所以取值范围就是从000到999。RFC标准把状态码分成了五类,用数字的第一位表示分类,而0-99不用,由000-999变成了100~599

    这五类具体含义:

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

    接下来逐个解释:

    • 1××类状态码属于提示信息,是协议处理的中间状态,实际能够用到的时候少。“101 Switching Protocols”。它的意思是客户端使用Upgrade头字段,要求在HTTP协议的基础上改成其他的协议继续通信,比如WebSocket。而如果服务器也同意变更协议,就会发送状态码101,但这之后的数据传输就不会再使用HTTP了

    • 2××类状态码表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码

      200 OK 是最常见的成功状态码,表示一切正常,服务器如客户端所期望的那样返回了处理结果,如果是非HEAD请求,通常在响应头后都会有body数据

      204 No Content 是另一个很常见的成功状态码,它的含义与“200 OK”基本相同,但响应头后没有body数据。所以对于Web服务器来说

      206 Partial Content 是HTTP分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现,它与200一样,也是服务器成功处理了请求,但body里的数据不是资源的全部,而是其中的一部分。他还会伴随着头字段“Content-Range”,表示响应报文里body数据的具体范围,供客户端确认,例如“Content-Range: bytes 0-99/2000”,意思是此次获取的是总计2000个字节的前100个字节

    • 3××类状态码表示客户端请求的资源发生了变动,客户端必须用新的URI重新发送请求获取资源,也就是通常所说的“重定向”

      301 Moved Permanently俗称“永久重定向,含义是此次请求的资源已经不存在了,需要改用改用新的URI再次访问

      302 Found “临时重定向,意思是请求的资源还在,但需要暂时用另一个URI来访问

      比如,你的网站升级到了HTTPS,原来的HTTP不打算用了,这就是“永久”的,所以要配置301跳转,把所有的HTTP流量都切换到HTTPS

      再比如,今天夜里网站后台要系统维护,服务暂时不可用,这就属于“临时”的,可以配置成302跳转,把流量临时切换到一个静态通知页面,浏览器看到这个302就知道这只是暂时的情况,不会做缓存优化,第二天还会访问原来的地址

      304 Not Modified 表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向)

      关于 HTTP 重定向和跳转

    • 4××类状态码表示客户端发送的请求报文有误,服务器无法处理

      400 Bad Request 是一个通用的错误码,表示请求报文有错误,但具体是数据格式错误、缺少请求头还是URI超长它没有明确说,只是一个笼统的错误,客户端看到400只会是“一头雾水”“不知所措”。所以,在开发Web应用时应当尽量避免给客户端返回400,而是要用其他更有明确含义的状态码。

      403 Forbidden 实际上不是客户端的请求出错,而是表示服务器禁止访问资源。原因可能多种多样,例如信息敏感、法律禁止等,如果服务器友好一点,可以在body里详细说明拒绝请求的原因,不过现实中通常都是直接给一个“闭门羹”。

      404 Not Found 可能是我们最常看见也是最不愿意看到的一个状态码,它的原意是资源在本服务器上未找到,所以无法提供给客户端。但现在已经被“用滥了”,只要服务器“不高兴”就可以给出个404,而我们也无从得知后面到底是真的未找到,还是有什么别的原因,某种程度上它比403还要令人讨厌。

    • 5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”

      500 Internal Server Error 与400类似,也是一个通用的错误码,服务器究竟发生了什么错误我们是不知道的。不过对于服务器来说这应该算是好事,通常不应该把服务器内部的详细信息,例如出错的函数调用栈告诉外界。虽然不利于调试,但能够防止黑客的窥探或者分析

      501 Not Implemented 表示客户端请求的功能还不支持,这个错误码比500要“温和”一些,和“即将开业,敬请期待”的意思差不多,不过具体什么时候“开业”就不好说

      502 Bad Gateway 通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的

      503 Service Unavailable 表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码503。是一个“临时”的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以503响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求

    HTTP 请求、响应头部字段

    请求头和响应头的结构是基本一样的,唯一的区别是起始行

    请求行或状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头,对比两个示意图:

    在这里插入图片描述

    在这里插入图片描述

    头部字段是key-value的形式,key和value之间用 :分隔,最后用CRLF换行表示字段结束。比如在“Host:127.0.0.1”这一行里key就是“Host”,value就是“127.0.0.1”

    HTTP头字段非常灵活,不仅可以使用标准里的Host、Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的扩展可能。不过使用头字段需要注意下面几点:

    • 字段名不区分大小写,例如 Host 也可以写成 host ,但首字母大写的可读性更好
    • 字段名里不允许出现空格,可以使用连字符 - ,但不能使用下划线 _ 。例如,test-name是合法的字段名,而 test name 和 test_name是不正确的
    • 字段名后面必须紧接着:不能有空格,而:后的字段值前可以有多个空格
    • 字段的顺序是没有意义的,可以任意排列不影响语义
    • 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie

    常用头字段

    HTTP协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:

    • 通用字段:在请求头和响应头里都可以出现
    • 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件
    • 响应字段:仅能出现在响应头里,补充说明响应报文的信息
    • 实体字段:它实际上属于通用字段,但专门描述body的额外信息

    几个最基本的头字段:

    • Date 通用字段,通常出现在响应头里,表示HTTP报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略

    • Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)

    • Host 请求字段 告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用Host字段来选择,有点像是一个简单的“路由重定向”

      例如在127.0.0.1上有三个虚拟机:www.chrono.com、www.metroid.net 和 origin.io 那么当使用域名的方式访问时,就必须要用Host字段来区分这三个IP相同但域名不同的网站,否则服务器就会找不到合适的虚拟主机,无法处理

    • User-Agent 请求字段,发送请求的浏览器类型、操作系统等信息

    • Accept 请求字段,客户端可识别内容类型列表,用于指定客户端接收哪些类型信息

    • Server 响应字段,只能出现在响应头里。它告诉客户端当前正在提供Web服务的软件名称和版本号,例如“Server: openresty/1.15.8.1”,即使用的是OpenResty 1.15.8.1

      Server字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用bug攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息

      比如GitHub,它的Server字段里就看不出是使用了Apache还是Nginx,只是显示为“GitHub.com”
      在这里插入图片描述

    • 实体字段 Content-Length,它表示报文里body的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么body就是不定长的,需要使用chunked方式分段传输

    • 实体字段 Content-Type发送给接收者实体正文媒体类型HTTP COntent-Type 对照表

    • Expires ,实体报头给出响应过期的日期和时间

    展开全文
  • 9+++HTTP协议抓包分析

    2020-06-27 14:52:48
    我双击之后打开就是这样子:因为这里主要就是分析HTTP协议的东西,所以仅仅只截下了HTTP请求报文的内容。 请求行分析: method:GET; URL:是一个相对的URL。是相对下面的Host来说的。两者组合就是一个完整的U...
        本次使用的测试的网站是:http://www.people.com.cn
    

    HTTP请求报文和响应报文的结构示意图

    为了方便分析我先将HTTP的请求报文和响应报文格式贴出来:图片来源于网络

    请求报文分析

        首先分析从我电脑上发出的一个请求,也就是这个请求:
    


    我双击之后打开就是这样子:因为这里主要就是分析HTTP协议的东西,所以仅仅只截下了HTTP请求报文的内容。

    请求行分析:

    • method:GET;
      • URL:是一个相对的URL。是相对下面的Host来说的。两者组合就是一个完整的URL;这里联合http组合之后就是:http://www.people.com.cn/
      • 版本:HTTP/1.1;
      • CRLF:\r\n

    首部分析:在首部中,每一个字段名最后面都是会有一个cr和lf的。所以,我就在下面的内容中就不提及这个了。

    • Host: www.people.com.cn
      也就是是你要访问的主机的名字;
    • Connection:keep-alive
      值代表的意思是保持连接。这样子有利于在你访问的网页中有很多图片等其他资源的时候,可以使用同一个TCP连接接收,而不是针对每一个文件都建立一次TCP/IP的连接。这个也就是课本上面说的“持久连接”。
    • Upgrade-Insecure-Request:1。
      这个具体的意思我也不太清楚,要详细了解还是得自己去查;在我后面的参考资料中有提到。
    • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36\r\n
      指明了发出请求的用户代理的浏览器的一些信息;
    • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3\r\n
      指明了浏览器接收对象的顺序,优先接收text/html文件,这个也是为什么每次服务器返回第一个文件是html了。
    • Referer: http://www.people.com.cn/
      这个代表服务器该该请求时从这个链接进来的。
    • Accept-Encoding: gzip, deflate
      说明该浏览器支持的编码格式,这里是压缩编码的方式。我猜想应该是服务器将浏览器请求的文件都是以压缩文件发送过来的。
    • Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
      指明了该浏览器支持的语言类型,支持zh-CN,zh,en。然后优先发送zh-CN和zh的语言,因为他们的权重是0.9
    • \r\n 代表下面的信息就是请求体的实体部分了。

    实体部分分析:下面是我的实体截图

    按照理论上上来说,这里应该是一些实体的内容,但是我从抓包看到的数据却不是这个样子。可以看到箭头所指的方向,我个人感觉就是上面请求行和首部行的数据的总和而已.。在我百思不得其解的时候,在《计算机网络:自顶向下方法》中看到了这样的一句话:“使用GET方法是实体体为空,而是用post方式是才有该实体体。”所以我觉得应该是这里的是因为这里请求报文没有必要加上请求实体,所以就没有吧。但是后面响应报文的就是包含了响应实体的,通过抓包工具看到,转送过来的就是html代码。

    响应报文分析

    接下来分析的就是这个响应请求了。

    具体的内容是这样的:

    响应行分析:HTTP/1.1 200 OK\r\n

    • Response Version: HTTP/1.1
    • Status Code: 200 (这个就是那个OK的的Description)
    • Response Phrase: OK
    • crlf

    首部行分析:

    • Content-Type: text/html\r\n
      就是说服务器给客户端传回来的是html的文件格式。这个也验证了请求报文中的Accept字段的值。因为那个字段表示的是浏览器优先接收的对象。的确是text/html文件排在第一个。

    • Connection: keep-alive\r\n
      同上

    • X-Cache: HIT from PDcache-42 :www.people.com.cn\r\n
      一看到Cache就想到了计组中的高速缓存Cache,和Linux内核中的热冷页。我查了一下,这里和其它Cache是一样的,就是为了增加存取效率出现的。后面的HIT就是表示命中了。具体的话还是得自己查资料看啦。后面的参考文献中也有。

    • Powered-By-ChinaCache: HIT from CHN-LN-u-3OZ\r\n
      这个暂时我还是一个刚刚学计网的孩子,我之后一定弄清楚,这里我就不深究了。不过查了一些文章,应该是想说这是一个CDN技术。

    • ETag: W/“5d53bd8c-256d3”\r\n
      Etag中有种Weak Tag,值为 W/“xxxxx”。他声明Tag是弱匹配的,只能做模糊匹配,在差异达到一定阈值时才起作用。(来自百度百科)

    • Content-Length: 36488\r\n
      这个是返回的实体在压缩之之后的长度为36488Byte,这个长度还是可以深究,看后面参考。

    • X-Cache-Hits: 21\r\n
      略去

    • Date: Wed, 14 Aug 2019 08:19:44 GMT\r\n
      这个就是你请求的东西被服务器创建的时间。时间格式是GMT,和北京时间有点误差。

    • Expires: Wed, 14 Aug 2019 08:20:44 GMT\r\n
      这个就是如果你在这个时间之内去再次访问的话,得到就是缓存中的内容

    • CACHE: TCP_HIT\r\n
      略去

    • Content-Encoding: gzip\r\n
      压缩方式

    • Last-Modified: Wed, 14 Aug 2019 07:51:40 GMT\r\n
      你所请求的东西上次修改的时间

    • age: 53\r\n
      代表该响应在缓存代理中存放了53秒。

    • Vary: Accept-Encoding\r\n
      我的理解就是:因为客户端和服务器之间可能有1个或者多个缓存服务器。那么,有时候会将缓存服务器的内容返回给客户端。现在有这样一个情景,A和B都请求的是文件C,文件C在缓存服务器中。但是两个用户使用的浏览器支持的编码不同,A仅仅支持gzip,而B仅仅支持的是compress,那么你把文件C使用gzip压缩的给B就是不对的,因为B无法解压得到一个正确的结果。所以Vary字段就是看看到底要不要把这个文件从缓存中拿出来给A和B。

    • Server: nginx\r\n
      设置服务器名称

    • Powered-By-ChinaCache: HIT from CMN-WH-3-D08\r\n
      略去

    • CC_CACHE: TCP_HIT\r\n
      略去

    • Accept-Ranges: bytes\r\n
      表示该服务器是否支持文件的范文请求。也就是说,我不想要一整个文件,而是32Byte~1024Btye之间的文件。

    • \r\n

      实体体分析

      按道理说应该只有箭头所指的地方才是实体体的内容,那么方框里面的内容是什么呢?目前我还是不知道。我还想要把这个实体信息复制下来看看是不是和书本上说到一样的,首先传输的是html页面,可能没有图片什么的。但是发现复制不了,所以这个还没有验证。

      这个是本人第一次实现抓包协议的分析,肯定有很多不足。之后如果有一些更新的话,再回来更新。

    参考资料

    HTTP协议常用头部实例详解(Request、Response)
    https://blog.csdn.net/selinda001/article/details/79338766
    Etag 和 If-None-Match
    https://www.cnblogs.com/xuzhudong/p/8339853.html
    【http】Keep-alive 知多少?作用?默认时长?
    https://blog.csdn.net/qfzhangwei/article/details/90614253
    从HTTP响应头看各家CDN缓存技术
    https://segmentfault.com/a/1190000006673084
    Http协议之Content-Length
    https://blog.csdn.net/love_hot_girl/article/details/81163085
    HTTP请求的响应头部Vary的理解
    https://blog.csdn.net/qq_29405933/article/details/84315254
    https://luchuan.iteye.com/blog/1058563

    展开全文
  • HTTP抓包分析

    2020-06-06 21:33:38
    Q&A HTTP是什么?作用? HTTP:超文本传输协议,定义了web客户向web服务器...HTTP请求报文格式: 第一行是请求行,其余是首部行。 请求行包括三个字段: (1)请求方法字段,包括GET,POST等,二者的区别在于GE

    Q&A

    HTTP是什么?作用?
    HTTP:超文本传输协议,定义了web客户向web服务器请求页面的方式,以及服务器向客户传送页面的方式,使用TCP作为传输层协议,HTTP是无状态的,对于交互场景没有记忆能力。

    HTTP连接方式?
    HTTP既可以采用持续连接,也可以使用非持续连接,默认状态下使用持续连接,即每个请求和响应都通过相同的TCP连接传送。
    非持续连接使用并行可以降低访问时间。

    HTTP请求报文格式:
    在这里插入图片描述
    第一行是请求行,其余是首部行。
    请求行包括三个字段:
    (1)请求方法字段,包括GET,POST等,二者的区别在于GET请求的页面不依赖用户信息,但表单生成的请求报文不是必须用POST方法,也可以在URL中直接包含。
    (2)URL字段
    (3)HTTP版本字段
    首部行:告诉服务器请求网站(host),使用持续/非持续连接,浏览器版本,语言等信息

    HTTP响应报文:
    包含三个部分:
    (1)初始状态行:包含协议版本字段,状态码,状态信息
    (2)首部行:包含是否关闭TCP连接,日期,内容长度等信息
    (3)实体:正文

    cookie的作用:
    因为HTTP是无状态的,为了把用户身份和请求关联起来,HTTP使用了cookie。
    cookie的四个组件:
    (1)HTTP响应报文中的一个cookie首部行
    (2)HTTP请求报文中的一个cookie首部行
    (3)用户端系统由浏览器管理的cookie文件
    (4)web站点的后端数据库

    HTTP抓包

    (1)普通http
    (1)打开浏览器输入:http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html
    在这里插入图片描述
    本机向服务器发送的请求,服务器返回的包:
    在这里插入图片描述
    HTTP请求报文:
    在这里插入图片描述
    HTTP响应报文:
    在这里插入图片描述
    服务器上HTML文件的最近一次修改是什么时候?看Last-Modified,竟然是在一分钟前!这是因为服务器的设置。

    (2)条件get
    输入http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file2.html,再输入一次,抓包发现第一个不是条件get,第二次是。第一次服务器返回了html内容,第二次服务器发现没有改变,返回状态字304,Not Modified。
    在这里插入图片描述

    (3) 长文件检索

    访问http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file3.html,发现服务器返回了四个由TCP传输的包
    在这里插入图片描述

    (4) 嵌入对象的HTML
    访问,http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file4.html,页面包含一段文字和两张图片。
    发现捕获了好多包,其中有三个GET,一个是请求页面,两个是请求图片,符合预期
    在这里插入图片描述
    判断是否是并行下载?
    因为两张图片的请求有时间差,所以应该不是并行,而是串行。

    (5)HTTP认证
    访问受密码保护的网站:http://gaia.cs.umass.edu/wireshark-labs/protected_pages/HTTP-wireshark-file5.html,输入用户名:wireshark-students,密码:network。
    捕获了四个包:
    在这里插入图片描述
    第一次服务器返回782状态字,显示没有授权。
    第二次GET请求中包含了输入的用户名和密码:
    在这里插入图片描述

    展开全文
  • 一、实验目的 学习使用网络抓包软件WireShark,理解网络协议实体之间的交互,巩固所学知识。掌握HTTP请求、响应的报文格式,分析、掌握HTTP请求、响应的过程。...分析Http协议请求及响应过程,掌握Tcp报文的格式。
  • 协议报文格式详解 在我们日常生活中最常见的应用环境就是上网浏览网页很多上班族到办 公室的第一件事就是打开电脑而开机后的第一件事就是打开 IEFirefoxMyieGreenBrowserOpera?等浏览器时做的第一件事就是浏 览一下...
  • 篇一 wireshake 抓包分析 tcp 与 http 过程详解 http 协议报文格式详解 在我们日常生活中最常见的应用环境就是上网浏览网 页很多上班族到办公室的第一件事就是打开电脑而开机 后的第一件事就是打开 ie Firefox myie...
  • Fiddler抓包分析

    千次阅读 2017-03-17 19:42:29
    首先了解http报文结构 ...根据HTTP报文格式 请求行包括请求方法、URL、协议版本 图中显示这个请求的请求行:  请求方法:GET  URL:http://baidu.com/  协议版本:HTTP/1.1 接下来是请

    首先了解http报文结构

      参看 HTTP请求/响应报文与工作原理详解

    简单归纳:

    请求报文

    HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成

    在此使用fiddler抓包工具抓取一个请求包:



    根据HTTP报文格式
    请求行包括请求方法、URL、协议版本
    图中显示这个请求包的请求行:
       请求方法:GET
       URL:http://baidu.com/
       协议版本:HTTP/1.1
    接下来是请求头部,请求头部一般是由头部字段名称、冒号、值 组成(由于HTTP报文是面向文本的报文中的字段都是由ascii码组成)
      Accept: text/html, application/xhtml+xml, image/jxr, */*
            Accept表示客户端可识别的响应内容类型列表
            星号“*”用于按范围将类型分组 “*/*”指示可接受全部类型
      Accept-Language: zh-Hans-CN, zh-Hans;q=0.5
           Accept-Language:客户端可接受的自然语言
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
            User-Agent:产生请求的浏览器类型
      Accept-Encoding: gzip, deflate
            Accept-Encoding:客户端可接受的编码压缩格式
      Host: baidu.com
           Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机
      Connection: Keep-Alive
          Connection:连接方式(close 或 keepalive)
          对于请求来说:close(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)
      接下来全都Cookie字段了
       
    fiddler中切换headers以一种更为直观的方式观看..

    请求包体不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length

    由于此处http包的请求方法是GET所以这个请求包没有包体


    响应报文

    响应报文结构


    上述请求包的响应报文在fiddler中显示:


    对于响应包的状态行:

       协议版本:HTTP/1.1

       状态码:302

            301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

            状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:
      1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
      2xx:表示服务器已成功接收到请求并进行处理;
      3xx:表示服务器要求客户端重定向;
      4xx:表示客户端的请求有非法内容;
      5xx:表示服务器未能正常处理客户端的请求而出现意外错误;

       状态码描述:Moved Temporarily

    响应包的响应头部更为清晰的观看方式..


             Location:Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源;
      Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。
      Vary:指示不可缓存的请求头列表;
      Connection:连接方式;
      对于响应来说:close(连接已经关闭); keepalive(连接保持着,在等待本次连接的后续请求); Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB 服务器保持连接多长时间(秒);例如:Keep-Alive:300;
      WWW-Authenticate:WWW-Authenticate响应报头域必须被包含在401 (未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求;
      空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。
      响应包体:服务器返回给客户端的文本信息;


    展开全文
  • 每种报文在HTTP首部都有不同的字段来标识不同的用途。 1. 请求报文HTTP协议使用TCP协议进行传输,在应用层协议发起...请求报文格式如下图抓包所示: 前三行为请求行,其余部分称为request-header。请求行中...
  • 因为需要开发模拟CTP后台服务,实现一键切换CTP,所以我们需要分析CTP报文。...本人花了几个晚上用wireshark抓包分析,已经可以完整还原新版FTD协议流程。   先简单介绍CTP平台工作流程,大致分为三种...
  • 每种报文在HTTP首部都有不同的字段来标识不同的用途。 请求报文HTTP协议使用TCP协议进行传输,在应用层协议发起...请求报文格式如下图抓包所示: 前三行为请求行,其余部分称为request-header。请求行中的met...
  •      当你使用tcpdump或是Wireshark进行HTTP抓包分析处理的时候,首先需要你对HTTP报文格式结构有一个大概的了解,在 HTTP协议报文格式 一文中,对HTTP的请求与响应报文格式作了一个简要的描述,这对你快速...
  • 它的报文格式为: (挺多字段的,挑重点的理解一下:) 序列号(Sequence Number):长度为32 bits节。指定了当前数据分片中分配给第一字节数据的序列号。在TCP传输流中每一个字节为一个序号。 如果TCP报文中flags...
  • http协议分析工具

    2019-09-24 00:14:10
    资源推荐 1.Wireshark抓包软件 Wireshark(前称Ethereal)是一个网络封包分析软件。...我们可以使用Wireshark抓包工具,分析HTTP数据报的格式。更加直观的了解http协议传输的内容。 Wireshark简...
  • 但是http协议一直失败,服务器返回400,通过查询http状态码得知,http400错误是请求无效,因为GPRS模块没有实现http协议的封装,需要在TCP协议的基础上,手动拼装http格式报文.所以初步猜测是http协议格式错误导致的. 这...
  • 1.http协议 3 二.传输层4 1. UDP协议 4 2. TCP协议 4 三.网络层9 1.ARP协议 9 2. IP报文 10 四. 数据链路层11 (1)MAC帧格式 11 (2)MAC地址分析 12 五. 总结13 一.应用层 1.http协议 (1)...
  • 抓包分析HTTP协议报文格式 租房协议 在我们的日常生活中(前提是你家的没有矿),一般当我们去租房的时候,房主总会给我们一个协议双方必须在上面签字达成共识,这样才具有法律效率。不知道你有没有发现这种...
  • HTTP协议初认识

    2020-06-26 18:20:27
    TCP和HTTP协议使我们之后都比较重要的协议。目前用浏览器打开的一个网页都是基于HTTP协议来进行传输的,APP内部数据大概率也是基于HTTP...我们学习HTTP协议,主要需要理解协议报文格式。 可以借助抓包工具分析具体HT
  • Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,分析数据,设置断点,修改请求/响应数据,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要...
  • Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,分析数据,设置断点,修改请求/响应数据,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要...
  • Javaweb---网络(4)-http

    2020-07-01 15:22:42
    通过"抓包"工具分析HTTP具体的协议内容(此处使用fiddler) 请求内容: 这是一个方法为GET的请求(无body) 这是一个方法为POST的请求 (含body) 响应内容: HTTP的方法: GET和POST区别[重点]: HTTP的状态码: ...
  • 深度解密HTTP通信细节

    2019-01-20 15:06:23
    分析关闭服务进程关闭docker重启docker正常请求HTTP协议分析整体介绍编码MIME类型URI/URL/URNHTTP方法状态码报文格式HTTP协议进阶代理缓存cookie实体和编码国际化支持重定向与负载均衡HTTP重定向DNS重定向HTTP连接...
  • 原文地址:http://nanjingfm.blog.51cto.com/2121842/1192041 ...我们现在R1路由器上面开启EIGRP进程,R2上暂时不开启,然后使用wireshark进行抓包分析: 由此可见,当将接口IP所在网...
  • 例如使用抓包工具,无需任何配置就可查看任何使用HTTP协议的通信数据; 不验证通信方身份 不验证通信方的身份,将导致通信过程被窃听后,可能会遭遇伪装,例如使用抓包工具抓取数据后,就可按照数据包的格式构造...
  • 计算机网络实验3

    2018-01-23 15:51:16
    计算机网络实验报告3 利用Ethereal嗅探器,研究HTTP协议的以下几方面...基本的GET/回答交互 HTTP报文格式 ...持久和非持久链接 ...用wireshark分析http协议1、接入Internet的计算机主机; 2、抓包工具wireshark和截图工具。

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

抓包分析http协议报文格式