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