Wireshark Lua插件开发实战:应对TCP粘包问题

0. 概述

Wireshark提供了tcp_dissect_pdus()函数,可以帮助用户处理TCP粘包问题

1. 粘包问题的基本原理

TCP粘包问题本质上是数据包拼接和拆分的问题。当多个应用层数据包被封装成同一个TCP段时,就发生了粘包现象。在解析时,我们需要将粘在一起的数据包拆分开,并分别进行处理。

Wireshark的tcp_dissect_pdus()函数提供了一种通用的粘包处理方案。该函数的基本原理如下:

获取PDU长度: 首先,需要获取每个PDU的预期长度。这可以通过用户提供的回调函数来实现,因为只有用户才知道其特定协议的PDU应该有多长。
检查报文完整性: 检查当前TCP段是否足够长,以包含完整的PDU。如果不足够长,则将该TCP段缓存起来,等待后续数据包的到来。
重组TCP段: 当收到新的TCP段时,将新旧TCP段拼接在一起,形成新的完整报文。
解析PDU: 如果当前TCP段足够长,则从其中提取出完整的PDU,并使用用户提供的解析函数进行解析。
处理多个PDU: 如果一个TCP段包含多个PDU,则依次处理每个PDU,直至完成解析。

2. 利用tcp_dissect_pdus()函数解决粘包问题

下面以一个雷达数据协议为例,演示如何利用tcp_dissect_pdus()函数解决粘包问题。该协议定义了两种数据包:状态包(statuspacket)和数据包(datapacket)。状态包长度固定为598字节,而数据包的长度则由包头和包体组成,其中包头长度固定为54字节,包体长度则为单个block大小乘以block数量。

为了解析雷达数据包,我们需要编写一个Lua插件。该插件首先定义了两个函数:

function get_tcp_len(buf,pkt,root)
		local magic_number = buf(0,2):le_uint()
		if (magic_number == 0x176a)
		then
			local itme_size = buf(42,2):le_uint()
			local itme_num = buf(39,3):le_uint()
			local buf_size = itme_num * itme_size + 54
			return buf_size
		elseif (magic_number == 0x186b)
		then
			return 598
		else
			return false
		end
	end
function my_proto(buf, pkt, root)
	dissect_tcp_pdus(buf, root, 54, get_tcp_len, ScoreBoard_dissector)
	return true
end

相关推荐

  1. Wireshark Lua开发实战TCP问题

    2024-05-09 07:48:09       34 阅读
  2. TCP问题优化

    2024-05-09 07:48:09       43 阅读
  3. 计算机网络 TCP问题

    2024-05-09 07:48:09       28 阅读
  4. TCP

    2024-05-09 07:48:09       125 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 07:48:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 07:48:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 07:48:09       82 阅读
  4. Python语言-面向对象

    2024-05-09 07:48:09       91 阅读

热门阅读

  1. Linux-笔记 常用命令

    2024-05-09 07:48:09       30 阅读
  2. 数字孪生与虚拟现实结合

    2024-05-09 07:48:09       33 阅读
  3. 基于python+Django的二维码生成算法设计与实现

    2024-05-09 07:48:09       31 阅读
  4. NPM和GitLab

    2024-05-09 07:48:09       34 阅读
  5. 学习Uni-app开发小程序Day5

    2024-05-09 07:48:09       36 阅读
  6. 数据仓库之Hologres

    2024-05-09 07:48:09       35 阅读
  7. 基于 Node.js 的爬虫库Puppeteer

    2024-05-09 07:48:09       29 阅读
  8. CSS:border作用

    2024-05-09 07:48:09       27 阅读
  9. Linux的常见指令

    2024-05-09 07:48:09       36 阅读
  10. 速盾:高防服务器和高防cdn的区别

    2024-05-09 07:48:09       40 阅读