Golang:如何检查HTTP请求是否在TCP有效负载字节中

时间:2016-08-22 14:40:19

标签: http go request packet payload

我正在使用gopacket包,每次有TCP数据包时,我想检查有效负载是否包含HTTP请求。有没有一种简单的方法可以做到这一点而不是编写我自己的解析器?还有一个函数(参见:func ReadRequest(b *bufio.Reader))返回一个Request结构但我不知道应该使用哪种输入。 tcp.Payload是byte []数组,似乎有我需要解析的信息(参见下面的例子):

// 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请求后,我得到以下输出:

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

欢迎任何建议......

1 个答案:

答案 0 :(得分:1)

在此问题的帮助下:How to parse http headers in Go http.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)
      ...
  }
}