
CONNECTION_RESET如何解決?
聲明:該文章由作者(半裸狂熱者)發(fā)表,轉(zhuǎn)載此文章須經(jīng)作者同意并請(qǐng)附上出處(0XUCN)及本頁(yè)鏈接。。
開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)出現(xiàn)Connection reset問(wèn)題,包括http調(diào)用,數(shù)據(jù)庫(kù)連接等場(chǎng)景。出現(xiàn)Connection reset的原因很多,本文從tcp層面簡(jiǎn)單介紹下Connection reset出現(xiàn)的原因,以及在實(shí)際開(kāi)發(fā)過(guò)程中如何排查這類(lèi)問(wèn)題。
1、什么是Connection reset
在TCP首部中有6個(gè)標(biāo)志位,其中一個(gè)標(biāo)志位為RST,用于 復(fù)位 的。無(wú)論何時(shí)一個(gè)報(bào)文 段發(fā)往基準(zhǔn)的連接( referenced connection)出現(xiàn)錯(cuò)誤,TCP都會(huì)發(fā)出一個(gè)復(fù)位報(bào)文段。如果雙方需要繼續(xù)建立連接,那么需要重新進(jìn)行三次握手建立連接。
2、出現(xiàn)RST的原因2.1 RST攻擊、干擾
上面簡(jiǎn)單介紹了RST標(biāo)志位的作用,很容易想到這樣一個(gè)場(chǎng)景,如果中間網(wǎng)絡(luò)節(jié)點(diǎn)想要破壞一個(gè)tcp連接,那么它只要偽造成其中一方發(fā)送RST報(bào)文到另一方,即可讓雙方連接失效。
上圖中,三次握手建立了tcp連接,由于是https連接,需要進(jìn)行加密操作。這時(shí),對(duì)方發(fā)送RST,雙方并沒(méi)有進(jìn)行 四次揮手 ,而是連接直接失效。這時(shí)客戶(hù)端發(fā)起重拾,重新建立連接,但是很快又被 對(duì)方 重置了。和客戶(hù)端連接tcp連接以及發(fā)送RST報(bào)文的,都不一定是真正的服務(wù)端,而可能是中間節(jié)點(diǎn)。我們使用HTTPS可以避免受到中間人攻擊。對(duì)方無(wú)法使用中間人攻擊,但是想阻止我們?cè)L問(wèn),所以可以通過(guò)RST來(lái)重置連接。
2.2 請(qǐng)求一個(gè)不存在的端口
當(dāng)客戶(hù)端訪(fǎng)問(wèn)服務(wù)端一個(gè)沒(méi)有監(jiān)聽(tīng)的端口時(shí),服務(wù)端會(huì)發(fā)送RST報(bào)文。
如上圖所示,客戶(hù)端(192.168.2.192)訪(fǎng)問(wèn)了服務(wù)端(192.168.2.1)一個(gè)未監(jiān)聽(tīng)的端口(9090),服務(wù)端發(fā)送了RST報(bào)文。
2.3 異常終止一個(gè)連接
終止一個(gè)連接的正常方式是一方發(fā)送 FIN。有時(shí)這也稱(chēng)為有序釋放(orderly release),因?yàn)樵谒信抨?duì)數(shù)據(jù)都已發(fā)送之后才發(fā)送 FIN,正常情況下沒(méi)有任何數(shù)據(jù)丟失。但也有可能發(fā)送一個(gè)復(fù)位報(bào)文段而不是 FIN來(lái)中途釋放一個(gè)連接。有時(shí)稱(chēng)這為異常釋放 (abortive release)。
上圖,當(dāng)客戶(hù)端連接redis后,我們手動(dòng)關(guān)閉redis服務(wù),redis服務(wù)端會(huì)發(fā)送RST來(lái)強(qiáng)制終止一個(gè)連接??蛻?hù)端通常收到這樣的錯(cuò)誤:Connection reset by peer,或者:遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接。
2.4 半打開(kāi)連接
如果一方已經(jīng)關(guān)閉或異常終止連接而另一方卻還不知道,我們將這樣的TCP連接稱(chēng)為半打開(kāi)(Half-Open)的。只要不打算在半打開(kāi) 連接上傳輸數(shù)據(jù),仍處于連接狀態(tài)的一方就不會(huì)檢測(cè)另一方已經(jīng)出現(xiàn)異常。
3、排查思路
實(shí)際開(kāi)發(fā)過(guò)程中,前面三個(gè)問(wèn)題比較容易識(shí)別和解決。最困難的是最后一種半打開(kāi)連接,原因往往很難發(fā)現(xiàn)。因?yàn)榫W(wǎng)絡(luò)正常的情況下,都會(huì)通過(guò)正常關(guān)閉或者2.3的方式來(lái)關(guān)閉連接?,F(xiàn)在客戶(hù)端和服務(wù)端的網(wǎng)絡(luò)非常復(fù)雜,有各種nat,代理,防火墻等設(shè)備,這些中間設(shè)備可能配置了一些安全策略,導(dǎo)致斷開(kāi)連接而不通知。
通過(guò)查詢(xún)客戶(hù)端日志,定位出現(xiàn)異常的時(shí)間。查詢(xún)服務(wù)端日志,查詢(xún)有無(wú)連接斷開(kāi)日志;查詢(xún)連接是否存在;如果不存在,查詢(xún)斷開(kāi)的時(shí)間。通過(guò)這些可以判斷是不是由于半打開(kāi)連接導(dǎo)致的問(wèn)題。半打開(kāi)連接一般是由于中間設(shè)備或者網(wǎng)絡(luò)問(wèn)題斷開(kāi)連接,而客戶(hù)端不知道。
解決方案就是找到對(duì)應(yīng)的設(shè)備,配置連接,避免長(zhǎng)連接斷開(kāi)。
臨時(shí)方案就是,開(kāi)啟keep-live;減少長(zhǎng)連接存活時(shí)間;連接異常時(shí)進(jìn)行重試。
[超站]友情鏈接:
四季很好,只要有你,文娛排行榜:https://www.yaopaiming.com/
關(guān)注數(shù)據(jù)與安全,洞悉企業(yè)級(jí)服務(wù)市場(chǎng):https://www.ijiandao.com/
- 1 堅(jiān)守黨校初心 服務(wù)工作大局 7904599
- 2 微信新功能上線(xiàn) 網(wǎng)友:正好假期需要 7809278
- 3 62歲葉童首次跨界央視主持 7712732
- 4 “橫豎”都是世界第一 7617088
- 5 沈佳潤(rùn)出場(chǎng) 小沈陽(yáng)被抬走 7523994
- 6 吳艷妮12秒90奪冠 7428515
- 7 泰國(guó)男子騎摩托射擊邊防士兵被擊斃 7333783
- 8 孩子們?cè)趯?dǎo)彈發(fā)射井上“蹦蹦跳跳” 7233930
- 9 劉宇寧《新鴛鴦蝴蝶夢(mèng)》帶著江湖氣 7138508
- 10 伊朗軍方:已準(zhǔn)備好應(yīng)對(duì)任何威脅 7045412