记一次TCP连接异常故障解决
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
一.情況表現(xiàn)為
? ? 1.在公司內(nèi)網(wǎng)對(duì)站點(diǎn)的http訪問:
? ? ? ? linux主機(jī)出現(xiàn)故障:curl以及抓包分析,發(fā)現(xiàn)服務(wù)端不響應(yīng)linux客戶端的請(qǐng)求,無法建立TCP連接,瀏覽器返回“無法連接到服務(wù)器”
? ? ? ? windows主機(jī)正常
? ? 2.http訪問質(zhì)量下降:
? ? ? ? 基調(diào)顯示,新架構(gòu)上線后,訪問質(zhì)量下滑,主要表現(xiàn)為
? ? ? ? 2.1.訪問提示“無法連接到服務(wù)器”
? ? ? ? 2.2.僅少數(shù)人遇到這種故障,并且一天中不是每次訪問都會(huì)遇到,而是出現(xiàn)時(shí)好時(shí)壞的現(xiàn)象
二.處理過程
? ? 直接上google搜索關(guān)鍵字“服務(wù)器無法建立TCP連接”。
? ? 翻了幾頁后,發(fā)現(xiàn)這篇博文:“http://www.sunchis.com/html/os/linux/2012/0518/413.html”。
? ? 看了一下,和我們公司內(nèi)網(wǎng)的表現(xiàn)一模一樣,但各種問題(1為這方面基礎(chǔ)知識(shí)薄弱,2為沒有時(shí)間驗(yàn)證此配置)
? ? 然后這種問題持續(xù)了n久…一直以為是內(nèi)部設(shè)備問題
? ? 后期搞不定了,大膽在線上啟用這個(gè)參數(shù)“net.ipv4.tcp_timestamps = 0”,做了下測(cè)試后,發(fā)現(xiàn)故障解除,原故障機(jī)每次訪問都正常了!
? ? 不過還是不明其中原理,只是大意了解,同樣處于NAT上網(wǎng)方式的用戶里(與別人共用出口IP地址),如果你的時(shí)間戳小于別人的,那么服務(wù)器不會(huì)響應(yīng)你的TCP請(qǐng)求,要忽略此項(xiàng),將net.ipv4.tcp_timestamps = 0(/etc/sysctl.conf)
三.總結(jié)
? ? 后期學(xué)習(xí)時(shí),看見了一個(gè)更加詳細(xì)的博客,講的很詳細(xì),也引入了新的問題:http://huoding.com/2012/01/19/142
? ? ====== 小抄 ======
? ? 其實(shí),linux服務(wù)器原本對(duì)時(shí)間戳(timestamps)默認(rèn)是不開啟的,Linux是否啟用這種行為取決于tcp_timestamps和tcp_tw_recycle,因?yàn)閠cp_timestamps缺省就是開啟的,所以當(dāng)tcp_tw_recycle被開啟后,實(shí)際上這種行為就被激活了。
? ? net.ipv4.tcp_tw_recycle又是啥呢,搜索了一下基本上是TIME_WAIT連接的回收參數(shù)
? ? 當(dāng) net.ipv4.tcp_timestamps 沒有設(shè)置(缺省為開啟),并且 net.ipv4.tcp_tw_recycle 也開啟時(shí),這個(gè)坑爹的錯(cuò)誤就出現(xiàn)了,但是注意,只表現(xiàn)在NAT網(wǎng)絡(luò)環(huán)境中。而且,大多數(shù)博客,以及一些大牛們,都有說過要開啟 net.ipv4.tcp_tw_recycle …
? ? ====== 小抄 ======
四.未完成的事項(xiàng)
? ? 上文 http://huoding.com/2012/01/19/142 中提到的:
? ? 1.(未驗(yàn)證)關(guān)閉timestamps后,tw_recycle功能是失效的問題
? ? 2.(未驗(yàn)證)新的解決TIME_WAIT連接過多的方法:net.ipv4.tcp_max_tw_buckets = 10000 設(shè)置一個(gè)最大值,不過壞處是系統(tǒng)日志會(huì)提示:TCP: time wait bucket table overflow
===============================================================
針對(duì)有些用戶能ping通我們的網(wǎng)站,但是連接時(shí)超時(shí)服務(wù)器沒有任何響應(yīng),懷疑問題處在了了http的三次握手環(huán)節(jié),這是決定通過抓包進(jìn)行分析:
1、有問題機(jī)器的截圖:
2、正常機(jī)器的截圖:
3、發(fā)現(xiàn)問題
從抓包數(shù)據(jù)發(fā)現(xiàn),web服務(wù)器對(duì)出問題機(jī)器和正常機(jī)器系統(tǒng)的tcp syn包都返回ACK包,但存在問題發(fā)出的tcp syn包有時(shí)候響應(yīng),有時(shí)候不響應(yīng)。不響應(yīng)時(shí),終端與web服務(wù)器之間的tcp連接無法正常建立,導(dǎo)致頁面不能打開。對(duì)比這兩種數(shù)據(jù)包,就在時(shí)間戳上有差異,存在問題的機(jī)器發(fā)出的tcp syn包帶有時(shí)間戳,因此懷疑時(shí)間戳問題導(dǎo)致的故障。
4、解決問題
既然懷疑是時(shí)間戳導(dǎo)致的,那我們就著手分析如果將出現(xiàn)問題的機(jī)器的時(shí)間戳去掉會(huì)不會(huì)解決問題。針對(duì)帶有時(shí)間戳的tcp syn包不響應(yīng)的問題,查閱了相關(guān)資料得知產(chǎn)生問題的原因是出問題系統(tǒng)中的注冊(cè)表中有Tcp1323opts這個(gè)選項(xiàng),會(huì)導(dǎo)致其在發(fā)包時(shí)加入時(shí)間戳,經(jīng)過nat之后,如果前面相同的端口被使用過,且時(shí)間戳大于這個(gè)鏈接發(fā)出的syn中的時(shí)間戳,服務(wù)器上就會(huì)忽略掉這個(gè)syn,不返會(huì)syn-ack消息,表現(xiàn)為用戶無法正常完成tcp3次握手,從而不能打開web頁面。在業(yè)務(wù)閑時(shí),如果用戶nat的端口沒有被使用過時(shí),就可以正常打開;業(yè)務(wù)忙時(shí),nat端口重復(fù)使用的頻率高,很難分到?jīng)]有被使用的端口,從而產(chǎn)生這種問題。
目前看有兩種方法解決:
(1)????是在服務(wù)器上修改變量
首先我們先查看一下我們服務(wù)器net.ipv4.tcp_timestamps的默認(rèn)值,如果該值為0測(cè)說名不是該問題導(dǎo)致,如果是1我們需要將該值設(shè)置為1。
查看默認(rèn)值的方法:[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_timestamps
修改該值的方法:vim /etc/sysctl.conf? 添加 net.ipv4.tcp_timestamps=0
(2)修改客戶端的注冊(cè)表Tcp1323Opts設(shè)置為0。
?
備注:
Tcp1323Opts
說明:該參數(shù)控制 RFC 1323 時(shí)間戳與窗口縮放選項(xiàng)。默認(rèn)情況下,啟用時(shí)間戳與
窗口縮放,但是可以使用標(biāo)志位進(jìn)行控制。0 位控制窗口縮放,1 位控制時(shí)間戳。
值為0(禁用 RFC 1323 選項(xiàng))
值為1(僅啟用窗口縮放)
值為2(僅啟用時(shí)間戳)
值為3(兩個(gè)選項(xiàng)均啟用)
?
net.ipv4.tcp_timestamps=0
說明:時(shí)間戳可以避免序列號(hào)的卷繞。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉。
值為0(禁用時(shí)間戳)
值為1(啟用時(shí)間戳)
?
只有客戶端和服務(wù)端都開啟時(shí)間戳的情況下,才會(huì)出現(xiàn)能ping通不能建立tcp三次握手的情況,所以做為提供服務(wù)的公司,不可能保證所有的用戶都關(guān)閉時(shí)間戳,這個(gè)功能,所以我們必須關(guān)閉時(shí)間戳,這樣才能給所用用戶提供正常的服務(wù)。
轉(zhuǎn)載于:https://my.oschina.net/tsh/blog/1335116
總結(jié)
以上是生活随笔為你收集整理的记一次TCP连接异常故障解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript深拷贝和浅拷贝
- 下一篇: 大数据服务社会的一个有益实践