確保可靠性的TCP協議
按層次分,TCP位于傳輸層,提供可靠的字節流服務。
所謂的字節流服務是指,為了方便傳輸,將大塊數據分割成以報文段為單位的數據包進行管理。而可靠的服務是指,能夠把數據準確可靠的傳送給對方。
三次握手
為了確保無誤地將數據發送到目標處,TCP協議采用三次握手策略。用TCP協議把數據包發送出去后,TCP不會對傳送后的情況置之不理,它一定會向對方確認是否出成功送達。握手過程中使用了TCP的標志——SYN和ACK。
第一次握手:客戶機A發送標識位SYN = 1,隨機產生序列號seq = x的數據包到服務器B,服務器B由SYN = 1知道客戶機A要建立連接,并進入SYN_SEND狀態,等待服務器確認;;
第二次握手:服務器B收到請求并確認聯機信息后,向客戶機A發送標識位SYN = 1,ACK = 1和隨機產生的序列號seq = y, 確認碼ack number = x+1(客戶機A發送的seq+1)的數據包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶機A收到后檢查確認碼ack number是否正確,即和第一次握手發送的序列號加1結果是否相等,以及ACK標識位是否為1;若正確,客戶機A發送標識位ACK = 1、seq = x + 1和確認碼ack number = y + 1(服務器B發送的seq+1)到服務器B,服務器B收到后確認ACK=1和seq是否正確,若正確則完成建立連接,此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手,客戶端與服務器開始傳送數據.。
四次揮手
第一次揮手:客戶端A發送一個FIN = 1、初始化序列號seq = u,到服務器B,用來主動關閉客戶A到服務器B的數據傳送,客戶機A進入FIN-WAIT-1狀態,等待服務器B發送FIN;
第二次揮手:服務器B收到這個FIN,它發回ACK = 1、確認序號ack number為收到的序號加1(ack number=u+1);和SYN一樣,一個FIN將占用一個序號seq = v,客戶機A進入FIN-WAIT-2,稍后關閉連接,服務器B進入CLOSE_WAIT,等待關閉連接;
第三次揮手:服務器B關閉與客戶端A的連接,發回標識位FIN = 1,ACK = 1,seq = w和確認碼ack number=u+1給客戶端A,服務器B進入LAST_ACK,等待最后一次ACK確認;
第四次揮手:客戶端A發送ACK = 1報文確認,并將確認序號設置為收到序號加1(ack number=w+1)到服務器B,客戶機A進入TIME-WAIT等待2MAL后進入CLOSE可用狀態,服務器B進入CLOSE可用狀態。
TCP協議的特點
- TCP是面向連接的端到端協議。
- TCP連接是點到點的。TCP連接是在單個發送方與單個接收方之間的連接。
- TCP連接提供的是全雙工服務。如果一臺主機上的進程A與另一臺主機上的進程B存在一條TCP連接,那么應用層數據在從B流向A的同時也能從A流向B。
- TCP提供可靠的交付服務。通過TCP連接傳輸的數據,能夠保證無差錯、不丟失、不重復并且按序地到達。
- TCP連接采用的是客戶/服務器模式。
- TCP報文段的劃分。
- 面向字節流。