本文主要講述的是
1、TCP協議三次握手原理,以及為什么要三次握手,兩次握手帶來的不利后果。
2、TCP協議四次揮手原理,為什么要四次揮手。
TCP協議三次握手原理:
首先,給張圖片,建立TCP三次握手的直觀印象。
每次握手(發送數據請求或應答)時,發送的數據為TCP報文,TCP段包含了源/目的地址,端口號,初始序號,滑動窗口大小,窗口 擴大因子,最大報文段長度等。還有一些標志位:
(1)SYN:同步序號
(2)ACK:應答回復
(3)RST:復位連接,消除舊有的同步序號
(4)PSH:盡可能的將數據送往接收進程
(5)FIN:發送方完成數據發送
(6)URG
從圖中,可以看出三次握手的基本步驟是:
第一次握手:客戶端向服務器端發送連接請求包SYN(syn=j),等待服務器回應;
第二次握手:服務器端收到客戶端連接請求包SYN(syn=j)后,將客戶端的請求包SYN(syn=j)放入到自己的未連接隊列,此時服務器需要發送兩個包給客戶端;
(1)向客戶端發送確認自己收到其連接請求的確認包ACK(ack=j+1),向客戶端表明已知道了其連接請求
(2)向客戶端發送連接詢問請求包SYN(syn=k),詢問客戶端是否已經准備好建立連接,進行數據通信;
即在第二次握手時服務器向客戶端發送ACK(ack=j+1)和SYN(syn=k)包,此時服務器進入SYN_RECV狀態。
第三次握手:客戶端收到服務器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服務器同意建立連接,此時需要發送連接已建立的消息給服務器;
向服務器發送連接建立的確認包ACK(ack=k+1),回應服務器的SYN(syn=k)告訴服務器,我們之間已經建立了連接,可以進行數據通信。
ACK(ack=k+1)包發送完畢,服務器收到后,此時服務器與客戶端進入ESTABLISHED狀態,開始進行數據傳送。
為什么不能只兩次握手?
有了三次握手的詳細步驟,就可以分析為什么需要三次握手而不是兩次握手了。
三次握手的目的:消除舊有連接請求的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協議釋放連接需四次揮手
先看圖,直觀的了解下:
需四次揮手原因:由於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的連接關閉。
參考:1、http://linux.chinaunix.net/techdoc/net/2009/06/15/1118762.shtml
2、http://zhmy.michael.blog.163.com/blog/static/8615787920111030115535226/
3、《TCP/IP詳解》卷1
4、《計算機網絡》第四版