TCP三次握手的簡單理解
為什么要進行三次握手?
眾所周知,TCP協議與UDP協議的最大不同在於TCP協議使用的是面向連接的,可靠的數據傳輸協議,既然是可靠的數據傳輸協議,那么在傳輸數據之前,就必須先建立連接,那么怎樣才能建立連接呢?那就是通過TCP三次握手實現的。
事實上,TCP三次握手中蘊含了許多有趣的故事,舉個我曾看過的一個例子,大概內容如下:紅軍和藍軍都想消滅一波敵人,但是單憑他們一個軍隊的力量都不足以消滅這波敵人,因此他們想到了一起合作,於是紅軍向藍軍發了一封電報,內容是約定好早上8點一起向敵軍進攻,由於他們不確定藍軍是否一定能收到電報,所以只有收到藍軍的回復之后才會進行進攻,而藍軍也是同樣的想法,因為他們不確定紅軍一定能收到自己的回復而在約定好的時間發動進攻,所以他們只有收到紅軍的回復后才發動進攻……
問怎樣才能保證這次戰役一定勝利呢?答案是不可能的,因為雙方都對於自己發出的消息對方是否一定接收得到存在質疑,所以,這樣的通信將一直進行下去,結果將是使勝利的幾率一直接近100%,但是卻永遠達不到100%,那么有什么好方法解決這種現狀呢?一種方法就是提前約定好,在幾次通信之后,就發動進攻,而不是一直繼續下去。而TCP協議就是使用這種方法,在三次通信之后就建立連接,在這個例子之中就是:紅軍率先發送消息,藍軍收到消息之后立即回復,紅軍收到藍軍的回復后立即向藍軍發送消息確認自己已收到藍軍的回復,之后紅軍不管藍軍是否收到自己的回復,都按約定好的時間發動進攻,而藍軍只有收到紅軍第二次發的消息之后才按計划發動進攻。
三次握手的過程
首先要簡單了解ACK和SYN是什么:
ACK: 響應數據包
SYN: 主動建立連接數據包
第一步:客戶端隨機選取一個大於1024的端口作為程序的溝通接口,在TCP報頭中,包含帶有SYN的主動連接,記錄下發送給服務器的SYN序號。
第二步:服務器收到客戶端的SYN后,回復給客戶端一個同時帶有SYN和ACK的TCP數據包,同時,將收到的客戶端發送的SYN序號加1,便於客戶端確認,同時重新發送一個SYN序號,然后等待客戶端響應。
第三步:客戶端收到服務器的響應之后,驗證服務器ACK序號,並將服務器SYN序號加1,並返回包含ACK的TCP數據包。
第四步:服務器收到來自客戶端的響應之后,驗證ACK序號,建立連接。
如下圖: