(精华)2020年8月17日 网页请求响应流程性能优化
发布日期:2021-06-29 15:10:03 浏览次数:2 分类:技术文章

本文共 12335 字,大约阅读时间需要 41 分钟。

一、一次完整页面请求所发生的的事情

在这里插入图片描述

1. url解析

  • 地址解析和编码

    参考:

  • HSTS

    网站采用 HSTS 后,用户访问时无需手动在地址栏中输入HTTPS,浏览器会自动采用 HTTPS 访问网站地址,从而保证用户始终访问到网站的加密链接,保护数据传输安全.
    HSTS Header的语法如下:
    Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]

    参考:

  • 缓存检查

2. DNS解析

在这里插入图片描述

在这里插入图片描述

Hosts文件是什么?

Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定。可以用文本文件打开!当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,浏览器会立即打开对应网页,如果没有找到,则浏览器会将网址提交DNS服务器进行IP地址解析。这也是提高快速打开网页的方法!

解析顺序

1) 浏览器缓存

当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在);

2) 系统缓存 hosts

当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;

3) 路由器缓存

当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存;

4) ISP(互联网服务提供商)DNS缓存

当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找;

5) 根域名服务器

当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;

6) 顶级域名服务器

顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;

7) 主域名服务器

主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;

8)保存结果至缓存

本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。

3. TCP的3次握手

参考:

所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:

在这里插入图片描述

4. 发送HTTP请求,服务器处理请求,返回响应结果

5. TCP的4次挥手

在这里插入图片描述

6. 浏览器渲染

7. 代码运行中

浏览器渲染流程 (步骤6)

  1. 构建DOM树,CSSOM树,Render渲染树

DOM树

  • 转换 把内存编码进行解析
  • 令牌 根据w3c生成令牌
  • 词法解析 根据词法解析,把令牌的东西解析成html标记结构
  • DOM构建 有标签有结构 有层级的dom树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZLXdhEG-1597674387979)(./pic/dom.png)]

优化点:

  1. 标签语义化
  2. 减少没有必要的嵌套 , 一般保持在 3-4级

CSSOM树

在这里插入图片描述

优化点:

  1. 标签语义化
  2. 选择器层级问题, 一般保持在 3-4级

Render渲染树

渲染树(render tree)是由可视化元素按照其显示顺序而组成的树,也是文档的可视化表示。它的作用是让您按照正确的顺序绘制内容。

在这里插入图片描述

为了构建渲染树,浏览器主要完成了以下工作:

  1. 从DOM树的根节点开始遍历每个可见节点。
    • 某些节点不会被渲染输出,比如script、link、meta等标签节点
    • 通过css隐藏的节点会被忽略,比如“display: none”。但是注意,visibility: hidden是会被渲染的(渲染成一个空框),因为它仍占据布局空间
  2. 对于每个可见的节点,找到CSSOM树中对应的规则,并应用它们。
  3. 根据每个可见节点以及其对应的样式,组合生成渲染树。

WebKit 渲染引擎的主流程:

在这里插入图片描述

总结步骤:

  1. 解析HTML Source,生成DOM树
  2. 解析CSS,生成CSSOM树
  3. 将DOM树和CSSOM树结合,去除不可见元素,生成渲染树(Render Tree)
  4. Layout(布局):根据生成的渲染树,进行布局(Layout),得到节点的几何信息(位置,大小),这个计算的阶段就是回流 => 布局(layout)+重排(reflow)
  5. Painting(重绘):根据渲染树以及回流得到的几何信息,将 Render Tree 的每个像素渲染到屏幕上

参考:

优化方案:

  • 标签语义化和避免深层嵌套

  • CSS选择器渲染是从右到左

  • 尽早的以及尽快的把CSS 下载到客户端(充分利用HTTP多请求并发机制)

    • style
    • link
    • @import,尽量不要用
    • css放在顶部

    加载顺序的差别:当一个页面渲染的时候,link引用的CSS会同时被加载,而@import引用的CSS会等到页面全部被下载完再加载。

    所以有时候浏览@import加载CSS的页面时会没有样式(就是闪烁),网速慢的时候还挺明显

