標籤:不能 啟用 ack alt 三向交握 註冊表 col family 疑問
問題現象:
訪問一個我們新接入的業務介面,能ping通他們的網站,第一次telnet對端介面會通,第二次、第三次... 一直做下去就不通了,但是串連時逾時伺服器沒有任何響應,懷疑問題出在了http的三向交握環節。
現象:
抓包的情況:
從抓包資料發現,出現問題的服務端的資料包來看 存在發出的tcpsyn包有時候響應,有時候不響應。不響應時,用戶端與服務端之間的tcp串連無法正常建立,導致頁面不能開啟。從用戶端抓包圖裡可以看到,發出去syn沒有收到syn/ack,說明服務端就沒有發ack,服務端是對端抓包,他們在網路入口也沒有收到syn/ack,經過對比時間戳記上有差異,發出的tcpsyn包帶有時間戳記,因此懷疑時間戳記問題導致的故障
解決問題
既然懷疑是時間戳記導致的,那我們就著手分析如果將服務端和用戶端任意邊把時間戳記去掉會不會解決問題。針對帶有時間戳記的tcp syn包不響應的問題,查閱了相關資料得知產生問題的原因是出問題系統中的註冊表中有Tcp1323opts這個選項,會導致其在發包時加入時間戳記,經過NAT之後,如果前面相同的連接埠被使用過,且時間戳記大於這個連結發出的syn中的時間戳記,伺服器上就會忽略掉這個syn,不返會syn-ack訊息,表現為使用者無法正常完成tcp3次握手,從而導致不能建立連結,連結逾時。在業務閑時,如果使用者nat的連接埠沒有被使用過時,就可以正常開啟;業務忙時,nat連接埠重複使用的頻率高,很難分到沒有被使用的連接埠,從而產生這種問題。
解決問題的方式有兩種:
1、最佳化核心參數net.ipv4.tcp_timestamps,首先我們先查看一下我們伺服器net.ipv4.tcp_timestamps的預設值,如果該值為0則說明不是該問題導致,如果是1我們需要將該值設定為0。
查看方法:
cat /proc/sys/net/ipv4/tcp_timestamps
解決辦法:
echo "net.ipv4.tcp_timestamps = 0" >>/etc/sysctl.conf && sysctl -p
0表示:禁用時間戳記
1表示:禁用時間戳記
TCP時間戳記說明:
TCP時間戳記選項會在TCP包頭增加12個位元組,以一種比重發逾時更精確的方法來啟用對RTT 的計算。
作用:
1、TCP時間戳記位於TCP選項中,kind=8;lenth=10;data由timestamp和timestamp echo兩個值組成,各4個位元組的長度。
2、TCP時間戳記理論作用有3個:序號迴繞,亂序的時間判斷依據,避免確認二義性,以及計算RTT。
工作原理:
1、雙方各自維護自己的時間戳記,時間戳記的值隨時間單調遞增(規定為1ms-1s/次,常見值為1ms、10ms)。
2、本端發送timesstamp值,對方收到後在後續的ACK的timestamp echo回應本端的值,並在timestamp中發送自己的時間戳記。
3、TCP記錄發送時間戳記和收到回應的時間, 從而獲得RTT。
2、修改用戶端的註冊表Tcp1323Opts設定為0。
說明:該參數控制 RFC 1323 時間戳記與視窗縮放選項。預設情況下,啟用時間戳記與
視窗縮放,但是可以使用標誌位進行控制。0 位控制視窗縮放,1 位控制時間戳記。
值為0(禁用 RFC 1323 選項)
值為1(僅啟用視窗縮放)
值為2(僅啟用時間戳記)
值為3(兩個選項均啟用)
什麼情況下出現這個問題:
只有用戶端和服務端都開啟時間戳記的情況下,才會出現能ping通不能建立tcp三向交握的情況,所以做為服務端提供服務的公司,不可能保證所有的使用者都關閉時間戳記,這個功能,所以我們必須關閉時間戳記,這樣才能給所用使用者提供正常的服務。
通過這次報錯分析分享大家幾個不錯的部落格:
http://www.udpwork.com/item/6909.html
http://www.cnblogs.com/tolimit/p/5065761.html
http://www.cnblogs.com/lulu/p/4149312.html
時間戳記引起的網站訪問不了問題