2016-08-22 24 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) 
     ... 
    } 
} 
相關問題