备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 杰哥技术分享 使用wireshark抓取TCP包传输分析
1 1

海报分享

原创

使用wireshark抓取TCP包传输分析

前言

介绍

本篇文章是使用wireshrak对某个https请求的tcp包进行分析。

目的

通过抓包实际分析了解tcp包。

准备工作

在我自己机子上安装的是wireshark2.2.6版本,随机查找了某个TCP连接,并跟踪流。

2018228104429-1
2018228104751-2
201822817932-29

传输

创建连接

  • No58: 10.60.45.187:17932(后面简称客户端)向131.25.61.68:443(后面简称服务端)发送了 SYN 请求连接,此时客户端发送的seq=0,ack=0。
  • No79:服务端向客户端发送了 SYN+ACK 确认连接,此时服务端发送的seq=0,ack=1。
  • No81:客户端接收到服务端的 SYN+ACK 向服务端响应 ACK 包,此时客户端发送的seq=1,ack=1。由于抓到的tcp是使用了https协议,建里连接需要先进行认证,步骤如下图所示。
    20182281194-4

握手

  • No84: 客户端向服务端发起握手请求,具体包格式及内容这里不做详细分析。
    201822811650-3
    这里SSL总长度为239字节(其中 ContentType 为1字节, Version 为2字节, Length 为2字节,再加上后续握手协议长度234。)。
2018228112520-5
2018228112523-6
2018228112526-7
  • No103: 服务端接收到客户端握手请求后响应 ACK 包,此时seq=1,ack=1。这个发送的是一个特殊的 TCP Window Update ,服务端告知客户端服务端有足够的缓存大小(8192),可以正常接收客户端数据。若出现了 TCP Window Full 包表示缓存区已满,客户端会停止发送,直到接收到了 TCP Window Update 包。(Window值表示滑动窗口,允许接收到多个包同时响应一个ACK包)
  • No104: 服务器向客户端发送握手,由于服务端需要返回证书、算法等信息,因此包可能会大于1460字节,会发生拆包现象(No136可看到该包总大小为5984KB,拆分了5个包发送)。当前服务端发送的seq=1,ack=240(当前包大小为1460,No84说明客户端包大小为239。)
    201822811397-8
  • No105: 服务器向客户端发送握手数据,这个包标记的是 TCP Previous segment not captured ,说明发送包可能出现了乱序或丢包现象,这个包的seq=2921,而No104的下一个包seq应该为1461,No104和No105中间seq=1461的包可能丢包或乱序传输。
    2018228114447-9
  • No106: 服务器向客户端发送握手数据,这个包的seq=4381,因为No105的下一个包的seq和这个包一样,所以这两个包是按顺序传输的。当前包的下一个包seq=5841。
    2018228115030-10
  • No108: 这个包是客户端向服务端发送的一个 ACK 其中ack=1461,表示客户端确认收到了No104这个包。
    201822816532-23
  • No118: 服务器向客户端发送 ACK 包,这个包标记的是 TCP Out-Of-Order ,由于No105包显示出现了丢包现象,因此tcp将No104以前的包全部重传,这个包实际就是No104。
    201822812016-12
  • No119: 客户端向服务端发送 ACK 包,这个包标记的是 TCP Dup ACK 108#1 ,表示重传ACK包,这个包是由于No118包引起的(#N表示重传N次,这里重传了1次),因为No118包服务端向客户端发送了一个乱序的包,而客户端在No108包已经确认接收到No104这个包,seq应该为1461,所以,客户端再一次重传108包告知服务端客户端已经接收到No104包,这个包实际服务端已经接收到了因此会被丢弃。
  • No123和No124: 服务器向客户端发送握手数据,包标记的是 TCP Retransmission ,两个包的seq分别为1461和2921,由于服务端认为已经发了这两个包(实际seq=1461的包没发,由No105可看出,seq=2921的包发了,但是客户端没有响应响应的ACK包),然后长时间收不到客户端的ACK包,因此服务端会重发这两个包。
    201822812398-13
  • No127: 客户端向服务端发送 ACK 包。seq=240,ack=5841,表示已经接收到服务端seq=5841以前的所有包。
  • No132: 服务器向客户端发送握手数据,包标记的是 TCP Spurious Retransmission ,表示这个包已经发送过。该报的seq=1461,即No123重传的包,虽然客户端向服务端发送了 ACK 包收到了seq=5841以前的包,但是服务端可能没有收到这个ACK包。
    2018228135613-14
  • No133: 客户端向服务端发送 ACK 包。seq=240,ack=5841。包标记的是 TCP Dup ACK 127#1 。由于客户端在No127已经返回了ack=5841,但是服务端在No132还是重传了之前已经传过的包,所以客户端认为No127包可能服务端没有收到,所有这里重传了No127这个ACK包,这个包服务端已经接收到了,因此会被丢弃。
  • No136: 服务端向客户端发送的最后一个握手包。seq=5841。下个包seq=5985,在这包汇总了5个分段包内容和信息。
    201822814102-16