TCP 三次握手的意义
概述
在網(wǎng)絡(luò)的傳輸層協(xié)議中, 存在著兩大悍將:?TCP?和?UDP?. 從前, 我傻傻的以為自己對他們雖談不上精通, 但還是知道的, 但是, 我錯了, 我被自己問住了, 我傻了. 啥也不是.
UDP
(這里為了介紹簡單, 就不提數(shù)據(jù)在傳輸過程中的失真(糾錯碼)等情況了. 簡單介紹一下,?TCP才是今天的主角)
UDP 就是, 我把數(shù)據(jù)發(fā)給你了, 我不管你有沒有收到, 反正我發(fā)出去了, 任性. 就比如我要給我的女神表白, 但是我又不好意思, 所以我托我的好兄弟馬六幫我給女神帶句話, 但是這個馬六也臉皮薄, 他又找周三轉(zhuǎn)達(dá), 就這樣雖然歷經(jīng)波折, 但最后還是順利的將話帶到了女神那里. 在這個過程中我做了什么? 我只是將消息送出去了, 僅此而已. 最后我滿心歡喜的等待著女神的回復(fù), 可能換回一句: 我們還是做朋友吧. 但還有一種可能, 那就是最終根本就沒有送到女神那里, 中間轉(zhuǎn)到周三的時候, 他因?yàn)樽约旱氖虑? 把這事給忘了, 可憐的我還苦苦的等...
UDP?雖然省事, 高效, 但是卻不可靠. 因?yàn)槲覂H僅是發(fā)出去了, 但是我不確定你有沒有收到. 不可靠有什么問題么? 上面就是個例子. 再比如, 咱倆聊天, 我給你發(fā)了一段話:?123456, 結(jié)果中間4丟了, 你收到的信息是:?12356. 這種還好, 如果快過年了, 我發(fā)給你這樣一段話:?明天把你的豬宰了吧, 哎, 中間?的豬?丟了, 那估計(jì)免不了一番腥風(fēng)血雨.
那如此不可靠的UDP協(xié)議, 有什么用呢? 還真有, 雖然不可靠, 但是他快啊. 在一些對數(shù)據(jù)的可靠性要求不高, 但是實(shí)時性很強(qiáng)的地方就有了用武之地, 比如視頻電話(我也不知道底層是不是 UDP, 舉個例子), 打視頻電話的時候, 視頻要保證其連續(xù)性, 而且中間如果丟了一幀也不會有什么影響.
但是在大多數(shù)場景下, 數(shù)據(jù)的可靠性還是要有保證的, 你從網(wǎng)上下載一個程序的安裝包, 如果中間丟了一個字節(jié)的數(shù)據(jù), 那可能就導(dǎo)致一個200mb 的文件廢了, 根本不能執(zhí)行.
TCP
為了保證傳輸數(shù)據(jù)的可靠性,?TCP?誕生了. 還記得剛才我給女神表白的時候, 問題出在哪里嗎? 沒錯, 就是因?yàn)槲业阶詈罂嗫嗟却? 結(jié)果她悲劇的沒有收到我的心意, 傷心. 怎么辦呢? 這次我想通了, 求人不如求己, 我要鼓起勇氣, 我到她面前當(dāng)面告訴她, 即使我多了一個朋友(沒辦法, 咱就喜歡交朋友), 也好過她收不到消息的好. 這下可靠了, 我確信她收到了.
區(qū)別在哪里? 不是我到他面前, 而是不管她是否愿意, 至少給爺們回句話吧. 沒錯, 就是回句話.
如果有這樣一種機(jī)制, 每次我發(fā)出去的數(shù)據(jù), 如果對方收到了, 就給我回句話, 告訴我收到了, 那消息就變得可靠了. 我發(fā)出去的所有消息, 都可以確信對方已經(jīng)收到了.
- 如果數(shù)據(jù)中間丟了, 對方?jīng)]有收到怎么辦? 沒有等到對方回復(fù), 我就重新發(fā)一遍就好啦.
- 如果對方的回復(fù)丟了, 沒有收到回復(fù)怎么辦? 處理方式同上, 對方收到重復(fù)數(shù)據(jù), 把重復(fù)的數(shù)據(jù)包丟棄再回復(fù)一條就好啦.
一個來自靈魂的提問, 現(xiàn)在的數(shù)據(jù)發(fā)送可靠嗎? 我覺得是不可靠的, 現(xiàn)在僅僅能夠保證一個數(shù)據(jù)包, 我百分百的確信對方已經(jīng)收到了. 那什么樣的連接才是可靠的呢?
我要發(fā)你100個數(shù)據(jù)包, 那這100個數(shù)據(jù)包你每一個都要能夠收到, 并且要按照順序?qū)⑺麄冊倨囱b起來, 我覺得這樣的連接才能稱得上可靠. 這里面涉及到了兩個概念,?確保收到?和?順序. 確保收到我們已經(jīng)做到了, 如何保證包的順序呢? 我把要發(fā)的數(shù)據(jù)排排隊(duì), 一個一個發(fā)就行了? 天真, 如果有包1在網(wǎng)絡(luò)中某個地方喝了杯茶, 睡了一覺, 結(jié)果接收方先收到了包2后收到包1, 順序就亂了. 保證順序的方式其實(shí)很簡單, 在每一個包上, 都加上一個序號, 接收方按照序號從小到大把收到的包組裝起來就好了.
經(jīng)過改造, 現(xiàn)在已經(jīng)基本能夠保證傳輸?shù)目煽啃粤? 到這里, 有沒有發(fā)現(xiàn)什么? 現(xiàn)在和TCP的區(qū)別就是少了三次握手和四次揮手(不僅僅是). 那三次握手的意義何在?
三次握手意義何在
今天在接收了身邊大神的一些思想之后, 我還是沒有太明白. 不過現(xiàn)在, 我貌似明白了些什么. 要想知道三次握手有什么用, 就需要知道三次握手都做了什么事情.
1. 確保對方能夠正常接收數(shù)據(jù), 測試連接
還是上面的例子, 我去女神面前表白, 但不湊巧, 女神正在午休, 我站著旁邊傻傻的表白, 還是沒有用. 所以, 在開始之前, 我要先確保女神能夠聽到我說的話, 我得把她叫醒, 莊重的告訴她. 而這, 就是握手的意義.
2.建立系統(tǒng)開銷
在發(fā)送 UDP 包的時候, 因?yàn)槠洳豢煽啃? 所以基本不會用其發(fā)送很大的文件, 因?yàn)閷⑤^大的數(shù)據(jù)拆分后發(fā)出, 中間丟了幾個數(shù)據(jù)包就尷尬了. 而且 UDP 也不能夠保證包的順序, 還是一樣的原因. 但是 TCP 就不一樣了, 它是可靠的啊, 你可以將多個數(shù)據(jù)包分開發(fā)給我, 到我這里, 我再把他們按順序排列好就行了. 而這個按順序排列的操作就需要專門開辟內(nèi)存空間來保存收到的數(shù)據(jù)包了, 當(dāng)握手成功后, 我就會為你留下用于保存數(shù)據(jù)包的內(nèi)存空間及其他一些系統(tǒng)資源.
而如果沒有三次握手呢? 客戶端發(fā)送的數(shù)據(jù)包, 可能因?yàn)槟承┰?比如路不好走), 在網(wǎng)絡(luò)中待的久了一些, 客戶端因?yàn)闆]有收到回復(fù), 已經(jīng)放棄連接了, 但這時候, 服務(wù)器收到了這個數(shù)據(jù)包, 開辟系統(tǒng)資源, 返回確認(rèn)包, 然后就沒有然后了. 客戶端已經(jīng)放棄了, 根本不搭理你的回復(fù). 系統(tǒng)的相關(guān)資源就白白浪費(fèi)了.
3. 測試超時時間
上面說了, 當(dāng)我長時間沒有收到你的回復(fù)時, 我就認(rèn)為你沒有收到我發(fā)出的數(shù)據(jù), 那我就需要重新發(fā)送了. 那這個長時間是多久呢? 可以在握手期間進(jìn)行測試, 測量請求包的往返時間,并依此計(jì)算重傳的超時時間.
4.安全性
這個確實(shí)是我沒有想到的. 因?yàn)?TCP 會將數(shù)據(jù)拆分后發(fā)送, 為了保證數(shù)據(jù)的有序, 就要給每個數(shù)據(jù)包進(jìn)行編號. 然后接收方根據(jù)編號的順序?qū)κ盏降陌M(jìn)行重組, 保證了數(shù)據(jù)的有序.
如果只是簡單的123456, 那大家都知道了, 我黑客小黑, 也給你發(fā)一個編號為1的數(shù)據(jù)包, 不就把你真實(shí)的數(shù)據(jù)包給偷偷替換了么? 為了防止序列號被猜到, 就要讓每次發(fā)送數(shù)據(jù)的序列號不同, 在進(jìn)行握手的時候會對數(shù)據(jù)的初始序列號進(jìn)行交換. 客戶端第一次發(fā)送握手信息的時候, 會連著自己的初始序列號一起發(fā)過去, 服務(wù)器收到之后, 返回第二個握手信息的時候, 除了返回握手確認(rèn), 也會連著自己的初始序列號一起發(fā)回來. 這在一定程度上保證了數(shù)據(jù)的安全傳輸. 當(dāng)然這種防護(hù)措施很弱.
這個隨機(jī)的序列號其實(shí)還有另外一個作用, 我覺得這才是它最主要的作用. 如果我們上一次連接的其中一個數(shù)據(jù)包3, 在網(wǎng)絡(luò)中傲游了一會, 連接已經(jīng)斷開了, 我們又開始了新的一次數(shù)據(jù)連接, 這個時候我收到了數(shù)據(jù)包3, 就會導(dǎo)致生成了錯誤的數(shù)據(jù)序列, 而隨機(jī)序列號則避免了這個問題,
四次揮手的意義
三次握手確實(shí)是有些作用, 那四次揮手有什么用呢?
1.釋放系統(tǒng)資源
在三次握手的時候, 為了接收數(shù)據(jù)并進(jìn)行序列重組, 開辟了一些系統(tǒng)資源, 當(dāng)數(shù)據(jù)發(fā)送完了, 就不用一直占著了, 早些釋放, 留給別人.
額, 應(yīng)該還有其他作用吧...
總結(jié)
綜上, 你說如果沒有握手和揮手的過程, 能不能實(shí)現(xiàn)一個可靠的連接呢? 可以, 只不過會有問題. 個人簡單將握手的作用總結(jié)為以下幾點(diǎn):
總結(jié)
以上是生活随笔為你收集整理的TCP 三次握手的意义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 低功耗广域网:关键特性
- 下一篇: 对口升学考试计算机应用知识点,湖南省对口