大部分程式設計師都聽說過 tcp/ip 網路協議, 或者都寫過 tcp socket 網路的程式, 甚至還學過 tcp 原理, 少部分看過 tcp 協議的某乙個實現版本. 不過, 真正掌握 tcp 原理及思想的人, 我覺得不多. 只有理解了 tcp 原理及實現, 並且把它背後的思想和技術活學活用到其它的領域, 那才算是真正掌握了 tcp.
tcp 協議的目的, 是在不可靠傳輸的 ip 層之上建立一套可靠傳輸的機制, 它所應用的技術, 如滑動視窗, 慢啟動, 指數退避, negal 演算法等, 都是優化目的.
活學活用 tcp, 要活學活用它的哪部分呢? 我覺得就是在不可靠傳輸之上建立可靠傳輸.事實上, 傳輸是乙個廣義的概念, 不侷限於狹義的網路傳輸, 應該理解為通訊和互動. 任何涉及到通訊和互動的東西, 都可以借鑑 tcp 的思想. 例如, 當乙個人向另乙個揮手, 另乙個也要揮手回應, 這樣的場景是一種互動, 也是一種通訊.
可靠傳輸, 最重要的是要區分出通訊的兩端, 因為可靠傳輸不能脫離了通訊的兩端, 一旦脫離了, 可靠就會變成不可靠. 例如, 一些初學者使用 tcp socket 來開發聊天程式, 但想當然的認為既然使用了可靠傳輸的 tcp 協議, 那麼整個系統就沒有必要再考慮可靠傳輸的問題了. 這是非常錯誤的, 因為 tcp 的可靠只是對於它自身來說的, 甚至是對於 socket 介面層,兩個系統就不是可靠的了, 因為 write() 傳送出去的資料, 沒有確保對方真正的 read() 到. 或者再往上一層, 到了人機互動介面的一層, 即使訊息已經傳送到了對方的聊天視窗, 但對方可能沒有看到(閱讀到), 如果認為訊息在聊天這一層層面已經可靠傳輸了, 那就錯了.
可靠傳輸的第一要素是什麼? 可靠傳輸的第一要素是確認, 第二要素是重傳, 第三要素是順序.任何乙個可靠傳輸的系統, 都必須包含這三個要素.
當然, 資料校驗也是必要的, 但我們常使用的通訊通道一般都提供了資料校驗, 所以經常會將這個要素忽略, 但要求特別高的場景, 也需要在上層做資料校驗, 所以, 我不願意把資料校驗也列為乙個必要的要素.
所以, 當你要設計乙個可靠傳輸的系統, 例如在 udp 之上實現可靠傳輸, 那麼你就要立即想到這三個要素. 當你要在任何乙個可以進行通訊的系統之上建立自己的可靠通訊系統,無論這個底層的通訊系統是以 api 的形式提供, 或者是以服務的形式, 只要它是乙個通訊系統, 那麼就可以, 而且經常需要在上面建立自定義的可靠傳輸系統, 那麼你應該立即想到可靠傳輸的三要素.
迴圈不變式的思想及其應用
迴圈不變式的思想及其應用 迴圈不變式 loop invariants 不只是一種電腦科學的思想,準確地說是一種數學思想。在數學上闡述了通過迴圈 迭代 遞迴 去計算乙個累計的目標值的正確性,屬於基礎數學的範疇,而且在計算機上也應用廣泛。初次見到這個詞是在 演算法導論 在第二章描述了這個思想和正確性,後...
TCP協議的學習(五)TCP中RST標誌及其攻擊
在tcp協議中有6個標誌位 rst表示請求重新建立連線,帶有rst標誌的報文,稱為復位報文段。tcp處理程式會在異常時刻傳送rst包 tcp中出現rst的幾種場景 1.在連線建立時 埠未開啟 向乙個不存在的埠傳送資料,目的埠沒有被程序正在監聽,而客戶端來connect。對於udp,當乙個資料報到達目...
UDP協議解析 以及和TCP協議的區別
udp user data protocol 是傳輸層的使用者資料報協議,有復用和分用以及差錯檢測的功能。1 多路復用 針對傳送主機 從不同套接字收集資料塊,並為每個資料塊封裝上首部資訊,生成報文段,傳遞到網路層 2 多路分解 針對接收主機 將報文段中的資料交付到正確的套接字 1.udp是無連線的,...