??????? 首先我們需要弄清楚SYN_RCVD狀態是怎樣產生的,通過TCP狀態轉換圖(如下圖)我們可以清楚的看到,SYN_RCVD是TCP三次握手的中間狀態,是服務端口(監聽端口,如應用服務器的80端口)收到SYN包并發送[SYN,ACK]包后所處的狀態。這時如果再收到ACK的包,就完成了三次握手,建立起TCP連接。
????? 如果服務器上出現大量的SYN_RCVD狀態的TCP連接說明這些連接一直沒有收到ACK包,這主要有兩種可能,一種是對方(請求方或客戶端)沒有收到服務器發送的[SYN,ACK]包,另一種可能是對方收到了[SYN,ACK]包卻沒有ACK。
????? 對于第一種情況一般是由于網絡結構或安全規則限制導致(SYN,ACK)包無法發送到對方,這種情況比較容易判斷:只要在服務器上能夠ping通互聯網的任意主機,基本可以排除這種情況。
????? 對于第二種情況要稍微復雜一些,這種情況還有兩種可能:一種是對方根本就不打算ACK,一般在對方程序有意為之才會出現,如 SYN Flood類型的 DOS/DDOS攻擊;另一種可能是對方收到的[SYN,ACK]包不合法,常見的是SYN包的目的地址(服務地址)和應答[SYN,ACK]包的源地址不同。這種情況在只配置了DNAT而不進行SNAT的服務網絡環境下容易出現,主要是由于inbound(SYN包)和outbound([SYN,ACK]包)的包穿越了不同的網關/防火墻/負載均衡器,從而導致[SYN,ACK]路由到互聯網的源地址(一般是防火墻的出口地址)與SYN包的目的地址(服務的虛擬IP)不同,這時客戶機無法將SYN包和[SYN,ACK]包關聯在一起,從而會認為已發出的SYN包還沒有被應答,于是繼續等待應答包。這樣服務器端的連接一直保持在SYN_RCVD狀態(半開連接)直到超時。?????
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
