關於TCP流模式與UDP資料報文模式區別

2021-08-26 13:11:28 字數 991 閱讀 9985

「tcp是一種流模式的協議,udp是一種資料報模式的協議」,這句話相信大家對這句話已經耳熟能詳~但是,「流模式」與「資料報模式」在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考!

1、tcp

打個比方比喻tcp,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後用各種各樣的容器裝(杯子、礦泉水瓶、鍋碗瓢盆)接水。

上面的例子中,往水池裡倒幾次水和接幾次水是沒有必然聯絡的,也就是說你可以只倒一次水,然後分10次接完。另外,水池裡的水接多少就會少多少;往裡面倒多少水,就會增加多少水,但是不能超過水池的容量,多出的水會溢位。

結合tcp的概念,水池就好比接收快取,倒水就相當於傳送資料,接水就相當於讀取資料。好比你通過tcp連線給另一端傳送資料,你只呼叫了一次write,傳送了100個位元組,但是對方可以分10次收完,每次10個位元組;你也可以呼叫10次write,每次10個位元組,但是對方可以一次就收完。(假設資料都能到達)但是,你傳送的資料量不能大於對方的接收快取(流量控制),如果你硬是要傳送過量資料,則對方的快取滿了就會把多出的資料丟棄。

2、udp

udp和tcp不同,傳送端呼叫了幾次write,接收端必須用相同次數的read讀完。upd是基於報文的,在接收的時候,每次最多只能讀取乙個報文,報文和報文是不會合併的,如果緩衝區小於報文長度,則多出的部分會被丟棄。也就說,如果不指定msg_peek標誌,每次讀取操作將消耗乙個報文。

3、為什麼

其實,這種不同是由tcp和udp的特性決定的。tcp是面向連線的,也就是說,在連線持續的過程中,socket中收到的資料都是由同一臺主機發出的(劫持什麼的不考慮),因此,知道保證資料是有序的到達就行了,至於每次讀取多少資料自己看著辦。

而udp是無連線的協議,也就是說,只要知道接收端的ip和埠,且網路是可達的,任何主機都可以向接收端傳送資料。這時候,如果一次能讀取超過乙個報文的資料,則會亂套。比如,主機a向傳送了報文p1,主機b傳送了報文p2,如果能夠讀取超過乙個報文的資料,那麼就會將p1和p2的資料合併在了一起,這樣的資料是沒有意義的。

關於TCP流模式與UDP資料報文模式區別

tcp是一種流模式的協議,udp是一種資料報模式的協議 這句話相信大家對這句話已經耳熟能詳 但是,流模式 與 資料報模式 在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考!1 tcp 打個比方比喻tcp,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後...

關於TCP流模式與UDP資料報文模式區別

tcp是一種流模式的協議,udp是一種資料報模式的協議 這句話相信大家對這句話已經耳熟能詳 但是,流模式 與 資料報模式 在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考!1 tcp 打個比方比喻tcp,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後...

關於TCP流模式與UDP資料報文模式區別

tcp是一種流模式的協議,udp是一種資料報模式的協議 這句話相信大家對這句話已經耳熟能詳 但是,流模式 與 資料報模式 在程式設計的時候有什麼區別呢?以下是我的理解,僅供參考!1 tcp 打個比方比喻tcp,你家裡有個蓄水池,你可以裡面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裡的水放出來,然後...