zoukankan      html  css  js  c++  java
  • 使用Wireshark分析网络数据

    一、

    1)、

    Wireshark中查看TCP的三次握手和四次挥手:

    上面的数据发送和接收两部分的info提示都是 [TCP segment of a reassembled PDU],网上的解释是TCP分片的提示,但我只是发送和接收了十几个字节数据,远未超过MSS值。后来换了服务器模式(原来用的是简单阻塞模式的TCP socket服务器模型,现在换成了异步完成端口模型),发现数据发送和接收两部分的info提示变成了[PSH, ACK],如下图,暂时还不知道为什么会有这种区别。

    从上图可以看到:

     1、刚开始双方数据的序号都为0(seq=0),然后会随着发送数据的增长而增长,因为序号就是本数据报的第一个数据字节在整个发送数据流中的偏移量。而SYN和FIN包虽然一般不携带数据但他们占一个字节的数据流空间,ACK包则不占用数据流空间,所以在发送SYN/FIN/SYN+ACK/FIN+ACK包后seq会加1,而发送ACK包后seq不变。一般情况下报文的确认号(ack)会与下次收到的对方发来数据的序号(seq)相同,除非发生了乱序。

     2、ACK包是可以和SYN、PSH、FIN和并发送以节省时间的(TCP帧头中对应标志位置1),比如三次握手中的SYN+ACK,四次挥手中的FIN+ACK,发送数据中的PSH+ACK。注意这里的第三次挥手也为FIN+ACK,而这里我没看出前面有什么数据要进行确认,还有第一次发送数据的时候也是这样,多了一个ACK标志,为PSH+ACK,为什么会这样呢?我个人猜测可能是这样做就不用判断前面还有没有数据要确认:对于数据传输报文和关闭连接报文不管前面有没有要确认的数据都将ACK标志置1,方便快捷,也不会带来什么问题。

       PSH强调的是尽快将数据交付给上层,TCP接收方在收到PSH置位的数据报文后会立即将缓冲区中数据发送给上层,而如果TCP接收方收到的是PSH没有置位的报文,则会等待缓冲区满才将缓冲区中数据发送给上层。那么什么时候PSH位会被置1呢?经我测试发现,如果不是分片数据或者是最后一个分片数据,PSH会被置位,标志位为PSH+ACK,如果是分片数据但不是最后一个分片数据,PSH不会被置位,标志位只有ACK。

     3、报文信息中的Len表示携带数据的大小;Win是本端"接收窗口"的大小,用来告知对端,从而控制对端"发送窗口"的大小,以达到控制传输流量。

     4、MSS称为最大分段大小,在上图中可以看到在双方连接的时候会发送自身MSS值,而这个MSS值是根据本机MTU计算而来的:MSS = MTU - IP报文头的20bytes - TCP报文头的20bytes,TCP协议会选择双方较小的mss作为TCP分片的大小。因为以太网MTU是1500或者大于1500,所以用Wareshark查看TCP三次握手中双方发送的MSS值都为1460。

    2)、

       

       

      上面是客户端连接到服务器后发送"This is client!"数据后关闭连接的示例,仅显示客户端发送的数据(tcp.dstport==4567)。点击第三个包在下面可以看到包的相关信息,其中Frame表示整个以太网帧,点击可以看到以太网帧的长度等帧信息;Ethernet为以太网帧头的信息,点击可以看到包括源MAC地址、目的MAC地址,类型三种内容;Internet Protocol为IP头,点击可以看到其包括了源IP地址、目的IP地址等IP头信息;Transmission Control Protocol是传输控制层,可以为TCP、UDP等协议,这个示例使用的TCP协议,所以这里是TCP头,其中包含了源端口号、目的端口号、类型Flags(这里是PSH+ACK,表示为数据传输包)等TCP首部信息;Data即为发送的数据,可以看到数据("This is client!")的二进制内容,长度为16个字节。

      可以看到上面每行的帧信息的Len值除了数据包是16外,握手包和挥手包的Len都是0,所以Len实际上是以太网帧携带数据的大小。如果我们发送的数据大小大于MSS(从上面的SYN包可以看到MSS值为1460),那么就会导致数据被分割,如下所示为向服务端发送4001个字节大小数据的情况,可以看到数据被分为了三个以太网帧,第一和第二个包中数据长度为1460,第三个包中数据长度为1081,加起来总共为4001个字节的数据。而且可以看到,三个数据包中第一个和第二个包为ACK类型,只有最后一个包是PSH+ACK类型。对于发起握手的SYN包和挥手的FIN包,可以看到是以灰色进行显示的。

      

     3)、

      下面为服务器未开启的时候connect失败的情况,可以看到服务器发回了RST包:

     

     4)、

      下面是使用浏览器请求 http://192.168.150.238:7070/captchaImage 的抓包结果,可以看到虽然我们使用的是7070端口,可浏览器还是对服务器的80端口先进行了一次连接,未执行成功后便关闭了连接,这应该是QQ浏览器先自动使用上次使用的端口号进行连接的策略,换成谷歌浏览器就没有这种情况。下面对7070端口发起了两次TCP连接,但只使用了其中的4706端口的连接来进行http通信,个人猜测另一个4707端口的连接是备用的连接。

      

      我们点击第315号的http请求帧,如下所示我们可以看到整个帧的内容:包括以太网包头+IP包头+TCP包头+HTTP包,点击HTTP包可以看到http的开始行以及Host、Connection等首部信息。

      

      点击第344号的http应答包,可以看到整个包实际上是被TCP分成了4个包来分片发送,通过这个最后一个包可以看到整个http包的数据,如下所示可以看到http应答包中的应答行、首部信息、报文主体,报文主体又称报文实体,在这里为json数据,点击可以查看该json数据包含元素的键和值。

      后面我们可以看到浏览器又发送了一个"GET /favicon.ico HTTP/1.1"请求,这个是浏览器请求当页面被收藏的时候在收藏夹栏中该页面的图标。在请求、应答都发送完毕一段时间后可以看到又发送了keep alive包来保持连接,最后服务器主动关闭了连接。

    二、

    过滤器分为两种,一种是捕捉过滤器,一种是显示过滤器。下面是Wireshark中一些常用的显示过滤器设置:

    过滤IP地址、源IP地址、目的IP地址:ip.addr == 192.168.0.38、ip.src==1.1.1.1、ip.dst==192.168.101.8。

    标识过滤:显示包含TCP SYN标志的封包:tcp.flags.syn == 0x02`。

    端口过滤、目的端口过滤、源端口过滤:tcp.port==6000、tcp.dstport==6000、tcp.srcport==6000。

    协议过滤(直接输入协议名):tcp、http。

    使用连接符and(&&)、or(||):ip.src==1.1.1.1 and tcp.port==6000、ip.src==1.1.1.1 or ip.src==2.2.2.2。

    http模式过滤,如过滤get方法:http.request.method=="GET";过滤整个URL:http.request.full_uri == "http://www.sac.net.cn/tzgg/";过滤所有http请求:http.request==1;过滤所有http响应:http.response==1;过滤URL中包含指定内容:http.request.full_uri contains "www.sac.net";过滤域名:http.host == "www.sac.net.cn",http.host contains "sac";

    三、

    Wireshark中TCP常见错误状态:

    TCP Previous segment not captured  乱序包
    TCP Retransmission  重传包
    TCP fast retransmission  快速重传包
    TCP Dup ACK  报文丢失ACK

  • 相关阅读:
    大道至简第四章读后感
    JAVA类与对象
    大道至简第三章读后感
    JAVA语法基础 动手动脑及课后作业
    课程作业01
    大道至简第二章读后感
    大道至简第一章读后感
    swift学习笔记之-自动引用计数
    swift学习笔记之-继承
    swift学习笔记之-闭包
  • 原文地址:https://www.cnblogs.com/milanleon/p/6572016.html
Copyright © 2011-2022 走看看