2016-08-22 29 views
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请求我得到以下输出后建议,欢迎...

+0

你的意思是你想检查一个数据包是否有HTTP请求的_start_?单个请求可能跨越多个数据包。 – JimB

+0

是的,让我们来看看有效载荷只有一个HTTP请求且没有丢失部分的简单情况 – tgogos

+0

是的,如果有效载荷包含完整的请求,则可以将其提供给'http.ReadRequst'。这个更简单的情况并不是很有用,因为你正在对TCP流的单个数据包进行操作。当你考虑到请求可能在数据包有效载荷的中间开始时,它会立即失败,并且很可能请求将跨越多个数据包。 HTTP的级别高于TCP,并且您需要重新组装流(流)才能正确解析HTTP。 – JimB

回答

0

从这个问题的帮助:How to parse http headers in Gohttp.ReadRequest()作品如下尝试...

if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil { 
    tcp, _ := tcpLayer.(*layers.TCP) 
    if len(tcp.Payload) != 0 { 
     reader := bufio.NewReader(bytes.NewReader(tcp.Payload)) 
     httpReq, err := http.ReadRequest(reader) 
     ... 
    } 
} 
相关问题