// 实例2. 内联样式引入green.css,link标签引入yellow.css         
  • 避免阻塞的js加载
    • js 放在底部
  • 修改元素样式时,更改其class属性是性能最高的方法。
  • 尽量用 transform 来做形变和位移

在这里插入图片描述

每个渲染对象都有 layout 和 paint方法,分别对应了回流和重绘的方法。

  • 减少DOM的回流和绘制

何时触发回流和重绘

触发回流(reflow)

回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流.

改变这些属性会触发回流:

  • 盒模型相关的属性: width,height,margin,display,border等

  • 定位属性及浮动相关的属性: top,position,float等

  • 改变节点内部文字结构也会触发回流:text-align, overflow, font-size, line-height, vertival-align等

    以及进行以下流程或操作:

  • 页面一开始渲染的时候

  • 添加或删除可见的DOM元素,进行DOM操作等

  • 内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代

  • 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)

  • css伪类激活

  • 进行获取布局信息的操作,比如offsetWidth、offsetHeight、clientWidth、clientHeight、width、height、scrollTop、scrollHeight,getComputedStyle, getBoundingClientRect等

触发重绘

重绘是一个元素外观的改变所触发的浏览器行为,例如改变visibility、outline、background-color等属性,这些属性只是影响元素的外观,风格,而不会影响布局的。

浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随回流。

我们根据渲染的流程可知,回流一定会触发重绘,而重绘不一定会回流

浏览器渲染性能优化 (步骤6,优化)

回流和重绘的代价是比较昂贵的,渲染性能优化,就是要尽可能减少Layout回流和Paint重绘发生的次数,将回流和重绘的影响范围限制在单独的图层之内

3.1 合并多次布局操作

我们可以合并多次对DOM和样式的修改,然后一次处理掉,以此来最小化回流和重绘操作,比如:

// badconst el = document.getElementById('test');el.style.margin = '5px';el.style.width = '100px';el.style.borderRight = '2px';

例子中,有三个样式属性被修改了,每一个都会影响元素的几何结构,引起回流。(当然,大部分现代浏览器都对其做了优化,只会触发一次。但是如果在旧版的浏览器或者在上面代码执行的时候,有其他代码访问了布局信息,那么就会导致三次回流)

我们合并所有的布局操作,然后统一处理,比如这样

// goodconst el = document.getElementById('test');el.style.cssText += 'margin: 5px;width: 100px;border-right: 2px; '

3.2 使用 transform 和 opacity 来实现动画

最佳的性能渲染流程,就是直接避开回流和重绘,只运行Composite合成这一操作。

目前可以有合成器单独处理的属性有两个:

transforms 和 opacity

比如我们可以使用translate代替left、top。

使用opacity代替visibility等

3.3 让复杂的布局“离线”

对于复杂的动画,或者频繁触发回流的元素,我们

创建一个documentFragment或div,在它上面应用所有DOM操作,最后再把它添加到window.document。

也可以在一个display:none的元素上进行操作,最终把它显示出来。因为display:none上的DOM操作不会引发回流和重绘。

也可以使用绝对定位,让它脱离文档流,从而避免引起父元素以及后续元素的频繁回流。

3.4 避免使用table布局

table的计算需要不止一次的遍历,table是可以影响之前已经进入的DOM元素的显示的元素。即使一些小的变化和会导致table中所有其他节点回流。

四、网络交互层面上的优化 (缓存,DNS)

4.1 减少HTTP请求的次数和请求资源的大小

  • 资源合并压缩
  • 字体图标
  • Base64
  • GZIP(一般的文件能压缩60%多)
  • 图片懒加载
  • 数据延迟分批加载
  • CDN 资源

4.2 应用缓存

