0
我正在使用gopacket软件包,每当我有一个TCP数据包时,我想检查有效负载是否包含HTTP请求。有没有简单的方法来做到这一点,而不是写我自己的解析器?还有一个函数(见:func ReadRequest(b *bufio.Reader)),它返回一个Request结构,但我不知道应该使用什么样的输入。 tcp.Payload
是字节[]数组,似乎有我需要解析(参见下面的举例)的信息:Golang:如何检查HTTP请求是否处于TCP有效负载字节
PKT [001] TCP [SYN] 192.168.2.6:59095 > 192.168.3.5:80
PKT [002] TCP [SYN] [ACK] 192.168.3.5:80 > 192.168.2.6:59095
PKT [003] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80
PKT [004] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80 GET /certificates/test.pdf HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: 192.168.3.5
Connection: Keep-Alive
不限:
// Get the TCP layer from this packet
if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
fmt.Printf("TCP ")
// Get actual TCP data from this layer
tcp, _ := tcpLayer.(*layers.TCP)
srcPort = tcp.SrcPort
dstPort = tcp.DstPort
if tcp.SYN {
fmt.Print("[SYN] ")
}
if tcp.ACK {
fmt.Print("[ACK] ")
}
if tcp.FIN {
fmt.Print("[FIN] ")
}
fmt.Printf("%s:%d > %s:%d ", srcIP, srcPort, dstIP, dstPort)
fmt.Println(string(tcp.Payload))
}
发送HTTP请求我得到以下输出后建议,欢迎...
你的意思是你想检查一个数据包是否有HTTP请求的_start_?单个请求可能跨越多个数据包。 – JimB
是的,让我们来看看有效载荷只有一个HTTP请求且没有丢失部分的简单情况 – tgogos
是的,如果有效载荷包含完整的请求,则可以将其提供给'http.ReadRequst'。这个更简单的情况并不是很有用,因为你正在对TCP流的单个数据包进行操作。当你考虑到请求可能在数据包有效载荷的中间开始时,它会立即失败,并且很可能请求将跨越多个数据包。 HTTP的级别高于TCP,并且您需要重新组装流(流)才能正确解析HTTP。 – JimB