




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、TCP 握手過程詳解( netstat -an 狀態(tài)詳解)2011-06-11 22:49:22| 分類: 網絡技術 | 標簽: |字號大中小 訂閱 TCP狀態(tài)遷移 大家對netstat -a命令很熟悉,但是,你有沒有注意到STATE一欄呢,基本上顯示著established,time_wait,close_wait等,這些到底是 什么意思呢,在這篇文章,我將會詳細的闡述。 大家很明白TCP初始化連接三次握手吧:發(fā)SY
2、N包,然后返回SYN/ACK包,再發(fā)ACK包,連接正式建立。但是這里有點出入,當請求者收到SYS /ACK包后,就開始建立連接了,而被請求者第三次握手結束后才建立連接。但是大家明白關閉連接的工作原理嗎?關閉連接要四次握手:發(fā)FIN包,ACK 包,F(xiàn)IN包,ACK包,四次握手!為什么呢,因為TCP連接是全雙工,我關了你的連接,并不等于你關了我的連接??蛻舳薚CP狀態(tài)遷移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED服務器TCP狀態(tài)遷移:CLOSED->LI
3、STEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED當客戶端開始連接時,服務器還處于LISTENING,客戶端發(fā)一個SYN包后,他就處于SYN_SENT狀態(tài),服務器就處于SYS收到狀態(tài),然后互相確認進入連接狀態(tài)ESTABLISHED.當客戶端請求關閉連接時,客戶端發(fā)送一個FIN包后,客戶端就進入FIN_WAIT_1狀態(tài),等待對方的確認包,服務器發(fā)送一個ACK包給客戶,客戶端收到ACK包后結束FIN_WAIT_1狀態(tài),進入FIN_WAIT_2狀態(tài),等待服務器發(fā)過來的關閉請求,服務器發(fā)一個FIN包后,進入CLO
4、SE_WAIT狀態(tài),當客戶端收到服務器的FIN包,FIN_WAIT_2狀態(tài)就結束,然后給服務器端的FIN包給以一個確認包,客戶端這時進入TIME_WAIT,當服務器收到確認包后,CLOSE_WAIT狀態(tài)結束了,這時候服務器端真正的關閉了連接.但是客戶端還在TIME_WAIT狀態(tài)下,什么時候結束呢.我在這里再講到一個新名詞:2MSL等待狀態(tài),其實TIME_WAIT就是2MSL等待狀態(tài),為什么要設置這個狀態(tài),原因是有足夠的時間讓ACK包到達服務器端,如果服務器端沒收到ACK包,超時了,然后重新發(fā)一個FIN包,直到服務器收到ACK 包.TIME_WAIT狀態(tài)等待時間是在TCP重新啟動后不連接任何請求
5、的兩倍.大家有沒有發(fā)現(xiàn)一個問題:如果對方在第三次握手的時候出問題,如發(fā)FIN包的時候,不知道什么原因丟了這個包,然而這邊一直處在FIN_WAIT_2狀 態(tài),而且TCP/IP并沒有設置這個狀態(tài)的過期時間,那他一直會保留這個狀態(tài)下去,越來越多的FIN_WAIT_2狀態(tài)會導致系統(tǒng)崩潰.上面我碰到的這個問題主要因為TCP的結束流程未走完,造成連接未釋放?,F(xiàn)設客戶端主動斷開連接,流程如下 如上圖所示,Client
6、160; 消息 Server
7、0; close()- FIN ->FIN_WAIT1
8、 CLOSE_WAIT<- ACK -FIN_WAIT2 close()<- FIN - TIME_WAIT
9、160;
10、160; LAST_ACK - ACK ->
11、; CLOSEDCLOSED由于Server的Socket在客戶端已經關閉時而沒有調用關閉,造成服務器端的連接處在“掛起”狀態(tài),而客戶端則處在等待應答的狀態(tài)上。此問題的典型特征是:一端處于FIN_WAIT2 ,而另一端處于CLOSE_WAIT.不過,根本問題還是程序寫的不好,有待提高-CLOSE_WAIT,TCP的癌癥,TCP的朋友。CLOSE_WAIT狀態(tài)的生成原因首先我們知道,如果我們的服務器程序APACHE處于CLOSE_WAIT狀態(tài)的話,說明套接字是被動關閉的!因為如果是CLIENT端主動斷掉當前連接的話,那么雙方關閉這個TCP連接共需要四個packet:Client -&g
12、t; FIN -> ServerClient <- ACK <- Server這時候Client端處于FIN_WAIT_2狀態(tài);而Server 程序處于CLOSE_WAIT狀態(tài)。Client <- FIN <- Server這時Server 發(fā)送FIN給Client,Server 就置為LAST_ACK狀態(tài)。Client -> ACK -> ServerClient回應了ACK,那么Server 的套接字才會真正置為CLOSED狀態(tài)。Server 程序處于CLOSE_WAIT狀態(tài),而不是LAST_ACK狀態(tài),說明還沒有發(fā)FIN給Client,那么可能是
13、在關閉連接之前還有許多數(shù)據(jù)要發(fā)送或者其 他事要做,導致沒有發(fā)這個FIN packet。通常來說,一個CLOSE_WAIT會維持至少2個小時的時間。如果有個流氓特地寫了個程序,給你造成一堆的 CLOSE_WAIT,消耗你的資源,那么通常是等不到釋放那一刻,系統(tǒng)就已經解決崩潰了。只能通過修改一下TCP/IP的參數(shù),來縮短這個時間:修改tcp_keepalive_*系列參數(shù)有助于解決這個 問題。解決這個問題的方法是修改系統(tǒng)的參數(shù),系統(tǒng)默認超時時間的是7200秒,也就是2小時, 這個太大了,可以修改如下幾個參數(shù):sysctl -w net.ipv4.tcp_keepalive_time=30sysct
14、l -w net.ipv4.tcp_keepalive_probes=2sysctl -w net.ipv4.tcp_keepalive_intvl=2然后,執(zhí)行sysctl命令使修改生效。 連接進程是通過一系列狀態(tài)表示的,這些狀態(tài)有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,F(xiàn)IN-WAIT-1,F(xiàn)IN-WAIT-2,CLOSE- WAIT,CLOSING,LAST-ACK,TIME-WAIT和CLOSED。各個狀態(tài)的意義如下: LISTEN - 偵聽來自遠方TCP端口的連接請求; SYN-SENT -在發(fā)送連接請求后等待
15、匹配的連接請求; SYN-RECEIVED - 在收到和發(fā)送一個連接請求后等待對連接請求的確認; ESTABLISHED- 代表一個打開的連接,數(shù)據(jù)可以傳送給用戶; FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;FIN-WAIT-2 - 從遠程TCP等待連接中斷請求; CLOSE-WAIT - 等待從本地用戶發(fā)來的連接中斷請求; CLOSING -等待遠程TCP對連接中斷的確認; LAST-ACK - 等待原來發(fā)向遠程TCP的連接中斷請求的確認; TIME-WAIT -等待足夠的時間以確
16、保遠程TCP接收到連接中斷請求的確認; CLOSED - 沒有任何連接狀態(tài);TCP連接過程是狀態(tài)的轉換,促使發(fā)生狀態(tài)轉換的是用戶調用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS;傳送過來的數(shù)據(jù)段,特別那些包括以下標記的數(shù)據(jù)段SYN,ACK,RST和FIN;還有超時,上面所說的都會時TCP狀態(tài)發(fā)生變化。 TCP連接的狀態(tài)轉換圖 這個圖n多人都 知道,它對排除和定 位網絡或系統(tǒng)故障時大有幫助,但是怎樣牢牢地將這張圖刻在腦中呢?那么你就一定要對 這張圖的每一個狀態(tài),及轉換的過程有深刻地認識,不能只停留在一知半解之中。
17、下面對這張圖的11種狀 態(tài)詳細解釋一下,以便加強記憶!不過在這之前,先回顧一下TCP建立連接的三次握手過程,以及關閉連接的四次握手過程。1、建立連接協(xié)議(三次握手)(1)客戶 端發(fā)送一個帶SYN標志的TCP報文到服務器。這是三次握手過程中的報文1。(2) 服務器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ACK標志和SYN標 志。因此它表示對剛才客戶端SYN報文的回應;同時又標志SYN給客戶端,詢問客戶端是否準備好進行數(shù)據(jù)通 訊。(3) 客戶必須再次回應服務段一個ACK報文,這是報文段3。2、連接終止協(xié)議(四次握手) 由于TCP連 接是全雙工的,因此每個方向都必須單獨進行關閉。這
18、原則是當一方完成它的數(shù)據(jù)發(fā)送任務后就能發(fā)送一個FIN來終 止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接 在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關閉的一方將執(zhí)行主動關閉,而另一方執(zhí)行被動關閉。(1) TCP客 戶端發(fā)送一個FIN,用來關閉客戶到服務器的數(shù)據(jù)傳送(報文段4)。(2) 服務器收到這個FIN,它發(fā)回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一 樣,一個FIN將占用一個序號。(3) 服務器關閉客戶端的連接,發(fā)送一個FIN給客戶端(報文段6)。(4) 客戶段發(fā)回ACK報文確認,并將確認序號設置為收到序號加1(報文段7
19、)。CLOSED: 這個沒什么好說的了,表示初始狀態(tài)。LISTEN: 這個也是非常容易理解的一個狀態(tài),表示服務器端的某個SOCKET處 于監(jiān)聽狀態(tài),可以接受連接了。SYN_RCVD: 這個狀態(tài)表示接受到了SYN報 文,在正常情況下,這個狀態(tài)是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài),很短暫,基本上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個客戶端測試程序,故意將三次TCP握手 過程中最后一個ACK報文不予發(fā)送。因此這種狀態(tài)時,當收到客戶端的ACK報文 后,它會進入到ESTABLISHED狀態(tài)。SYN_SENT:
20、60;這個狀態(tài)與SYN_RCVD遙想呼應,當客戶端SOCKET執(zhí)行CONNECT連接時,它首先發(fā)送SYN報文,因此也隨即它會進入到了SYN_SENT狀態(tài),并等待服務端的發(fā)送三次握手中的第2個報文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報文。ESTABLISHED:這個容易理解了,表示連接已經建立了。FIN_WAIT_1: 這個狀態(tài)要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對方的FIN報 文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實際上是當SOCKET在ESTABLISHED狀態(tài)時,它想主動關閉連接,向對方發(fā)送了FIN報文,此時
21、該SOCKET即進入到FIN_WAIT_1狀態(tài)。而當對方回應ACK報文后,則進入到FIN_WAIT_2狀態(tài),當然在實際的正常情況 下,無論對方何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時常??梢杂胣etstat看到。FIN_WAIT_2:上面已經詳細解釋了這種狀態(tài),實際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點 數(shù)據(jù)需要傳送給你,稍后再關閉連接。TIME_WAIT: 表示收到了對方的FIN報 文,并發(fā)送出了ACK報文,就等2MSL后即可回
22、到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,收到了對方同時帶FIN標 志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態(tài),而無須經過FIN_WAIT_2狀態(tài)。CLOSING: 這種狀態(tài)比較特殊,實際情況中應該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當你發(fā) 送FIN報文后,按理來說是應該先收到(或同時收到)對方的ACK報 文,再收到對方的FIN報文。但是CLOSING狀態(tài)表示你發(fā)送FIN報文后,并沒有收到對方的ACK報 文,反而卻也收到了對方的FIN報文。什么情況下會出現(xiàn)此種情況呢?其實細想一下,也不難得出結論:那就是如果雙方幾乎在同時close一 個
23、SOCKET的話,那么就出現(xiàn)了雙方同時發(fā)送FIN報文的情況,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關閉SOCKET連接。CLOSE_WAIT: 這種狀態(tài)的含義其實是表示在等待關閉。怎么理解呢?當對方close一 個SOCKET后發(fā)送FIN報文給自己,你系統(tǒng)毫無疑問地會回應一個ACK報文 給對方,此時則進入到CLOSE_WAIT狀態(tài)。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對方,如果沒有的話, 那么你也就可以close這個SOCKET,發(fā)送FIN報文給對方,也即關閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關閉連接。LAST_ACK:
24、 這個狀態(tài)還是比較容易好理解的,它是被動關閉一方在發(fā)送FIN報 文后,最后等待對方的ACK報文。當收到ACK報文后,也即可以進入到CLOSED可用狀態(tài)了。最后有2個問題 的回答,我自己分析后的結論(不一定保證100%正確)1、 為什么建立連接協(xié)議是三次握手,而關閉連接卻是四次握手呢?這是因為服務端的LISTEN狀態(tài)下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起 應答作用,而SYN起同步作用)放在一個報文里來發(fā)送。但關閉連接時,當收到對方的FIN報文 通知時,它僅僅表示對方沒有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你可以未必
25、會馬上會關閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關閉連接了,所以它這里的ACK報文 和FIN報文多數(shù)情況下都是分開發(fā)送的。2、 為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀 態(tài)?這是因為:雖然雙方 都同意關閉連接了,而且握手的4個報文也都協(xié)調和發(fā)送完畢,按理可以直接回到CLOSED狀 態(tài)(就好比從SYN_SEND狀態(tài)到ESTABLISH狀態(tài)那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發(fā)送的ACK報 文會一定被對方收到,因此對方處于LAST_ACK狀態(tài)下的SOCKET可能會因為超時未
26、收到ACK報文,而重發(fā)FIN報 文,所以這個TIME_WAIT狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報 文,并保證于此。 斷開連接的時候, 當發(fā)起主動關閉的左邊這方發(fā)送一個FIN過去后,右邊被動關閉的這方要回應一個ACK,這個ACK是TCP回應的,而不是應用程序發(fā)送的,此時,被動關閉的一方就處于CLOSE_WAIT狀態(tài)了。如果此時被動關閉的這一方不再繼續(xù)調用closesocket,那么他就不會發(fā)送接下來的FIN,導致自己老是處于CLOSE_WAIT。只有被動關閉的
27、這一方調用了 closesocket,才會發(fā)送一個FIN給主動關閉的這一方,同時也使得自己的狀態(tài)變遷為LAST_ACK。 比如被動關閉的是客戶端.當對方調用closesocket的時候,你的程序正在 int nRet = recv(s,.); if (nRet = SOCKET_ERROR) / closesocket(s); return FALSE; 很多人就是忘記了那句closesocket,這種代碼太常見了。 我的理解,當主動關閉的一方發(fā)送FIN到被動關閉這邊后,被動關閉這邊的TCP馬上回應一
28、個ACK過去,同時向上面應用程序提交一個ERROR,導致上面的SOCKET的send或者recv返回SOCKET_ERROR.正常情況下,如果上面在返回SOCKET_ERROR后調用了closesocket, 那么被動關閉的者一方的TCP就會發(fā)送一個FIN過去,自己的狀態(tài)就變遷到LAST_ACK. 服務器上出現(xiàn)大量的close_wait的例子和解決方法(例子從網上找的,基本差不多)oracle9iRHEL3 oracle9i$ /usr/sbin/lsof -i | grep 6800oracle 22725 oracle9i
29、 3u IPv4 18621468 TCP RHEL3:6800 (LISTEN)oracle 22725 oracle9i 4u IPv4 18621469 TCP RHEL3:6800->RHEL3:2174 (CLOSE_WAIT)oracle 22725 oracle9i 8u IPv4 18621568 TCP RHEL3:6800-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學習動力不足的解決策略教育心理學的視角
- 二零二五年度鐵路信號設備安裝合同范本
- 后穹隆裂傷護理措施及診斷
- 心理健康實踐課
- 護理工作中的新方法和小技巧
- p-Phenetidine-4-Ethoxyaniline-生命科學試劑-MCE
- Multi-target-kinase-inhibitor-4-生命科學試劑-MCE
- Kylo-0603-生命科學試劑-MCE
- 世界洗手日培訓
- 護理碩士研究生中期匯報
- 職業(yè)教育學試題及答案
- 2024年宜昌市檢察機關招聘檢察輔助人員筆試真題
- 海外員工宿舍管理制度
- 物流公司售后管理制度
- 2025年《環(huán)境空間設計》課程標準
- 純凈水及礦泉水廠可行性研究報告
- 援絕神丹_集成良方三百種_方劑加減變化匯總
- 中藥飲片GMP認證檢查指導原則
- word電子版下載:房屋租賃合同范本
- IPC-6012C-2010中文版剛性印制板的鑒定及性能規(guī)范
- GB_T 261-2021 閃點的測定 賓斯基-馬丁閉口杯法(高清-現(xiàn)行)
評論
0/150
提交評論