浏览器与服务器通信的方式为应答模式,即是:浏览器发起HTTP请求 – 服务器响应该请求,那么浏览器怎么确定一个资源该不该缓存,如何去缓存呢?浏览器第一次向服务器发起该请求后拿到请求结果后,将请求结果和缓存标识存入浏览器缓存,浏览器对于缓存的处理是根据第一次请求资源时返回的响应头来确定的。具体过程如下图:

在这里插入图片描述

什么是浏览器缓存

在这里插入图片描述

参考:

浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

浏览器缓存的优点有:

1.减少了冗余的数据传输,节省了网费

2.减少了服务器的负担,大大提升了网站的性能

3.加快了客户端加载网页的速度

浏览器缓存主要有两类:缓存协商和彻底缓存,也有称之为协商缓存和强缓存。

1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中可以看到该请求返回200的状态码;

2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;

两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求。

缓存位置:

  • Server Worker :浏览器独立现成进行缓存
  • Memory Cache: 内存缓存
  • Disk Cache: 硬盘缓存
  • Push Cache:推送缓存 (HTTP2中的)

打开网页,地址栏输入地址,查找disk cache 中是否有匹配,如有则使用,如没有则发送网络请求。

普通刷新(F5):因为TAB并没有关闭,因此memmory cache 是可用的, 会被优先使用(如果匹配的话),其次才是disk cache .

强制刷新(Ctrl+F5):浏览器不适用缓存,因此发送的请求头部均带有Cache-control:no-cache(为了兼容,还带了Pragma:no-cache),服务器直接返回200以及最新内容

强缓存 Expires / Cache-Control

浏览器对于强缓存的处理,根据第一次请求资源时返回的响应头来确定的

  • Expires: 缓存过期时间,用来指定资源到期的时间 (HTTP/1)
  • Cache-Control: 当值设为max-age=300(300/60=5分钟)时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

cache-control除了该字段外,还有下面几个比较常用的设置值:

  • no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
  • no-store:直接禁止浏览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
  • public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  • private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:

Last-Modify/If-Modify-Since:浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间;当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存

Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。

If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定是否命中协商缓存;

关于 http协商缓存VS强缓存 ,可以参考下面的链接,非常不错

浏览器缓存过程

1.浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间一并缓存;

2.下一次加载资源时,先比较当前时间和上一次返回200时的时间差,如果没有超过cache-control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存读取该文件(如果浏览器不支持HTTP1.1,则用expires判断是否过期);如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since的请求

3.服务器收到请求后,优先根据Etag的值判断被请求的文件有没有做修改,Etag值一致则没有修改,命中协商缓存,返回304;如果不一致则有改动,直接返回新的资源文件带上新的Etag值并返回200;;

4.如果服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回200

协商缓存生效, 返回 304 和NOT Modified

在这里插入图片描述

协商缓存失效,返回 200 ,重新拿数据

在这里插入图片描述

4.1 DNS方面的优化

在这里插入图片描述

每一次DNS解析时间预计在20-120毫秒

  • 减少DNS请求次数
  • DNS 预获取

在这里插入图片描述

什么是dns服务器

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

在这里插入图片描述

dns是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

网关是你要访问另一网段,比如访问互联网的时候,就把数据包发送给网关,是你访问外网的网络关口,所以叫网关。有时网关就是你的外网ip,这取决于你的网络结构.

dns是把你要访问版的网站名称解析成ip地址,只有知道ip地址,数据包才能发送。dns和网关没有关系。

TCP 抓包工具

wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。

