TCP\IP三次握手連接,四次握手斷開分析

TCP(Transmission Control Protocol) 傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:

位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送)FIN(finish結束) RST(reset重置) URG(urgent緊急)

Sequence number(發送序列) Acknowledge number(確認序列)


第一次握手:主機A發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道A要求與之建立聯機;
第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連接建立成功。
完成三次握手,主機A與主機B開始傳送數據。

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。 
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認; 
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進 入SYN_RECV狀態; 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據.


握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)


問題:
1.爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?  
這是因爲服務端的 LISTEN 狀態下的 SOCKET 當收 到 SYN 報文的建立連接請求後,它可以把 ACK 和 SYN ( ACK 起應答作用,而 SYN 起同步作用)放在一個報文裏來發送。但關閉連接時, 當收到對方的 FIN 報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉 SOCKET, 也即你可能還需要發送一些數據給對方之後,再發送 FIN 報文給對方來表示你同意現在可以關閉連接了,所以它這裏的 ACK 報文 和 FIN報文多數情況下都是分開發送的。  如果發送ack報文時已經發送完所有數據,也可以ack+fin一起發送,變成“三次斷開”
2.爲什麼 TIME_WAIT 狀態還需要等 2MSL 後才能返回到 CLOSED 狀態?  
這是因爲雖然雙方都同意關閉連接了,而且握手的 個報文也都協調和發送完畢,按理可以直接回到 CLOSED 狀態(就好比從 SYN_SEND 狀態 到 ESTABLISH 狀態那樣);但是因爲我們必須要假想網絡是不可靠的,你無法保證你最後發送的 ACK 報文會一定被對方收到,因此對方處 於 LAST_ACK 狀態下的 SOCKET 可能會因爲超時未收到 ACK 報文,而重發 FIN 報文,所以這個 TIME_WAIT 狀態的作用 就是用來重發可能丟失的 ACK 報文

第二個原因,就是如果建立了之前的同IP同端口的鏈接,可以保證網絡中的舊數據因到了壽命而消失,不會被當成新鏈接中的數據進行交互.


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