linux內核網絡參數tcp_tw_recycle 和 tcp_tw_reuse 你搞清楚了嗎?
Docker 技術鼻祖系列
原文鏈接:https://blog.csdn.net/u010278923/article/details/102663535
今天在生產環境遇到了一個奇怪的網絡現象,通過抓包發現, SYN
包沒有 ACK
。可以 ping 通,防火牆開放的情況下,基本確定對方服務器問題。
首先排除端口是否已經耗盡,發現仍有很多富餘
那麼可能就是 linux 內核網絡參數 tcp_tw_recycle
搗鬼。登錄對方主機發現這個參數的確被設置成 1。
$ sysctl -a|grep tcp_tw_recycle
net.ipv4.tcp_tw_recycle = 0
很多人對 tcp_tw_recycle
和 tcp_tw_reuse
區別不是很清楚。下面詳細介紹一下。測試之前我們先將客戶端的端口號範圍限制一下
$ sysctl -w "net.ipv4.ip_local_port_range=32768 32768"
net.ipv4.ip_local_port_range = 32768 32768
只開放一個端口,然後訪問任意一個服務,在 tcp_tw_reuse
和 tcp_tw_recycle
都關閉的情況下,可以看到服務只能訪問一次,再次訪問便報錯。
如果開啓 tcp_tw_reuse
,那麼便可以重複利用處於 time_wait
狀態的連接。
而 tcp_tw_recycle
這個參數有點尷尬, 4.x
內核版本之後這個參數已經被廢棄了,可見這個參數有點雞肋甚至是危險。這個參數表明儘快的回收處於 time_wait
狀態的連接,不用等兩個 MSL
就關閉連接。但它的副作用是會拒絕所有比這個客戶端時間戳更靠前的網絡包。如果大家沒有理解,我舉個例子,如果服務器記錄了 10.10.10.10
這個機器發過來最新的數據包是 10:41
那麼如果從 10.10.10.10
過來數據包是這個時間之前是話,這個包將會被拒絕。那麼好奇的讀者又會問,這個包不應該是遞增的嗎?通常應該不會有問題,是這樣,但如果是 NAT
的環境,你很難保障後端所有的機器的時鐘是同步的,那麼就會出現部分數據包被服務端拒絕的情況。所以這個參數請謹慎使用,不建議開啓!!!
你可能還喜歡
點擊下方圖片即可閱讀
只有 4000 行代碼的 WireGuard 不權威指南:理論篇
雲原生是一種信仰
掃 碼關注公衆號
後臺回覆◉k8s◉獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!
點擊 "閱讀原文" 獲取 更好的閱讀體驗!
:heart: 給個 「在看」 ,是對我最大的支持:heart: