Wiershark实验

一、数据链路层

实作一 熟悉 Ethernet 帧结构

使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。

Ethernet 帧的结构

以太网桢的桢格式分为前同步码、目的MAC、源MAC、类型、数据、CRC校验。其桢格式图如下所示:

前同步码(8个字节): 前7个字节都是10101010,最后一个字节是10101011。用于将发送方与接收方的时钟进行同步,主要是有不同的以太网类型,同时发送接收速率也不会完全精确的帧速率传输,因此需要在传输之前进行时钟同步。

目的MAC(6个字节): 某个目的机器的MAC地址,桢的目的地址无论是目的MAC地址,还是MAC广播地址,该桢都会将该桢的数据字段的内容传递给网络层,如果它收到任何其他的MAC地址的桢都会丢弃掉。

源MAC(6个字节): 标示传输该桢到局域网上的机器的MAC地址。

类型(2个字节): 这是网络协议分层设计减小耦合度的精心设计,这允许以太网多路复用网络层协议,可以支持除了IP协议之外的其他不同网络层协议,或者是承载在以太网帧里的协议(如ARP协议)。接收方根据此字段进行多路分解,从而达到解析以太网帧的目的,将数据字段交给对应的上层网络层协议,这样就完成了以太网作为数据链路层协议的工作。

CRC(4个字节): 循环冗余检测,目的机器在接收的时候用来检测该桢中是否引入了差错。

数据字段(46-1500个字节): 传输的数据字段,以太网最大的传输单元为1500个字节,当超过1500个字节时,主机会对数据进行分片操作,数据字段最小为46个字节,当不足46个字节的时候,数据就会被填充到46个字节,这就意味着此时数据字段包含了数据部分和填充部分。

Wiershark分析以太网桢结构

✎ 问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,这是什么原因呢?

WireShark从1.2以后的版本开始,默认不打开TCP/UDP协议的校验和检查了。导致有时看不出来数据包的校验和是否正确,界面显示“validation disabled”(即禁止校验),因为有时校验和会由网卡计算,这时wireshark抓到的本机发送的数据包的校验和都是错误的,所以默认关闭了WireShark自己的校验。

实作二 了解子网内/外通信时的 MAC 地址

  1. ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?

