TCP狀態轉換--值得學習--方便記憶

 轉載:http://blog168.chinaunix.net/space.phpuid=20196318&do=blog&id=168206

挺好的,方便記憶!!!

實線:表示客戶的正常狀態轉換    虛線:表示服務器的正常狀態裝換

應用:表示狀態轉換在應用進程發起操作時發生

接受:表示狀態轉換在接受到分節時發生  發送:表示這個轉換髮送什麼

 

三次握手建立連接

服務器調用socketbindlisten來完成,即執行被動打開,準備好接受外來的請求。

1. 客戶端發調用connect發送SYN分節(同步),它告訴服務器客戶將在連接中發送的數據的初始序列號。此時客戶端進入SYN_SENT狀態。

2. 服務器接受到客戶端SYN分節後,必須進行確認,同時發送一個SYN分節到客戶端。服務器發送ACK+SYN後,服務器進入SYN_RECV狀態。

3. 客戶端收到服務器發送的SYN,並進行確認。客戶端發送ACK後進入ESTABLISHED狀態,服務器接收到ACK後也進入到ESTABLISHED狀態。

 

l 當客戶端與服務器都進入ESTABLISHED狀態後,就說明TCP連接成功建立。

l 當客戶端處於SYN_SENT狀態,如果沒有收到ACK(超時),客戶端會多次(幾次?)重發SYN,如果連接仍未能建立,則進入CLOSED狀態。

l 當服務器處於SYN_RECV狀態時,如果收到RST分節,則進入CLOSED狀態。SYN_RECV狀態的服務器沒有收到ACK時,其一直處於半連接狀態,其信息會存在服務器的緩衝區中,直到超時,SYN Flood***就是靠大量的半連接SYN來耗盡服務器的資源。

l 同時打開:爲了處理同時打開,對於同時打開它僅建立一條連接而不是兩條連接。兩端幾乎在同時發送SYN,並進入SYN_SENT狀態。當每一端收到SYN時,狀態變爲SYN_RCVD,同時他們都再發SYN並對收到的SYN進行確認。當雙方都收到SYN及相應的ACK時,狀態都變爲ESTABLISHED

 

四次揮手斷開連接

1. 某個應用進程首先調用close,執行主動關閉,導致發送一個FIN分節,表示數據發送完畢,進入FIN_WAIT_1狀態。

2. 接受FIN的另一端執行被動關閉,其確認收的FIN,接受到的FIN作爲文件結束符傳遞給接收端的應用進程(放在已排隊等候該應用進程接受的任何其它數據之後),進入CLOSE_WAIT狀態。同時原發送端接受到FIN後進入TIME_WAIT_2狀態。

3. 一段時間後,接收到文件結束符的應用進程將調用CLOSE關閉它的套接口,向對端發送一個FIN,進入LAST_ACK狀態。

4. 接受到這個FIN的原發送端對它進行確認,發送ACK,並進入TIME_WAIT狀態,在此狀態保留2MSL時間後,進入CLOSED狀態。而另一端收到ACK後進入CLOSED狀態。

 

l 被動關閉的一段的ACKFIN可能同時發送(捎帶),則主動關閉的一端由TIME_WAIT_1直接進入TIME_WAIT狀態。

l 主動關閉一端存在TIME_WAIT狀態的原因。

1. 如果主動關閉端最後發送的ACK丟失,則被動關閉一端將重發FIN,此時主動關閉一端必須重發最後的ACK,所以其不能再發送ACK後立即進入CLOSED狀態。

2. 防止IP和端口立即被重用,而還在“線上”的數據將影響重用的進程。2MSL的時間允許某個方向的分組最多存活MSL時間即被丟棄。

l 同時關閉:當應用層發出關閉命令,兩端均從ESTABLISHED變爲FIN_WAIT_1。這將導致雙方各發送一個FIN,兩個FIN經過網絡傳送後分別到達另一端。收到FIN後,狀態由FIN_WAIT_1變爲CLOSING,併發送最後的ACK。當收到最後的ACK,狀態變爲TIME_WAIT

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章