針對有些用戶能ping通我們的網站,但是連接時超時服務器沒有任何響應,懷疑問題處在了了http的三次握手環節,這是決定通過抓包進行分析:
1、發現問題
從抓包數據發現,web服務器對出問題機器和正常機器系統的tcp syn包都返回ACK包,但存在問題發出的tcp syn包有時候響應,有時候不響應。不響應時,終端與web服務器之間的tcp連接無法正常建立,導致頁面不能打開。對比這兩種數據包,就在時間戳上有差 異,存在問題的機器發出的tcp syn包帶有時間戳,因此懷疑時間戳問題導致的故障。
2、解決問題
既然懷疑是時間戳導致的,那我們就著手分析如果將出現問題的機器的時間戳去掉會不會解決問題。針對帶有時間戳的tcp syn包不響應的問題,查閱了相關資料得知產生問題的原因是出問題系統中的
注冊表中有Tcp1323opts這個選項,會導致其在發包時加入時間戳,經過 nat之後,如果前面相同的端口被使用過,且時間戳大於這個鏈接發出的syn中的時間戳,服務器上就會忽略掉這個syn,不返會syn-ack消息,表現 為用戶無法正常完成tcp3次握手,從而不能打開web頁面。在業務閒時,如果用戶nat的端口沒有被使用過時,就可以正常打開;業務忙時,nat端口重 復使用的頻率高,很難分到沒有被使用的端口,從而產生這種問題。
解決方法如下:
首先我們先查看一下我們服務器net.ipv4.tcp_timestamps的默認值,如果該值為0測說名不是該問題導致,如果是0我們需要將該值設置為1。
查看默認值的方法:[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_timestamps
修改該值的方法:vim /etc/sysctl.conf 添加 net.ipv4.tcp_timestamps=0
值為0(禁用時間戳)
值為1(啟用時間戳)
只有客戶端和服務端都開啟時間戳的情況下,才會出現能ping通不能建立tcp三次握手的情況,所以做為提供服務的公司,不可能保證所有的用戶都關閉時間戳,這個功能,所以我們必須關閉時間戳,這樣才能給所用用戶提供正常的服務。
使用該命令使其立馬生效:/sbin/sysctl-p