Wireshark 一般在抓包的时候无需过滤,直接在数据分析时候过滤出来你想要的数据就成了。

  1. 具体为Capture->Interface->(选择你的网卡)start 这时候数据界面就显示了当前网卡的所有数据和协议了。

  2. 下来就是找到我们想要的数据 教你一些技巧,比如我们要找ip地址为192.168.2.110的交互数据 可以在 Filter:里面填写 ip.addr == 192.168.2.110 (回车或者点Apply就OK) 如果我们只想抓TCP的 ip.addr == 192.168.2.110 && tcp (注意要小写) 如果不想看到ACK ip.addr == 192.168.2.110 && tcp && tcp.len != 0 如果要看数据包中含有5252的值的数据(注意此处为16进制) ip.addr == 192.168.2.110 && tcp && tcp.len != 0 && (data.data contains 5252)

  3. 含有很多过滤方法可以点击Express

下载地址 :

参考链接:

使用wireshark分析TCP ——以HTTP协议为例

对以太网帧、ip数据报、TCP报文结构的分析

以南邮图书馆网站为例,图书馆网址为:http://lib.njupt.edu.cn,对应的IP地 202.119.224.202。
设置wireshark的过滤条件为’ip.addr == 202.119.224.202’

这个过滤条件是哪拍网本地服务启动后的 ,因为是https服务,所以端口为 443

ip.addr == 39.105.171.16 && tcp.port == 443

如果想直接通过域名 获取ip 地址, 可以直接进cmd去ping他的域名就行, 比如 ping www.baidu.com – 》 39.156.69.79

对三次握手建立TCP连接的分析

在这里插入图片描述

图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的,这说明HTTP的确是使用TCP建立连接的。

1. 第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图

在这里插入图片描述

2. 第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图

在这里插入图片描述

3.第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方, 如下图:

在这里插入图片描述

在进过三次握手后和服务器建立了TCP连接,随后浏览器发出了取文件命令GET。

在这里插入图片描述

服务器给出响应,把文件发给浏览器。

最后释放TCP连接,

对四次挥手过程的分析

在这里插入图片描述

通过tcpdump+wireshark来抓包分析TCP长连接和短连接的区别

我就在想Http建立的TCP短连接,是什么时候断开连接的?

想TCP的这个长连接在不发生异常的情况下可以维持多久?

在这里插入图片描述

短连接就如上图所示,数据传输完成后,一般由客户端发起释放连接的信号,也可以看到,短连接是进行一次请求,请求结束后断开连接,Http请求到达服务器,就会立刻建立TCP连接,那是什么时候断开的呢?

是服务器return了结果后立刻结束么,还是别的情况?

长连接,和短连接最简单最直接的区别就是,他是为了服务器和客户端间的一个频繁的交互,之前的浏览器端定时的ajax轮询会消耗大量的资源,现在已经很少有人使用了;另一个,长连接比短连接更大的一个优势就是,服务器端可以维护和客户端建立的这个TCP通信的channel,这样就可以让服务器主动的给客户端发送数据,也等同于实现了全双工通信,这个也是相比ajax轮询更大的一个优势,可以实现事件的实时通知。

基于上面所讲的,我们来分析下长连接和短连接的优缺点:

  1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接;
  2. 长连接如果不主动关闭,这个连接会长久的存在,并且如果长连接滥用,或者不加任何限制,会导致连接数过多,会对服务器的产生较大的压力,因此长连接在使用时要慎用,做好评估和限制;
  3. 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

我们就开始使用tcpdump来进行抓包来分析上面让我们疑惑的两个问题,首先,我们启动服务端,长连接就是我们使用的WebSocket,短连接就是一个简单的无业务逻辑的一个接口,

​ 在电脑上启动tcpdump,命令如下,其中-w指定抓到的包的输入路径,如果没有-w的话,会将包输出到shell窗口:

sudo tcpdump -i lo0 -w /tmp/tcpdump/1.pcap port 8080

tcpdump命令的详解大家可以参考这篇博客:

​ 本文为了更好的分析,将日志输出到文件,并使用wireshark软件进行分析,数据包如下:

TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

它们的含义是:

  • SYN表示建立连接,
  • FIN表示关闭连接,
  • ACK表示响应,
  • PSH表示有 DATA数据传输,
  • RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置,用来异常的关闭连接。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的

概念补充-TCP三次握手:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

