建立TCP連接的過程需要進行三次信息交換,通常稱為“三次握手”,示意圖如下:
圖中Seq代表TCP段首部中的“序號(Sequence Number)”:是TCP段所發送的數據部分第一個字節的序號。在TCP傳送的數據流中,每一個字節都有一個序號。建立連接時,發送方將初始序號(Initial Sequence Number, ISN)填寫到第一個發送的TCP段序號中。
圖中Ack代表TCP段首部中的“確認號”:是期望收到對方下次發送的數據的第一個字節的序號,也就是期望收到的下一個TCP段的首部中的序號,等於已經成功收到的TCP段的最后一個字節序號加1。確認號在ACK標志為1時有意義,除了主動發起連接的第一個TCP段不設置ACK標志外,其后發送的TCP段都會設置ACK標志。
三次握手的具體過程闡述如下:
1. 客戶端主動與服務器聯系,TCP首部控制位中的SYN設置為1,發送帶有SYN的TCP段,並把初始序號告訴對方。
2. 服務器端收到帶有SYN的報文,記錄客戶端的初始序號,選擇自己的初始序號,設置控制位中的SYN和ACK。因為SYN占用一個序號,所以確認序號設置為客戶端的初始序號加1,對客戶端的SYN進行確認。
3. 服務器端的報文到達客戶端,客戶端設置ACK控制位,並把確認號設為服務器的初始序號加1,以確認服務器的SYN報文段,這個報文只是確認信息,告訴服務器已經成功建立了連接。
至此“三次握手”建立連接完成。在TCP連接中,每台主機會創建一個TCB數據結構,存儲與連接有關的數據。關於“建立TCP連接,為什么需要三次握手”,參考:理解TCP為什么需要進行三次握手
【學習資料】 《Winsock網絡編程經絡》