TCP vs UDP 誰(shuí)更可靠 TCP存在之于”互聯(lián)網(wǎng)“的意義
本文只是為了便于理解,做非常寬泛的描述,措辭不甚嚴(yán)謹(jǐn),不當(dāng)之處還望指正,感謝。 看本文章之前,建議對(duì)OSI模型已經(jīng)TCP/IP不太了解的同學(xué)們,看看我之前寫的 白話解釋 OSI模型,TLS/SSL 及 HTTPS
一切為了傳輸 UDP vs TCP
互聯(lián)網(wǎng)之所以偉大的原因之一是解決了遠(yuǎn)距離可靠傳輸信息的問題,既然要進(jìn)行“互相”傳輸數(shù)據(jù)那么肯定是有一定的規(guī)則和協(xié)議的,TCP和UDP就是兩種廣泛應(yīng)用的傳輸協(xié)議,在這里做一個(gè)簡(jiǎn)單的比較:
UDP (你把它想象成平郵信件),往往郵遞員會(huì)集中把信件放在郵局,比如一個(gè)學(xué)校的郵政,但是這種方式不可靠啊,因?yàn)檫@種平郵的信件老是容易“丟包”,也就是說(shuō),這種傳輸方式?jīng)]法確保收件人一定能收到信件。
這不行啊,所以,人們就想到了一種更為可靠的傳輸方式: TCP(你把它想象成快遞),快遞員可以直接送貨上門,即使不送貨上門,可要給你打電話,檢查你的身份證,讓你簽字等等,確保你的包裹不會(huì)被丟失。所以,這種方式更“可靠”。
TCP vs UDP 誰(shuí)更可靠
上面的例子也已經(jīng)很清楚的看到,TCP(快遞)之所以可靠,是因?yàn)橛蟹N種的“檢查”機(jī)制,當(dāng)快遞的“包裹”真正到達(dá)收件人手里的時(shí)候,這個(gè)”傳輸“過(guò)程才算完成,否則快遞小哥就“重新投遞“。那么”UDP“(平郵信件)就不管這一套,反正根據(jù)信件上的地址把”傳輸?shù)男偶?ldquo;扔在最近的郵件或者上面所寫的信箱中就完事,至于隨后包裹到底到?jīng)]到收件人手中,這個(gè)UDP不管了。
所以,到現(xiàn)在,我們知道了,TCP傳輸數(shù)據(jù)比udp更加“可靠”!
TCP存在之于”互聯(lián)網(wǎng)“的意義
我們現(xiàn)在能在互聯(lián)網(wǎng)上看文章,直播,視頻,娛樂,購(gòu)物,甚至網(wǎng)上轉(zhuǎn)賬,當(dāng)然,看直播的話,UDP協(xié)議還是不錯(cuò)滴,但是,如果涉及到金錢或者敏感數(shù)據(jù),如果都像沒有一套“可靠”的傳輸協(xié)議,誰(shuí)還敢在網(wǎng)上“轉(zhuǎn)賬”,“存儲(chǔ)信息”呢?
我們已經(jīng)知道了,TCP存在的意義之一就是: ”可靠的傳輸“ ,但同時(shí)要進(jìn)行遠(yuǎn)程通信, ”高效的傳輸“ 是必不可少的,最后,數(shù)據(jù)包在混沌險(xiǎn)惡的互聯(lián)網(wǎng)中穿梭, ”安全的傳輸“ 是必須的。
所以,小結(jié)一下,TCP存在之于”互聯(lián)網(wǎng)“的意義有三點(diǎn)(重要的事情說(shuō)三遍): - 讓數(shù)據(jù)進(jìn)行”可靠“,”高效“,”安全“的傳輸 - 讓數(shù)據(jù)進(jìn)行”可靠“,”高效“,”安全“的傳輸 - 讓數(shù)據(jù)進(jìn)行”可靠“,”高效“,”安全“的傳輸
請(qǐng)注意:這里所說(shuō)的”高效”只是相對(duì)TCP自己而言,因?yàn)檫@個(gè)”高效“會(huì)和后面我們會(huì)說(shuō)到三次握手其中的第二步合并的握手相關(guān),所以我在這里提一下,其實(shí),UDP會(huì)因?yàn)闆]有了一些檢測(cè)機(jī)制會(huì)比TCP更加高效,快速。
一定的代價(jià)
都說(shuō)”魚和熊掌不能兼得“,對(duì)于TCP來(lái)說(shuō)更是如此,既然選擇了”可靠“,”高效“和”安全“作為己任,那么就必然要想一些辦法讓自己滿足這些特征,那么TCP怎么辦的呢?
可靠
數(shù)據(jù)的可靠性意味著接收方接收到了準(zhǔn)確無(wú)誤的信息,如果中間有丟包,要有一定的機(jī)制讓發(fā)送方重新發(fā)送。TCP怎么辦的呢?它是這么辦的:
發(fā)送方通過(guò)一定方式告訴接收方,所傳輸?shù)臄?shù)據(jù)包有多大,然后分幾次,比如:數(shù)據(jù)包總共100kb,然后分10次發(fā)送,這時(shí)候接收方就知道總共有10個(gè)數(shù)據(jù)包,同時(shí)發(fā)送方會(huì)在每個(gè)數(shù)據(jù)包上標(biāo)記上號(hào)碼,然后TCP從數(shù)據(jù)包1開始接受,逐次加一,知道接收到第十個(gè)結(jié)束,只有這10個(gè)全部確認(rèn)收到了,接收方才確認(rèn)這個(gè)通信完成,所以確保了數(shù)據(jù)的可靠性。
那么問題來(lái)了,接收方怎么知道數(shù)據(jù)包共100kb,然后又怎么知道什么時(shí)候開始算是接受這個(gè)包?什么時(shí)候接受完成呢?這個(gè)時(shí)候就是第一次握手的開始,也可以說(shuō)是第一次交流的開始。
比如:張三(發(fā)送方)要發(fā)信息給李四(接收方)。
1. 張三:hi,李四,我想發(fā)送一個(gè)100kb的數(shù)據(jù)包,打算分10次發(fā)送,你那邊能接一下么?
2. 李四:好的,收到,你發(fā)吧。
3. 張三:ok, 太棒了!
4. 張三:數(shù)據(jù)包1..2..3..4.。.5..6..7..8..9..10