1 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個贊
如何在 Go 中為 TCP 數(shù)據(jù)包設(shè)置“不分段”標(biāo)志位?
首先你應(yīng)該知道 TCP 真的不喜歡 IP 片段。大多數(shù)(如果不是全部)主要實(shí)現(xiàn)通過使用路徑 MTU 發(fā)現(xiàn)來避免 TCP 段的分段。
TL;DR 是包含 TCP 段的典型 IP 數(shù)據(jù)包設(shè)置了 DF 位。您可以(并且應(yīng)該)嘗試一下。在這里,我在我的機(jī)器和 stackoverflow.com 之間嗅探了幾秒鐘的流量:
% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com
<wait a few seconds>
% tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c
186 0x00000002
0x02 表示設(shè)置了 DF 位。我承認(rèn)在其他捕獲中,我曾在沒有 DF 位的 IP 數(shù)據(jù)包中看到偶爾的 TCP 段;我懷疑rfc1191對此有解釋。
現(xiàn)在回到您的問題,我認(rèn)為沒有可移植的方式來設(shè)置 DF 位,這是一個更普遍的問題(甚至沒有 POSIX 可移植的方式)。在golang.org/x/sys下的相關(guān)包中(可能)有一個逃生艙口供您實(shí)施。
例如,在支持FreeBSDIP_DONTFRAG的 Unix 上,可以使用和挖掘相關(guān)的常量值。unix.SetsockoptInt
在 Linux 上沒有IP_DONTFRAG,正如您從鏈接的問題中發(fā)現(xiàn)的那樣。解決方法似乎是使用IP_MTU_DISCOVER恰好在 unix 包中作為常量可用的。您可以使用它unix.SetsockoptInt來設(shè)置它。
- 1 回答
- 0 關(guān)注
- 236 瀏覽
添加回答
舉報(bào)