wireshark 实用过滤表达式

wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)

  1. 关键字
    “与”:“eq” 和 “==”等同,可以使用 “and” 表示并且,

“或”:“or”表示或者。

“非”:“!" 和 "not” 都表示取反。

多组条件联合过滤数据包的命令,就是通过每个单个的条件命令与关键字“与或非”的组合实现的。

  1. 针对ip的过滤
    针对wireshark最常用的自然是针对IP地址的过滤。其中有几种情况:

(1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包。

表达式为:ip.src == 192.168.0.1

(2)对目的地址为192.168.0.1的包的过滤,即抓取目的地址满足要求的包。

表达式为:ip.dst == 192.168.0.1

(3)对源或者目的地址为192.168.0.1的包的过滤,即抓取满足源或者目的地址的ip地址是192.168.0.1的包。

表达式为:ip.addr == 192.168.0.1,本表达式的等价表达式为

ip.src == 192.168.0.1or ip.dst == 192.168.0.1

(4)要排除以上的数据包,我们只需要将其用括号囊括,然后使用 “!” 即可。

表达式为:!(表达式)
  1. 针对协议的过滤

      (1)仅仅需要捕获某种协议的数据包,表达式很简单仅仅需要把协议的名字输入即可。

    表达式为:http      问题:是否区分大小写?答:区分,只能为小写

(2)需要捕获多种协议的数据包,也只需对协议进行逻辑组合即可。

表达式为:http or telnet (多种协议加上逻辑符号的组合即可)

(3)排除某种协议的数据包

表达式为:not arp   或者   !tcp
  1. 针对端口的过滤(视传输协议而定)

      (1)捕获某一端口的数据包

    表达式为:tcp.port == 80 (以tcp协议为例)

(2)捕获多端口的数据包,可以使用and来连接,下面是捕获高于某端口的表达式

表达式为:udp.port >= 2048 (以udp协议为例)
  1. 针对长度和内容的过滤

      (1)针对长度的过虑(这里的长度指定的是数据段的长度)

    表达式为:udp.length < 30 http.content_length <=20

(2)针对数据包内容的过滤

表达式为:http.request.urimatches “vipscu” (匹配http请求中含有vipscu字段的请求信息)

  1. 进阶
    通过以上的最基本的功能的学习,如果随意发挥,可以灵活应用,就基本上算是入门了。以下是比较复杂的实例(来自wireshark图解教程):

tcp dst port3128

显示目的TCP端口为3128的封包。

ip src host10.1.1.1

显示来源IP地址为10.1.1.1的封包。

host 10.1.2.3

显示目的或来源IP地址为10.1.2.3的封包。

src portrange2000-2500

显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。

not imcp

显示除了icmp以外的所有封包。(icmp通常被ping工具使用)

src host10.7.2.12 and not dst net 10.200.0.0/16

显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。

(src host10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net10.0.0.0/8

显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络10.0.0.0/8内的所有封包。

信息)

  1. 进阶
    通过以上的最基本的功能的学习,如果随意发挥,可以灵活应用,就基本上算是入门了。以下是比较复杂的实例(来自wireshark图解教程):

tcp dst port3128

显示目的TCP端口为3128的封包。

ip src host10.1.1.1

显示来源IP地址为10.1.1.1的封包。

host 10.1.2.3

显示目的或来源IP地址为10.1.2.3的封包。

src portrange2000-2500

显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。

not imcp

显示除了icmp以外的所有封包。(icmp通常被ping工具使用)

src host10.7.2.12 and not dst net 10.200.0.0/16

显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。

(src host10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net10.0.0.0/8

显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络10.0.0.0/8内的所有封包。

转载地址:https://codeboy.blog.csdn.net/article/details/108054799 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(精华)2020年8月17日 浏览器渲染引擎与阻塞
下一篇:(精华)2020年8月17日 C#基础知识点 Log4日志的用法

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月03日 04时37分25秒