本机的MAC地址是08:f8:bc:6b:fe:01 ,发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是30:24:32:20:df:a5,这个mac地址是旁边电脑的。

  1. 然后ping www.baidu.com(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?


    从以上两张图可以清晰的看出,本机的MAC地址是08:f8:bc:6b:fe:01 ,本机发出帧的目的 MAC 地址以及返回帧的源 MAC 地址都是00:74:9c:9f:40:13 ,这个MAC地址是本机网关的地址。

  2. 再次 ping www.cqjtu.edu.cn(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?

    本机发出帧的目的 MAC 地址以及返回帧的源 MAC 地址都是00:74:9c:9f:40:13 ,这个MAC地址依旧是本机网关的地址。

✎ 问题
通过以上的实验,你会发现:
访问本子网的计算机时,目的 MAC 就是该主机的,访问非本子网的计算机时,目的 MAC 是网关的,这是什么原因呢?

因为本机接收到到的本子网以外的信息一定会经过网关发送给我,同理本机发送到本子往外信息的下个地址必定是网关的mac地址。而本子网内的数据不用经过网关,即可以直接到达。

实作三 掌握 ARP 解析过程

  1. 为防止干扰,先使用 arp -d *命令清空 arp 缓存,Mac是使用arp -ad命令清空arp缓存
  2. ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。

ping 192.168.43.120


请求的目的mac是30:24:32:20:df:a5

回应的源 MAC是30:24:32:20:df:a5 和目的 MAC 地址是08:f8:bc:6b:fe:01

  1. 再次使用 arp -ad命令清空 arp 缓存
  2. 然后ping www.baidu.com(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。

    该地址是f9 (dc:72:9b:df:91:f9,是广播地址。

✎ 问题
通过以上的实验,你应该会发现,

  1. ARP 请求都是使用广播方式发送的
  2. 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。

请问为什么?

因为当没有配置缺省网关的计算机要和其他网络中的计算机实现通信时,网关收到源计算机的ARP请求会使用自己的MAC地址与目标计算机的IP地址对源计算机进行应答,访问非子网IP时是通过路由器访问的,路由器再把发出去,目标IP收到请求后,再通过路由器端口IP返回去,那么ARP解析将会得到网关的MAC。

网络层

实作一 熟悉 IP 包结构

ip包结构

  1. 版本4位,表示版本号,目前最广泛的是4=B1000,即常说的IPv4;相信IPv6以后会广泛应用,它能给世界上每个纽扣都分配
    一个IP地址。

  2. 头长4位,数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部分)。

  3. 服务类型,包括8个二进制位,每个位的意义如下:
    过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
    延迟字段:1位,取值:0(正常)、1(期特低的延迟)
    流量字段:1位,取值:0(正常)、1(期特高的流量)
    可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
    成本字段:1位,取值:0(正常)、1(期特最小成本)
    保留字段:1位 ,未使用

  4. 包裹总长16位,当前数据包的总长度,单位是字节。当然最大只能是65535,及64KB。

  5. 重组标识16位,发送主机赋予的标识,以便接收方进行分片重组。

  6. 标志3位,他们各自的意义如下:
    保留段位(2):1位,未使用
    不分段位(1):1位,取值:0(允许数据报分段)、1(数据报不能分段)
    更多段位(0):1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

  7. 段偏移量13位,与更多段位组合,帮助接收方组合分段的报文,以字节为单位。

  8. 生存时间8位,经常ping命令看到的TTL(Time To Live)就是这个,每经过一个路由器,该值就减一,到零丢弃。

  9. 协议代码8位,表明使用该包裹的上层协议,如TCP=6,ICMP=1,UDP=17等。

  10. 头检验和16位,是IPv4数据包头部的校验和。

  11. 源始地址,32位4字节,我们常看到的IP是将每个字节用点(.)分开,如此而已。

  12. 目的地址,32位,同上。

  13. 可选选项,主要是给一些特殊的情况使用,往往安全路由会当作攻击而过滤掉,普联(TP_LINK)的TL-ER5110路由就能这么做。

以上参考博文https://blog.csdn.net/prsniper/article/details/6762145

Wireshark 抓包熟悉 IP 包结构

使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。

版本(Version): 4位。IP版本号。
包头长(IHL): 4位。以4字节为单位,如0101表示IP包的包头长度20字节。
服务类型(TOS,Type of service): 1字节。指示路由器如何处理该数据包。
总长(Total Length): 2字节。IP数据包的总长度。
标识(Identification): 2字节。系统范围内,每发出一个IP包,其值自动增加1。
分段标志:

  1. 保留位:1位
  2. 不分段(DF,Don’t Fragment):1位
  3. 更多段(MF,More Fragments):1位
  4. 分段偏移:13位。

生命期(TTL,Time to live): 1字节。每经过1个路由器,其值自动减1。
负载协议: 1字节。IP数据包负载的协议。
头部校验和(Header checksum): 2字节。只校验头部校验和,不包括负载。
源地址(Source address): 4字节。
目标地址(Destination address): 4字节。

✎ 问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?

IP的头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度的字段是因为接收端需要读数据,接收数据,便于传输时的识别IP总长度,节省时间。

实作二 IP 包的分段与重组

根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。

缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。

此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等

✎ 问题
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?

直接丢弃再通知发送端进行重传,由于在 IPv6中分段只能在源与目的地上执行,不能在路由器上进行。因此当数据包过大时,路由器就会直接丢弃该数据包,并向发送端发回一个"分组太大"的ICMP差错报文,之后发送端就会使用较小长度的IP数据报重发数据。

实作三 考察 TTL 事件

在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。

请使用 tracert www.baidu.com命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。在Mac上,没有tracert这个命令,而是traceroute命令来进行追踪。


路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1,因此先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。

✎ 问题
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?

ICMP 回显应答的 TTL 字段值为 128;TTL为返回值,跳数就为128-50=78跳。

传输层

实作一 熟悉 TCP 和 UDP 段结构

TCP段结构


来源连接端口(16位长): 源端口号16 bit

目的连接端口(16位长): 目的端口号

序列号(seq,32位长): 指segment中地一个字节的编码。建立连接时,双方随机选择序列号。

确认号(ack,32位长): 希望接收的下一个字节的序列号。累计确认机制,该确认字节号前的数据均一正确接收。

数据偏移(4位长): 以4字节为单位计算出的数据段开始地址的偏移值,由于有内存对齐,单位为32 bit。最大15 * 32 / 8 = 60 byte。

保留(3比特长): 保留位,留待以后使用,全部为0。

标志符(9比特长):

  1. NS: 拥塞控制随机和(ECN Nonce Sum),用于防止TCP发送者的数据包标记被意外或恶意改动。
  2. CWR(Congestion Window Reduced): 减少拥塞窗口,接受方标志位ECE设置后,设置CWR标志位,以告知对方,已接受到拥塞通知。
  3. ECE(Explicit Congestion Notification): 显式拥塞通知, 接受方检测到网络拥塞后,设置ECN-Echo标志位来指示拥塞。
  4. URG: 为1表示高优先级数据包,紧急指针字段有效。
  5. ACK: 为1表示确认号字段有效。
  6. PSH: 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
  7. RST: 为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
  8. SYN: 为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步。
  9. FIN: 为1表示发送方没有数据要传输了,要求释放连接。

窗口(WIN,16位长): 表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。

校验和(Checksum,16位长): 对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。

紧急指针(16位长): 本报文段中的紧急数据的最后一个字节的序号。

选项字段(最多40字节): 每个选项的开始是1字节的kind字段,说明选项的类型

TCP段结构解释引用博文https://www.jianshu.com/p/4b5982ba1d25

Wireshark 抓包熟悉 TCP 段结构

用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段

由上图可以看出,源端口49669,目的端口14000,序列号157,确认号367,Flags为0x010,窗口大小4093,检验和0xcd8f。

UDP段结构

UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

源端口(2 字节): 发送方端口号

目的端口(2 字节 ): 接收方端口号

报文长度(2 字节): UDP 用户数据报的总长度,以字节为单位。

校验和(2 字节): 检测 UDP 用户数据报在传输中是否有错,有错就丢弃。

Wireshark 抓包熟悉 UDP 段结构

用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。

源端口 60389,目的端口9405,长度117,校验和0xf513

✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?

源端口是指发送数据包的一方的端口,目的端口是指接受数据包的一方的端口在数据包头会包含源端口以及地址和目的地端口和地址。在一台机器上,一个进程对应一个端口。端口的作用就是用来唯一标识这个进程。源端口标识发起通信的那个进程,目的端口标识接受通信的那个进程。有了端口号,接受到报文后才能够知道将报文发送到哪个进程。

实作二 分析 TCP 建立和释放连接

  1. 打开浏览器访问qige.io网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
  2. 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。

    三次握手的标志位:
  • 客户端发送数据, 序列号seq:标记数据段的顺序。
  • 客户点请求建立连接,确认号ack:期待收到对方下一个报文段的第一个数据字节的序号。
  • 服务端同意建立请求,回复确认。 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
  • 连接建立完成。 同步SYN:连接建立时用于同步序号。
  • 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

第一次握手的标志位为SYN,代表客户端请求建立连接:SYN=1 Sep= x
第二次握手由对方发回确认包,标志位为SYN,ACK:SYN=1,ACK=x+1,Sep=Y
第三次握手客户端再次发送确认包:ACK=Y+1,Sep=Z

  1. 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。

四次挥手释放包的查找也可以用标志位进行查询,如下:
FIN=1,其序列号为seq=u; TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。服务器发送完数据后,再次向客户端发送连接释放的确认。FIN=1,ack=u+1,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。客户端收到服务器的连接释放报文后,必须发出确认,ACK=1。服务器只要收到了客户端发出的确认,释放连接。

建立状态:FIN=1, seq=u
服务器确认:ACK=1,seq=u,ack=u+1
服务器询问释放连接:FIN=1, ACK=1,seq=w,ack=u+1
用户端回复:ACK=1,seq=u+1,ack=w+1
✎ 问题一
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?

Follow TCP Stream是对ip A port A和ip B port B的对应,加上src/dst的转换。用tsp过滤了抓包之后,由于存在多个tcp连接,因此会出现多个包,从而不能一下子找到自己想要的包。因此需要分清楚抓到的包是否包含了多个tsp连接的数据。然后找到正确的连接,再使用follow tcp stream功能进行对于TCP流的跟踪。这种连接属于短连接,一旦数据发送完成后就会断开连接。虽然断开连接,但是页面还是存在,
所以页面已经被缓存下来了。一旦需要重新进行发送数据,就要再次进行连接。这样连接是为了实现多个用户进行访问,对业务频率不高的场合节省通道的使用,不让其长期占用通道。

✎ 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?

在最终的数据交换有四次,其中第二次和第三次可以合并,当出现这种情况时就只能抓到三个包。如果对方也没有数据发给本端,那么对方也会发送FIN给本端,用于关闭从对方到本端的连接,这就可能出现ACK和FIN合在一起的情况。

应用层

应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。

DNS结构分析

DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。

上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。

整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。下面将详细地介绍每部分的内容及含义。
基础结构部分
DNS 报文的基础结构部分指的是报文首部,如图所示。

该部分中每个字段含义如下。
事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。

  • 标志:DNS 报文中的标志字段。
  • 问题计数:DNS 查询请求的数目。
  • 回答资源记录数:DNS 响应的数目。
  • 权威名称服务器计数:权威名称服务器的数目。
  • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

基础结构部分中的标志字段又分为若干个字段,如图所示。https://img-blog.csdnimg.cn/2020122109552247.png
标志字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
    rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

实作一 了解 DNS 解析

  1. 先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。

Mac清理缓存命令和Windows不一样,Mac是使用dscacheutil -flushcache命令。

2. 你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。

  1. 可了解一下 DNS 查询和应答的相关字段的含义

✎ 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?

为了使服务器的负载得到平衡(因为每天访问站点的次数非常多)网站就设有好几个计算机,每一个计算机都运行同样的服务器软件。这些计算机的IP地址不一样,但它们的域名却是相同的。第一个访问该网址的就得到第一个计算机的IP地址,而第二个访问者就得到第二个计算机的IP地址。

实作二 了解 HTTP 的请求和应答

  1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。

用 Wireshark 抓包:

http 过滤再加上 Follow TCP Stream:

2. 请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。

请求头(Request):

  • Accept:text/html application/xml 告诉服务器客户端浏览器这边可以出里什么数据;
  • Accept-Encodeing:gzip 告诉服务器我能支持什么样的压缩格式
  • accept-language:告诉服务器浏览器支持的语言
  • Cache-control:告诉服务器是否缓存
  • Connection:keep-alive 告诉服务器当前保持活跃(与服务器处于链接状态)
  • Host:远程服务器的域名
  • User-agent:客户端的一些信息,浏览器信息 版本
  • referer:当前页面上一个页面地址。一般用于服务器判断是否为同一个域名下的请求
    意义:
  • Accept:告诉WEB服务器自己接受什么介质类型;
  • Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号;
  • POST:请求的方式,其中包括URI和版本;
  • GET:获取的方式等等。
  1. 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。

返回头:

  • cache-control:private/no-cache; 私有的不需要缓存/no-cache也不需要缓存
  • connection:keep-live; 服务器同意保持连接
  • content-Enconding:gzip;除去头的剩余部分压缩返回格式
  • content-length:内容长度
  • content-type:text/css;返回内容支持格式
  • Date: 时间
  • server:ngnix 服务器类型
  • set-Cookie:服务器向客户端设置cookie 第一次访问服务器会下发cookie当作身份认证信息,第二次访问服务器再把cookie送给服务器,可以当作认证信息
  • last-modified: 时间戳 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not
  • Modified)状态。Last-Modified也可用setDateHeader方法来设置。
  • expires 告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存
  • etag:版本专有的加密指纹。(有的网站不用,并非必须)优先检查etag再检查last-modified的时间戳。向服务器请求带if-none-match,服务器判断是否过期未过期返回304,过期返回200


可以看出应答的代码是101,该代码是响应客户端的 Upgrade 标头发送的,并且指示服务器也正在切换的协议。

✍ 建议:
HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。

✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?

浏览器中在本地会有缓存,可以直接在缓存区获取到需要的内容,而不需要服务器在回复对应的内容,可以减少服务器的一些工作,减小开销。200应答是要完全的将内容发送给客服端,这会极大的增加服务器的开销。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值