亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中為 TCP 數據包設置“不分段”標志位?

如何在 Go 中為 TCP 數據包設置“不分段”標志位?

Go
飲歌長嘯 2022-01-17 17:54:02
我打算在 Go 中設置“不分段”標志位,與這篇文章在 C 中的內容相同。我檢查了常量列表,但沒有找到這個選項。那么 Go 中對應的選項是什么?
查看完整描述

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來設置它。


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號