TCP/IP三次握手、四次揮手總結

(一)TCP/IP三次握手原理:
這裏寫圖片描述
建立連接協議(三次握手)
(1)客戶端向服務器端發送連接請求包SYN(syn=j),等待服務器迴應;
(2)服務器端收到客戶端連接請求包SYN(syn=j)後,將客戶端的請求包SYN(syn=j)放入到自己的未連接隊列,此時服務器需要發送兩個包給客戶端;
1.向客戶端發送確認自己收到其連接請求的確認包ACK(ack=j+1),向客戶端表明已知道了其連接請求
  2.向客戶端發送連接詢問請求包SYN(syn=k),詢問客戶端是否已經準備好建立連接,進行數據通信;
(3) 客戶端收到服務器的ACK(ack=j+1)和SYN(syn=k)包後,知道了服務器同意建立連接,此時需要發送連接已建立的消息給服務器;
  向服務器發送連接建立的確認包ACK(ack=k+1),迴應服務器的SYN(syn=k)告訴服務器,我們之間已經建立了連接,可以進行數據通信。
爲什麼不能只兩次握手?
有了三次握手的詳細步驟,就可以分析爲什麼需要三次握手而不是兩次握手了。
三次握手的目的:消除舊有連接請求的SYN消息對新連接的干擾,同步連接雙方的序列號和確認號並交換TCP 窗口大小信息.
設想:如果只有兩次握手,那麼第二次握手後服務器只向客戶端發送ACK包,此時客戶端與服務器端建立連接。在這種握手規則下:
假設:如果發送網絡阻塞,由於TCP/IP協議定時重傳機制,B向A發送了兩次SYN請求,分別是x1和x2,且因爲阻塞原因,導致x1連接請求和x2連接請求的TCP窗口大小和數據報文長度不一致,如果最終x1達到A,x2丟失,此時A同B建立了x1的連接,這個時候,因爲AB已經連接,B無法知道是請求x1還是請求x2同B連接,如果B默認是最近的請求x2同A建立了連接,此時B開始向A發送數據,數據報文長度爲x2定義的長度,窗口大小爲x2定義的大小,而A建立的連接是x1,其數據包長度大小爲x1,TCP窗口大小爲x1定義,這就會導致A處理數據時出錯。很顯然,如果A接收到B的請求後,A向B發送SYN請求y3(y3的窗口大小和數據報長度等信息爲x1所定義),確認了連接建立的窗口大小和數據報長度爲x1所定義,A再次確認回答建立x1連接,然後開始相互傳送數據,那麼就不會導致數據處理出錯了。

(二)TCP/IP釋放連接需四次揮手
先看圖,直觀的瞭解下:
這裏寫圖片描述
需四次揮手原因:由於TCP的半關閉特性,TCP連接時雙全工(即數據在兩個方向上能同時傳遞),因此,每個方向必須單獨的進行關閉。這個原則就是:當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向上的連接。當一端收到一個FIN後,它必須通知應用層另一端已經終止了那個方向的數據傳送。即收到一個FIN意味着在這一方向上沒有數據流動了。

目的:保證服務器與客戶端都能完全的接受對方發送的數據。

假設客戶機A向服務器B請求釋放TCP/IP連接,則:
第一次揮手:主機A向主機B發送FIN包;A告訴B,我(A)發送給你(B)的數據大小是N,我發送完畢,請求斷開A->B的連接。
第二次揮手:主機B收到了A發送的FIN包,並向主機A發送ACK包;B回答A,是的,我總共收到了你發給我N大小的數據,A->B的連接關閉。
第三次揮手:主機B向主機A發送FIN包;B告訴A,我(B)發送給你(A)的數據大小是M,我發送完畢,請求斷開B->A的連接。
第四次揮手:主機A收到了B發送的FIN包,並向主機B發送ACK包;A回答B,是的,我收到了你發送給我的M大小的數據,B->A的連接關閉。

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