GoPacket研究——reassemblydump结构体

一、统计信息

var stats struct {
	ipdefrag            int
	missedBytes         int
	pkt                 int
	sz                  int
	totalsz             int
	rejectFsm           int
	rejectOpt           int
	rejectConnFsm       int
	reassembled         int
	outOfOrderBytes     int
	outOfOrderPackets   int
	biggestChunkBytes   int
	biggestChunkPackets int
	overlapBytes        int
	overlapPackets      int
}

可以看到,都是一个一个数值类型的字段,存放各种不同的统计数据。

二、http读取

/*
 * HTTP part
 */

type httpReader struct {
	ident    string       // 标明源、目的端的字符串
	isClient bool         // 标明是http客户端,还是服务器
	bytes    chan []byte  // 数据读取通道
	data     []byte       // 数据缓冲
	hexdump  bool         // 是否将16进制的body转成可读的,调用hex.Dump(body)
	parent   *tcpStream   // 用于控制父流
}

func (h *httpReader) Read(p []byte) (int, error) {
	ok := true
        // 如果数据缓冲中不为空,从通道读取数据
	for ok && len(h.data) == 0 {
		h.data, ok = <-h.bytes
	}
        // 读取数据到缓冲失败
	if !ok || len(h.data) == 0 {
		return 0, io.EOF
	}

        // 将缓冲中数据拷贝到字节数组p中
	l := copy(p, h.data)
        // 缓冲中保存剩余的数据
	h.data = h.data[l:]
	return l, nil
}

三、tcp流

/*
 * The TCP factory: returns a new Stream
 */
type tcpStreamFactory struct {
	wg     sync.WaitGroup
	doHTTP bool
}

WaitGroup 对象内部有一个计数器,最初从0开始,

它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量:

Add(n) 把计数器设置为n

Done() 每次把计数器-1

wait() 会阻塞代码的运行,直到计数器地值减为0。

四、组装器上下文

/*
 * The assembler context
 */
type Context struct {
	CaptureInfo gopacket.CaptureInfo
}

五、tcp流

/*
 * TCP stream
 */

/* It's a connection (bidirectional双向的) */
type tcpStream struct {
	tcpstate       *reassembly.TCPSimpleFSM  // TCPSimpleFSM implements a very simple TCP state machine(SM)
	fsmerr         bool
	optchecker     reassembly.TCPOptionCheck
	net, transport gopacket.Flow
	isDNS          bool
	isHTTP         bool
	reversed       bool
	client         httpReader
	server         httpReader
	urls           []string
	ident          string
	sync.Mutex
}

tcpStream主要提供两个方法:

一个是Accept,主要在接收到数据包时,负责时序等状态检查和checksum的检查;

一个是ReassembledSG,主要判断如果是http请求,将数据包交给httpReader进行处理;

if t.isHTTP {
	if length > 0 {
		if *hexdump {
			Debug("Feeding http with:\n%s", hex.Dump(data))
		}
		if dir == reassembly.TCPDirClientToServer && !t.reversed {
			t.client.bytes <- data
		} else {
			t.server.bytes <- data
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值