1 回答

TA貢獻1865條經驗 獲得超7個贊
如何在 Go 中為 TCP 數據包設置“不分段”標志位?
首先你應該知道 TCP 真的不喜歡 IP 片段。大多數(如果不是全部)主要實現通過使用路徑 MTU 發現來避免 TCP 段的分段。
TL;DR 是包含 TCP 段的典型 IP 數據包設置了 DF 位。您可以(并且應該)嘗試一下。在這里,我在我的機器和 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 表示設置了 DF 位。我承認在其他捕獲中,我曾在沒有 DF 位的 IP 數據包中看到偶爾的 TCP 段;我懷疑rfc1191對此有解釋。
現在回到您的問題,我認為沒有可移植的方式來設置 DF 位,這是一個更普遍的問題(甚至沒有 POSIX 可移植的方式)。在golang.org/x/sys下的相關包中(可能)有一個逃生艙口供您實施。
例如,在支持FreeBSDIP_DONTFRAG的 Unix 上,可以使用和挖掘相關的常量值。unix.SetsockoptInt
在 Linux 上沒有IP_DONTFRAG,正如您從鏈接的問題中發現的那樣。解決方法似乎是使用IP_MTU_DISCOVER恰好在 unix 包中作為常量可用的。您可以使用它unix.SetsockoptInt來設置它。
- 1 回答
- 0 關注
- 233 瀏覽
添加回答
舉報