什麼是TCP
TCP是面向連接的可靠的數據包傳遞。針對不穩定的網絡層做完全彌補,藉助回執,丟包重傳。
TCP三次握手
- 主動建立請求連接(客戶端),發送SYN標誌位,攜帶序號n
- 被動接受連接請求端(服務器),接收SYN標誌位,回發ACK攜帶確認序號n+1。同時發送SYN標誌位M。
- 主動建立請求連接(客戶端),接收SYN標誌位,回發ACK確認序號M+1
標誌3次握手完成,對應應用層
客戶端:Dial()
服務器:Accept()
TCP數據通信
發送端發送數據同時,攜帶序號。接收端,收到數據後需要給發送端發送ACK應答以及確認信號
確保TCP通信模式下,數據可靠的傳輸。
四次揮手
主動斷開連接請求端(客戶端),發送FIN標誌位,攜帶序號。
被動斷開連接請求端(服務器),接收FIN標誌位,回發ACK應答。攜帶確認序號。
半關閉(半關閉後,客戶端不發數據,發tcp包頭)
主動斷開連接請求端(服務器),發送FIN標誌位,攜帶序號。
主動斷開連接請求端(客戶端),接收FIN標誌位,回發ACK應答。攜帶確認序號。
關閉
TCP狀態轉換圖:
主動連接端:
CLOSED->發送SYN->SYN_SENT->接收ACK、SYN,發送ACK->ESTABLISHED->數據通信
主動關閉端:
ESTABLISHED->發送FIN->FIN_WAIT_1->接收ACK->FIN_WAIT_2(半關閉)->接收FIN,發送ACK
->TIME_WAIT->等待2MSL時長->CLOSED
2MSL:爲了確保tcp通信過程中的最後一個ACK能被對端收到,等待的一個時長(約40s在ubuntu,不同系統不一樣)
FIN_WAIT_1、FIN_WAIT_2、 TIME_WAIT、 2MSL 只出現在主動端
被動連接端(服務器):
CLOSED->LISTEN->接收SYN,發送ACK,SYN->SYN_RCVD->接收ACK->ESTABLISHED->數據通信
被動關閉端(服務器):
ESTABLISHED->接收FIN,發送ACK->CLOSED_WAIT(對應主動端的FIN_WAIT_2)->發送FIN->
LAST_ACK->接收ACK->CLOSED
小結
tcp:三次握手、建立鏈接、4次揮手。
三次握手:syn , ack syn, ack
4次揮手:fin, ack, fin, ack
主動方:想關閉fin_wait1
,發fin收ack fin_wait2
,收fin發ack time_wait
,2msl,關閉
fin_wait2
是半關閉狀態,只能收不能發數據
被動方:收fin發ack close_wait
(對應fin_wait2) 發送
tcp是面向鏈接,使用的是流式傳輸,保證數據準確性,保證數據的順序,通信成本相對較高
udp是面向無連接,使用數據包傳輸,通信成本相對較低。