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_recycletcp_tw_reuse 區別不是很清楚。下面詳細介紹一下。測試之前我們先將客戶端的端口號範圍限制一下

$ sysctl -w "net.ipv4.ip_local_port_range=32768 32768"
net.ipv4.ip_local_port_range = 32768 32768

只開放一個端口,然後訪問任意一個服務,在 tcp_tw_reusetcp_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:

相關文章