網絡編程釋疑之:TCP協議的“流”特性

與網絡開發相關的招聘時最常被問起的問題是TCP和UDP的區別,現在幾乎是道上混的都能答出來幾點“比如TCP是面向連接的,UDP是無連接的;TCP是可靠的,UDP是不可靠的;”,其中還有一點是“TCP是面向數據流的協議,UDP是面向數據報的協議”,接下來我通常就會問這麼一個問題,假設客戶端一次完全發送這麼一串字符str = "hello world!"到服務端,在服務端一次read,並且read長度的參數大於strlen(str)的情況下,用TCP和UDP協議會有什麼區別?


這個問題難倒了不少人,當然也許我的問題假設的不好或者比較極端。我期望得到的答案是:在網絡沒有出問題的情況下,用UDP協議發送的話在服務端很有可能什麼也收不到,要麼是全部收到了"hello world!"這個字符串,而不再有其他情況;用TCP協議發送的話,很有可能一次read只是得到了"hello world!"的部分字符,也許一次全部收到,甚至多次read累積緩衝區才能收到整個字符串。

其實上面這個問題在實際情況裏系統內核的套接字緩衝區充足時對於TCP而言肯定會一次完整的收到整個字符串。我主要是爲了說明TCP協議的“流”特性。舉這麼一個例子類比一下,我們要把一個空碗接滿水,我們可以一次倒入也可以分多次倒入。但是我們要把一個饅頭完整的放進另一個碗中,你的選擇只有放一次。接水的過程就如TCP數據傳輸的過程一般,放饅頭的過程就如UDP的傳輸過程一般(也可能中間你犯饞直接把饅頭吃了)。

對TCP的“流”的理解是進行TCP網絡編程的基礎,我們常說進行網絡編程中協議設計是關鍵,那麼設計協議時就必須要考慮到TCP“流”的特性去得到一條完整的協議數據。write,read方法調用,IO多路複用的使用都與“流”有着很大的關係。包括我們經常聽說的TCP分包問題,粘包問題也是“流”造成的。

發佈了120 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章