GOREPLAY是一個網絡流量轉發的應用,之前的名字叫GOR,GITHUB上的作者有介紹,更准確說應該是HTTP流量轉發,作者的目標應該是WEB型應用在內網的轉發,因為HTTP是一個應用廣泛的協議,並且是標准的,因此從這個角度出發編寫出來的轉發應用能夠在絕大多數的場景使用。這也會帶來一定的問題,假設我們要轉發其他的協議類型,這個時候需要自行編碼識別協議的邊界再做轉發。
GOREPLAY使用GO語言編寫,使用了一系列GO的工具,如操作pcap、kafka等。運行goreplay的前提也需要安裝pcap等工具,並且需要在root權限下才能打開網卡的混雜模式,監聽指定端口的所有tcp報文。GOREPLAY的工作流程:
1.使用pcap的go接口,使用bpf(伯克利包過濾)設置指定端口的過濾表達式,bpf可以參考tcpdump工具的表達式,tcpdump命令背后也是使用了bpf。
2.截取到tcp報文之后,根據網絡五元組(又一個名詞,<源IP,源端口,目標IP,目標端口,協議>,實際程序中沒有使用協議這個字段)作為key露拼裝message,因為HTTP基於TCP協議,根據TCP協議中的ACK以及SEQ識別一次調用包的完整性。想讀懂代碼需要對TCP協議報文格式,HTTP協議格式有一定的了解,除了普通HTTP協議報文,還需要了解CHUNKED等比較少見的報文。
3.把一次HTTP調用的一個或多個TCP報文拼裝后,如果識別到HTTP協議報文已經結束,可以進入轉發階段,轉發即把這些報文中的數據段拼裝后,直接對命令行上指定的端口發送TCP報文,從而完成轉發。
