那些年,被咱們誤解的TCP

引言

clipboard.png

最近在結合「慕課網」的實戰課程《劍指Java面試-Offer直通車》複習基礎知識,在複習計算機網絡時,發現原來我在書上學的TCP相關知識是不許確的,不符合面試要求。面試

clipboard.png

這是我學習計算機網絡時使用的課本,讓咱們一塊兒來見識見識真正的TCP服務器

學習

簡介

TCP:全稱Transmission Control Protocol,傳輸控制協議。TCP是面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。網絡

咱們天天都在用的HTTPHTTPS都是基於運輸層的TCP協議。學習

TCP數據包格式

每一個TCP報文內都有序號和確認號,結合重傳機制保障數據傳輸的可靠性。spa

clipboard.png

TCP報文中的下列三種表示十分重要。計算機網絡

ACK:確認序號標誌
SYN:同步序號,用於創建鏈接過程
FINfinish標誌,用於釋放鏈接3d

三次握手

TCP鏈接中最著名的要屬三次握手了!code

clipboard.png

詳解

第一次握手:創建鏈接時,客戶端發送SYN ( seq = x )包到服務器,同時進入SYN_SEND狀態,等待服務器確認。blog

第二次握手:服務器收到SYN包,必須確認客戶的SYN ( ack = x + 1 ),同時本身也發送一個SYN ( seq = y )包,即SYN + ACK包,此時服務器進入SYN_RECV狀態。ip

第三次握手:客戶端收到服務器的SYN + ACK包,向服務器發送確認包ACK ( ack = y + 1 ),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

clipboard.png

爲何須要三次握手才能創建起鏈接?

很是有深度的問題,非認真思考而不可達。

這是《計算機網絡》一書中對此的解釋。

clipboard.png

滿滿的兩頁,一句說到核心的都沒有。

TCP三次握手的核心是交換ClientServer初始的Sequence Number

假設

咱們假設TCP鏈接中沒有三次握手。咱們再假設通訊過程當中已經創建好了ClientServer的全雙工通訊通道。

若是ClientServer發送數據包。該數據包編號是18888,長度是100

若是是正確收到,根據TCP的機制,應該回復ACKack = 18988

clipboard.png

若是是這個數據包時第一個數據包,這樣是合理的,回覆18988,意味着當前的18988以前的數據包都已經收到了,下一個期待的數據編號是18988

clipboard.png

假設ClientServer同時發送了兩個數據包,1878818888,而18788由於網絡的問題,傳丟了。那服務器端再回復ACK就不合理了。

因此,在TCP鏈接中通訊的雙方,都須要知道對方所開始發送數據的初始的Sequence Number。而爲了完成這個任務,纔有了TCP的三次握手。

三次握手

  1. 客戶端發送它的Sequence Number初始值。
  2. 服務端確認收到。
  3. 服務端發送它的Sequence Number初始值。
  4. 客戶端確認收到。

二、3兩步能夠進行合併,即服務端發一個TCP數據包就能夠完成確認和發送本身的Sequence Number兩項任務,因此就是三次握手。

總結

寫書不易,出錯時不免的,每位做者也都應該收到尊重。

可是畢竟做爲教授萬千學子的教科書,請求學校選擇課本時請慎重。

相關文章
相關標籤/搜索