最近在結合「慕課網」的實戰課程《劍指Java
面試-Offer
直通車》複習基礎知識,在複習計算機網絡時,發現原來我在書上學的TCP
相關知識是不許確的,不符合面試要求。面試
這是我學習計算機網絡時使用的課本,讓咱們一塊兒來見識見識真正的TCP
!服務器
TCP
:全稱Transmission Control Protocol
,傳輸控制協議。TCP
是面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。網絡
咱們天天都在用的HTTP
、HTTPS
都是基於運輸層的TCP
協議。學習
TCP
數據包格式每一個TCP
報文內都有序號和確認號,結合重傳機制保障數據傳輸的可靠性。spa
TCP
報文中的下列三種表示十分重要。計算機網絡
ACK
:確認序號標誌SYN
:同步序號,用於創建鏈接過程FIN
:finish
標誌,用於釋放鏈接3d
TCP
鏈接中最著名的要屬三次握手
了!code
第一次握手:創建鏈接時,客戶端發送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
狀態,完成三次握手。
很是有深度的問題,非認真思考而不可達。
這是《計算機網絡》一書中對此的解釋。
滿滿的兩頁,一句說到核心的都沒有。
TCP
三次握手的核心是交換Client
和Server
初始的Sequence Number
。
咱們假設TCP
鏈接中沒有三次握手。咱們再假設通訊過程當中已經創建好了Client
到Server
的全雙工通訊通道。
若是Client
給Server
發送數據包。該數據包編號是18888
,長度是100
。
若是是正確收到,根據TCP
的機制,應該回復ACK
,ack = 18988
。
若是是這個數據包時第一個數據包,這樣是合理的,回覆18988
,意味着當前的18988
以前的數據包都已經收到了,下一個期待的數據編號是18988
。
假設Client
和Server
同時發送了兩個數據包,18788
和18888
,而18788
由於網絡的問題,傳丟了。那服務器端再回復ACK
就不合理了。
因此,在TCP
鏈接中通訊的雙方,都須要知道對方所開始發送數據的初始的Sequence Number
。而爲了完成這個任務,纔有了TCP
的三次握手。
Sequence Number
初始值。Sequence Number
初始值。二、3
兩步能夠進行合併,即服務端發一個TCP
數據包就能夠完成確認和發送本身的Sequence Number
兩項任務,因此就是三次握手。
寫書不易,出錯時不免的,每位做者也都應該收到尊重。
可是畢竟做爲教授萬千學子的教科書,請求學校選擇課本時請慎重。