序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號后,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。
確認號ack:占4個字節,期待收到對方下一個報文段的第一個數據字節的序號;序列號表示報文段攜帶數據的第一個字節的編號;而確認號指的是期望接收到下一個字節的編號;因此當前報文段最后一個字節的編號+1即為確認號。
確認ACK:占1位,僅當ACK=1時,確認號字段才有效。ACK=0時,確認號無效
同步SYN:連接建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。SYN這個標志位只有在TCP建產連接時才會被置1,握手完成后SYN標志位被置0。
終止FIN:用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接
PS:ACK、SYN和FIN這些大寫的單詞表示標志位,其值要么是1,要么是0;ack、seq小寫的單詞表示序號。
(1)、第一次握手:客戶端將標志位SYN置1,產生隨機值seq = x,並將此數據包發送給給服務器端,進入SYN_SEND狀態,等待服務器端確認
(2)、第二次握手:務器應用進程被動打開。若同意客戶端的請求,則發回確認報文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。
(3)、第三次握手:戶端收到確認報文之后,通知上層應用進程連接已建立,並向服務器發出確認報文,其首部:ACK=1,ack=y+1。當服務器收到客戶端的確認報文之后,也通知其上層應用進程連接已建立。
第一次揮手:數據傳輸結束以后,客戶端的應用進程發出連接釋放報文段,並停止發送數據,其首部:FIN=1,seq=u。
第二次揮手:服務器端收到連接釋放報文段之后,發出確認報文,其首部:ack=u+1,seq=v。此時本次連接就進入了半關閉狀態,客戶端不再向服務器發送數據。而服務器端仍會繼續發送。
第三次揮手:若服務器已經沒有要向客戶端發送的數據,其應用進程就通知服務器釋放TCP連接。這個階段服務器所發出的最后一個報文的首部應為:FIN=1,ACK=1,seq=w,ack=u+1。
第四次揮手:客戶端收到連接釋放報文段之后,必須發出確認:ACK=1,seq=u+1,ack=w+1。 再經過2MSL(最長報文端壽命)后,本次TCP連接真正結束,通信雙方完成了他們的告別。
在這個過程中,通信雙方的狀態如下圖,其中:ESTAB-LISHED:連接建立狀態、FIN-WAIT-1:終止等待1狀態、FIN-WAIT-2:終止等待2狀態、CLOSE-WAIT:關閉等待狀態、LAST-ACK:最后確認狀態、TIME-WAIT:時間等待狀態、CLOSED:關閉狀態。
為什么要進行三次握手呢?(兩次確認)
2、在結束連接的過程中,為什么在收到服務器端的連接釋放報文段之后,客戶端還要繼續等待2MSL之后才真正關閉TCP連接呢?
這種情況雖然發生的可能性極小,但是是確實存在的,TCP也特意設計了相關機制,使得在這種情況下雙方僅建立一條連接。雙方同時請求連接的情況下,雙方同時發出請求連接報文,並進入SYN-SENT狀態;當收到對方的請求連接報文后,會再次發送請求連接報文,確認號為對方的SYN+1,並進入SYN-RCVD狀態;當收到對方第二次發出的攜帶確認號的請求報文之后,會進入ESTAB-LISHED狀態。 雙方同時請求釋放連接也是同樣的,雙方同時發出連接釋放報文,並進入FIN-WAIT-1狀態;在收到對方的報文之后,發送確認報文,並進入CLOSING狀態;在收到對方的確認報文后,進入TIME-WAIT狀態,等待2MSL之后關閉連接。需要注意的是,這個時候雖然不用再次發送確認報文並確認對方收到,雙方仍需等待2MSL之后再關閉連接,是為了防止“已失效的連接請求報文段”的影響。 過程圖如下: