作為面試會被經常考察的的點,自己複習了一下,總結如下:
先上圖:
所謂三次握手,是指建立乙個 tcp 連線時,需要客戶端和伺服器總共傳送 3 個包。
第一次握手(syn=1, seq=j)
建立連線時,客戶端傳送 syn 包到伺服器,並進入syn_send
狀態,等待伺服器確認;
(syn 標誌位為 1,初始化序號 為 j)
第二次握手(syn=1, ack=1, ack=j+1, seq=k)
伺服器收到 syn 包,確認客戶的 syn 包無誤,發回確認包(ack)應答。即 syn 標誌位和 ack 標誌位均為 1。伺服器選擇自己的 isn 序列號 (k) ,放到 seq 域中,同時將確認序列號 (ack) 設定為客戶的 isn 加 1,即 j+1。傳送完畢後,伺服器進入syn_recv
狀態。
第三次握手(ack=1, ack=k+1)
客戶端收到伺服器的確認包 (ack),客戶端再次傳送確認包 (ack)。syn 標誌位為 0,ack 標誌位為 1,同時將確認序列號 (ack) 設定為伺服器的 isn 加 1,即 k+1。
傳送完畢後,客戶端進入established
狀態,當伺服器接受到這個包時,也進入established
狀態,tcp握手結束。
上述描述可能不太好理解,我們可以理解成兩個人之間的對話:
先上圖:
由於 tcp 連線時全雙工的,因此每個方向都必須單獨進行關閉。即關閉 tcp的連線時需要傳送四個包。
第一次揮手(fin=1,seq=x)
假設客戶端想要關閉連線,客戶端傳送乙個 fin 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。
傳送完畢後,客戶端進入fin_wait_1
狀態。
第二次揮手(ack=1,acknum=x+1)
伺服器端確認客戶端的 fin 包,傳送乙個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。
傳送完畢後,伺服器端進入close_wait
狀態,客戶端接收到這個確認包之後,進入fin_wait_2
狀態,等待伺服器端關閉連線。
第三次揮手(fin=1,seq=y)
伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,fin 置為1。
傳送完畢後,伺服器端進入last_ack
狀態,等待來自客戶端的最後乙個ack。
第四次揮手(ack=1,acknum=y+1)
客戶端接收到來自伺服器端的關閉請求,傳送乙個確認包,並進入time_wait
狀態,等待可能出現的要求重傳的 ack 包。
伺服器端接收到這個確認包之後,關閉連線,進入closed
狀態。
客戶端等待了某個固定時間之後,沒有收到伺服器端的 ack ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入closed
狀態。
tcp 四次揮手 TCP的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP三次握手和四次揮手
一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...
TCP三次握手和四次揮手
三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...