在通訊系統中,最基本的資訊的傳遞都需要兩步,傳送方傳送的訊息和對方的回覆確認:A->B Send, B->A Reply(ACK)。如果多接觸一下其他行業的通訊流程和規範,例如航空、鐵路排程,就會明白這一點。
TCP 建聯,本質上需要傳遞兩條資訊:A->B 的初始 SYN 號,B->A 的初始 SYN 號,那麼理論上需要四步通訊( A->B 的初始 SYN 號,B->A 的 ACK ; B->A 的初始 SYN 號,A->B 的 ACK );只不過為了效率和效能,中間兩條訊息可以合併為一條,這便是現在的三路握手的來源。後續的所有報文的傳遞機制,依然是Send/Ack兩步 + 訊息合併。
僅有Send沒有Reply,屬於不可靠傳遞;Send有單條Reply,可以實現99%的容錯。只有傳送方才有責任確保訊息傳遞完整性,而且因為兩軍問題,任何通道不可能實現100%的有效性。所以折衷考慮,一般一條Send只需有一個Reply.
通訊技術,關心的是通訊的基本單元(單條訊息、一個獨立的資料包…),如何儘可能可靠地傳遞的流程,適用於所有領域,屬於通用的泛化的規則。例如上述Send/Reply模型。
而協議,描述的則是訊息的內容、格式,以及多條訊息之間如何互動,是和應用領域相關的。例如:沒有Reply意味著什麼,Reply可以是什麼樣的資訊格式,不同的格式代表什麼含義,不同的格式下采用什麼行為…
例如在航空通訊,塔臺向客機傳送指令的協議:
- 需要先報航班號,採用軍隊電文報數,之後是方位角、高度、行為等指令;
- 航班必須在相同頻率下先回復引數,最後附加航班號
上海管制區PVG進近塔臺:東方三兩么拐,航向187度上3000保持!
MU3217機長:航向187度上3000保持,東方三兩么拐!
指令格式可以自定義,但塔臺發出的指令,必須有Reply。
再比如在大家關心的計算機網路領域,包括但不限於以下語義及協議:
- 資訊包括SYN號,通過SYN號確保報文順序性,有效性;
- 跳躍ACK號(Reply),語義是“ACK號之前的包對方也都收到了”;
…..
TCP協議還可以定義狀態機、定義新的型別欄位、新的語義,但是任何一方主動發出的訊息,必須有Reply(ACK).
所以,目前中文網際網路的所謂“原因分析”都是皮肉之象,比如“防止包亂序及可能的重連”、“確認對方有收和發的能力”…..都不是三路握手的問題的本質。因為混淆了通訊技術和TCP協議,甚至對通訊基本原理沒有任何感知。