網絡編程釋疑之: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的傳輸過程通常(也可能中間你犯饞直接把饅頭吃了)。ide

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

相關文章
相關標籤/搜索