wireshark中带有SLE和SRE的SACK包详解和常规过滤

(605) 2024-04-03 17:01:01

一、名词解释

SLE: Sequence Left Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp数据的左边界。
SRE: Sequence Right Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp数据的右边界。


二、 使用场景

wireshark中带有SLE和SRE的SACK包详解和常规过滤 (https://mushiming.com/)  第1张

SACK在数据丢包需要重传时起作用。比如,服务器已发送的数据为1~34454个包,但是,客户端只收到了“1~22774,28614~34454”这些序列的包,也就是说“22775~28613”这些包已经丢了。这个时候,客户端会向服务器请求发送回馈包,说我收到了seq为22774的包,同时也乱序收到了"SLE为28614,SRE为34454"的包。那么,服务器就知道,接着从seq=22775的包开始发送,发送到seq=28613的包的时候,就不用在发送seq=28614的包了,因为客户端已经收到了。
如果ACK中不带SLE和SRE会怎样呢?那服务器就会重发从"22775"开始之后的所有的包,包括其实客户端已经收到的"28614~34454"序号的包,那就浪费网络带宽了,不是么。

三、多个乱序段的情况
    实际情况中较少见,因为这代表着隔三差五就有丢包,丢包率应该很大。
    就我们使用的有线链路而言,丢包率不足0.1%,无线链路大约在5%左右。【注 1】
    在RFC2018中详述了SACK包格式。
    有多个数据块乱序的情况下,SLE和SRE也可以有多组,但因为头部字节限制,最多为4组。

sack选项
   选项类型: 5
   选项长度: 可变,但整个TCP选项长度不超过40字节,实际最多不超过4组边界值。
                         +--------+--------+
                         | Kind=5 | Length |
       +--------+--------+--------+--------+
       |      Left Edge of 1st Block       |
       +--------+--------+--------+--------+
       |      Right Edge of 1st Block      |
       +--------+--------+--------+--------+
       |                                   |
       /            . . .                  /
       |                                   |
       +--------+--------+--------+--------+
       |      Left Edge of nth Block       |
       +--------+--------+--------+--------+
       |      Right Edge of nth Block      |

       +--------+--------+--------+--------+

图2是1组边界的抓包截图

wireshark中带有SLE和SRE的SACK包详解和常规过滤 (https://mushiming.com/)  第2张

注:

【1】无线链路的丢包率不确定,也有20%的情况

参考:

https://ask.wireshark.org/questions/1389/what-are-sre-and-sle?sort=votes

http://blog.chinaunix.NET/uid-28387257-id-3624060.html

一、基本语法。

a)        ip.src == 192.168.0.2 && ip.dst == 192.168.0.3。红色部分可以是&&、||、! 等(或相应的英文:and、or、not)。

 

 

二、针对协议的过滤

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

               表达式为:http

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

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

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

           表达式为:not arp     !tcp

  (4)通过协议type来选择某种协议的数据包

           表达式为:eth.type == 0x0800    /*0x0800是ip协议的包*/

三、针对端口的过滤(视协议而定)

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

           表达式为:tcp.dstport ==80

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

           表达式为:udp.port >=2048

 

四、针对长度和内容的过滤

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

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

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

      表达式为:http.request.uri matches "vipscu"  (匹配http请求中含有vipscu字段的请求信息)

 

五、显示过滤关键字。

1、  ip.src == 192.168.0.2 (过滤ip源地址为*的包)

2、  ip.dst == 192.168.0.3 (过滤ip目的地址为*的包)

3、  tcp.dstport 80 xor tcp.dstport 1025(只有当目的TCP端口为80或者来源于端口1025(但又不能同时满足这两点))

4、  tcp.flags (显示包含TCP标志的封包)

5、  tcp.flags.syn == 0x02 (显示包含TCP SYN标志的封包)

 

六、捕捉过滤关键字

1、  tcp dst port 3128 (显示目的TCP端口为3128的封包)

         2、ip src host10.1.1.1 (显示来源IP地址为10.1.1.1的封包)

2、  host 10.1.2.3 (显示目的或来源IP地址为10.1.2.3的封包)

3、  src portrange 2000-2500 (显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包)

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

5、  src host 10.7.2.12 and not dst net 10.200.0.0/16

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

6、(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内的所有封包

THE END

发表回复