什么是「流模式」的協(xié)議,什么又是「數(shù)據(jù)報」模式的協(xié)議
今天有學員問「流模式」是什么?
這里兩個概念我們拿TCP和UDP這兩個協(xié)議來說事。
下面這個圖涉及到這兩個協(xié)議的原理,看不懂也沒關系,不影響考試做題??吹枚脑贉亓曄?。

TCP是一種流模式的協(xié)議,UDP是一種數(shù)據(jù)報模式的協(xié)議。
先來看TCP
打個比喻,我們家里有個蓄水池,你可以往里面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池里的水放出來,然后用各種各樣的容器裝(杯子、各種鍋碗瓢盆)接水。
這個例子中,往水池里倒幾次水和接幾次水是沒有必然聯(lián)系的,也就是說你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就會少多少;往里面倒多少水,就會增加多少水,但是不能超過水池的容量,多出的水會溢出。
來結(jié)合TCP的概念,水池就好比接收緩存,倒水就相當于發(fā)送數(shù)據(jù),接水就相當于讀取數(shù)據(jù)。好比你通過TCP連接給另一端發(fā)送數(shù)據(jù),你只調(diào)用了一次write,發(fā)送了100個字節(jié),但是對方可以分10次收完,每次10個字節(jié);你也可以調(diào)用10次write,每次10個字節(jié),但是對方可以一次就收完。
這里的前提假設是數(shù)據(jù)都能到達,但是你發(fā)送的數(shù)據(jù)量不能大于對方的接收緩存(流量控制),如果你硬是要發(fā)送過量數(shù)據(jù),則對方的緩存滿了就會把多出的數(shù)據(jù)丟棄。
再來看UDP
UDP和TCP不同,發(fā)送端調(diào)用了幾次write,接收端必須用相同次數(shù)的read讀完。
UDP是基于報文的,在接收的時候,每次最多只能讀取一個報文,報文和報文是不會合并的,如果緩沖區(qū)小于報文長度,則多出的部分會被丟棄。
最后來說說為什么會這樣
其實,這種不同是由TCP和UDP的特性決定的。
TCP是面向連接的,也就是說,在連接持續(xù)的過程中,socket中收到的數(shù)據(jù)都是由同一臺主機發(fā)出的(咱先不考慮劫持什么的,不然就弄復雜了),因此,保證數(shù)據(jù)是有序的到達就行了,至于每次讀取多少數(shù)據(jù)自己看著辦。
而UDP是無連接的協(xié)議,也就是說,只要知道接收端的IP和端口,并且知道網(wǎng)絡是可達的,任何主機都可以向接收端發(fā)送數(shù)據(jù)。
這時候,如果一次能讀取超過一個報文的數(shù)據(jù),則會亂套。比如,主機A發(fā)送了報文P1,主機B發(fā)送了報文P2,如果能夠讀取超過一個報文的數(shù)據(jù),那么就會將P1和P2的數(shù)據(jù)合并在了一起,這樣的數(shù)據(jù)是沒有意義的。
TCP傳輸數(shù)據(jù)的這種方式就是流模式,UDP傳輸數(shù)據(jù)的這種方式就是數(shù)據(jù)報模式。
這兩個名詞,不一定會考,但弄明白了后,在學習其他IT相關內(nèi)容的時候就少了一個盲點,會更好理解。