TCP抓包实战分析

259 阅读4分钟

TCP抓包实战分析

wireshark简介

界面介绍

image-20230725220323378.png

Frame: 物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP,一般我们查看到就是这

Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议

过滤包

要想从海量数据包中获取有用数据,一定要会过滤数据包。

抓包过滤器语法:抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)

IP过滤

  • ip.src ==192.168.1.104: 过滤出源地址为192.168.1.104的数据包列表
  • ip.dst==192.168.1.104:过滤出目标地址为192.168.1.104的数据包列表
  • ip.addr == 192.168.1.104:过滤出源IP地址或目标IP地址为192.168.1.104的数据包列表
  • ip.addr == 10.160.246.9 and ip.addr == 10.160.255.246:过滤出A和B通信的数据包
  • ip host 60.207.246.216 and icmp:过滤出主机IP为60.207.246.216的ICMP数据包

协议端口过滤

  • tcp.port ==80:过滤出源主机或者目的主机端口为80的数据包列表。
  • tcp.srcport == 80:过滤出TCP协议的源主机端口为80的数据包列表。
  • tcp.dstport == 80:过滤出TCP协议的目的主机端口为80的数据包列表。
  • tcp.flags.syn == 1:过滤出SYN 标志位为 1 的包。

HTTP过滤

  • http.request.method=="GET":过滤出HTTP GET方法的。

专家分析

菜单栏-分析-专家分析

三次握手抓包实例

TCP Flags:状态控制码(Code,Control Flag),占 6 比特,含义如下:

标志位含义
URG:紧急比特(urgentURG=1 时,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), Urgent Pointer(紧急指针) 字段也会被启用
ACK:确认比特(AcknowledgeACK=1 时,代表这个封包为确认封包
PSH:(Push functionPSH=1时,代表立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送
RST:复位比特(Reset)RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接
SYN:同步比特(Synchronous)SYN=1 时,就表示这是一个新连接请求或连接接受报文
FIN:终止比特(Final)FIN=1 时,表明此报文段的发送端的数据已发送完毕,并要求释放连接

Ack 确认号(Acknowledgment Number)指的是自己期望接收的下一个字节的序号,也表示已经收到包的数量

客户端发送的seq是客户端的序列号,ack是服务端的序列号;服务端发送的seq是服务端的序列号,ack是客户端的序列号

即:seq是自己的序列号,ack是确认对方的序列号

注意图中有个错误,抓包来看传输数据的时候(PSH、ACK)seq和ack都没有+1

4c34d5034d259ef4ff631fc0cf7f5482.png

第一次握手,客户端发送一个TCP,标志位为SYN为1,确认号Ack为0(当前还没有收到包),序列号Seq(raw)为616411686,相对seq为0

image-20230726005226313.png

第二次,服务器发回确认包, 标志位SYN、ACK为1,将确认序号Ack设置为第一次的Seq(raw)616411686 加1,自己的Seq(raw)设置为 3351242404,相对seq为0

image-20230726005625485.png

第三次,客户端再次发送确认包,标志位SYN为0、ACK为1,将确认序号Ack设置为第二次的Seq(raw)3351242404+1,自己的Seq(raw)设置为616411686+ 1(上次期望发来616411687、收到的seq的确是616411687,校验通过)

image-20230726010042235.png

请求数据,可以看到此次seq和ack都没有改变。第三次握手后通过后,客户端马上就像服务端发起请求

image-20230726010801312.png

接收数据,Ack=129表示发送了129字节,Ack为初始的Seq616411686+129

image-20230726011106431.png

服务端发起关闭连接,标志位FIN为1、ACK为1,Ack没变为之前的Seq616411815,Seq为3351242404+93

image-20230726185244234.png

客户端发送关闭连接,标志位FIN为1、ACK为1,Ack+1,Seq和收到的Ack一致

image-20230726190122531.png

服务端确认关闭连接,标志位ACK为1,Ack+1,Seq和收到的Ack一致

image-20230726190527755.png