GoPacket研究——reassemblydump结构体

GoPacket研究——reassemblydump结构体一、统计信息varstatsstruct{ ipdefragint missedBytesint pktint szint totalszint rejectFsmint rejectOptint rejectConn

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
		}
	}
}

今天的文章GoPacket研究——reassemblydump结构体分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65696.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注