TCP協議建立連接與釋放連接
TCP協議是面向連接的協議,要傳送數據,需要進行建立連接、傳送數據、釋放連接三個階段。其中建立連接需要三次握手,而釋放連接需要四次握手,其原理如下:
建立連接:
首先,服務器端要開啓服務,創建TCB(傳輸控制模塊),然後服務器端進入LISTEN狀態,等待客戶端的連接。
客戶端也需要建立TCB,然後向服務器端發出請求:SYN=1,seq=w,然後進入SYN-SEND狀態,等待響應。
服務器端接收到請求後,發送:SYN=1,ACK=1,ack=w+1,seq=u,然後進入SYN-REVD狀態。
客戶端接收到後,發送:ACK=1,seq=w+1,ack=u+1,進入ESTABLISHED階段。
服務器接收到後,進入ESTABLISHED階段,TCP連接正式建立。
三次握手原因
如果A發送給B的數據報中途耽擱,A會重發,B先收到了第二個,順利與A建立連接。AB傳送完數據之後釋放連接,此時B又收到了第一個,以爲A又要連接,於是進行響應,如果兩次連接則到此B已經與A建立了連接,此時B一直等A發送數據,消耗了資源。所以必須進行三次握手。
釋放連接
客戶端發出請求,請求釋放連接,發送:FIN=1,seq=w,然後進入FIN-WAIT-1階段。
服務器端收到請求,發送:(1)ACK=1,ack=w+1,seq=u,進入CLOSE-WAIT階段。此時如果服務器仍有數據需要發送,則繼續發送。直到沒有數據發送時,向客戶端發送:(2)FIN=1,ACK=1,ack=w+1,seq=y,進入LAST-ACK階段。
客戶端收到(1),進入FIN-WAIT-2階段,收到(2),向服務器發送:ACK=1,ack=y+1,seq=w+1,進入TIME-WAIT階段,客戶端等待兩個MSL(最長報文段壽命),關閉連接。
服務器端收到後,也關閉連接。
TIME-WAIT的作用
1.如果B收不到A最後發送的確認請求,則B會重新發送FIN,A在2MSL時間內會收到B重發的,A可以再進行確認,這樣防止B收不到確認時,服務器端不能正確進入CLOSED.
2.在2MSL中,網絡中所有與本次連接相關的數據包都被消耗掉,防止出現已失效的連接請求報文段的問題。
保活計時器
服務器端有一個保活計時器用於記錄客戶端狀態,以免白白等待,每收到一次客戶端的消息就更新保活計時器,通常爲兩小時,如果超過兩小時還沒收到新的,則服務器會發探測數據報來探測客戶端的狀態。