缘起

我们知道 一般网路中 以太网的帧长度不超过 1500字节(MTU),所以单个 tcp segment 最大为1460; 如果我们业务报文超过 1420 字节(tcp payload),就会被分成多个 segment。

那么如何在 编写 wireshark 插件时,拿到一个完整的业务报文呢?

解决办法

通过goolge,发现解决办法非常简单,只需要为pinfo.desegment_len 还需要的字节长度即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- 在入口处
function slicer.dissector(tvb, pinfo, tree)
    ...
    local pdu_length = get_pdu_length(...)
    if pdu_length > tvb:len() then
        pinfo.desegment_len = pdu_length - tvb:len()
    else
        do_dissection(tvb, pifo, tree)
    end
    return
end

如果不知道明确的长度,那我们也可以:

1
  pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT

总结

通过 wireshark lua 插件的编写,发现很多需要注意的小细节。
lua这门胶水语言的粘合能力还是挺强大的,比如 open-restry,redis 中都有支持 lua。

参考链接