最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

跟著動畫來學習TCP三次握手和四次揮手

2020-03-11 16:28 作者:碼上輔導  | 我要投稿


TCP三次握手和四次揮手的問題在面試中是最為常見的考點之一。很多讀者都知道三次和四次,但是如果問深入一點,他們往往都無法作出準確回答。

本篇嘗試使用動畫來對這個知識點進行講解,期望讀者們可以更加簡單地地理解TCP交互的本質(zhì)。

TCP 三次握手

TCP 三次握手就好比兩個人在街上隔著50米看見了對方,但是因為霧霾等原因不能100%確認,所以要通過招手的方式相互確定對方是否認識自己。

張三首先向李四招手(syn),李四看到張三向自己招手后,向?qū)Ψ近c了點頭擠出了一個微笑(ack)。張三看到李四微笑后確認了李四成功辨認出了自己(進入estalished狀態(tài))。

但是李四還有點狐疑,向四周看了一看,有沒有可能張三是在看別人呢,他也需要確認一下。所以李四也向張三招了招手(syn),張三看到李四向自己招手后知道對方是在尋求自己的確認,于是也點了點頭擠出了微笑(ack),李四看到對方的微笑后確認了張三就是在向自己打招呼(進入established狀態(tài))。

于是兩人加快步伐,走到了一起,相互擁抱。

我們看到這個過程中一共是四個動作,張三招手--李四點頭微笑--李四招手--張三點頭微笑。其中李四連續(xù)進行了2個動作,先是點頭微笑(回復對方),然后再次招手(尋求確認),實際上可以將這兩個動作合一,招手的同時點頭和微笑(syn+ack)。于是四個動作就簡化成了三個動作,張三招手--李四點頭微笑并招手--張三點頭微笑。這就是三次握手的本質(zhì),中間的一次動作是兩個動作的合并。

我們看到有兩個中間狀態(tài),syn_sentsyn_rcvd,這兩個狀態(tài)叫著「半打開」狀態(tài),就是向?qū)Ψ秸惺至?,但是還沒來得及看到對方的點頭微笑。syn_sent是主動打開方的「半打開」狀態(tài),syn_rcvd是被動打開方的「半打開」狀態(tài)??蛻舳耸侵鲃哟蜷_方,服務器是被動打開方。

  • syn_sent: syn package has been sent

  • syn_rcvd: syn package has been received

TCP 數(shù)據(jù)傳輸

TCP 數(shù)據(jù)傳輸就是兩個人隔空對話,差了一點距離,所以需要對方反復確認聽見了自己的話。

張三喊了一句話(data),李四聽見了之后要向張三回復自己聽見了(ack)。

如果張三喊了一句,半天沒聽到李四回復,張三就認為自己的話被大風吹走了,李四沒聽見,所以需要重新喊話,這就是tcp重傳。

也有可能是李四聽到了張三的話,但是李四向張三的回復被大風吹走了,以至于張三沒聽見李四的回復。張三并不能判斷究竟是自己的話被大風吹走了還是李四的回復被大風吹走了,張三也不用管,重傳一下就是。

既然會重傳,李四就有可能同一句話聽見了兩次,這就是「去重」?!钢貍鳌购汀溉ブ亍构ぷ鞑僮飨到y(tǒng)的網(wǎng)絡內(nèi)核模塊都已經(jīng)幫我們處理好了,用戶層是不用關(guān)心的。

張三可以向李四喊話,同樣李四也可以向張三喊話,因為tcp鏈接是「雙工的」,雙方都可以主動發(fā)起數(shù)據(jù)傳輸。不過無論是哪方喊話,都需要收到對方的確認才能認為對方收到了自己的喊話。

張三可能是個高射炮,一說連說了八句話,這時候李四可以不用一句一句回復,而是連續(xù)聽了這八句話之后,一起向?qū)Ψ交貜驼f前面你說的八句話我都聽見了,這就是批量ack。但是張三也不能一次性說了太多話,李四的腦子短時間可能無法消化太多,兩人之間需要有協(xié)商好的合適的發(fā)送和接受速率,這個就是「TCP窗口大小」。

網(wǎng)絡環(huán)境的數(shù)據(jù)交互同人類之間的對話還要復雜一些,它存在數(shù)據(jù)包亂序的現(xiàn)象。同一個來源發(fā)出來的不同數(shù)據(jù)包在「網(wǎng)際路由」上可能會走過不同的路徑,最終達到同一個地方時,順序就不一樣了。操作系統(tǒng)的網(wǎng)絡內(nèi)核模塊會負責對數(shù)據(jù)包進行排序,到用戶層時順序就已經(jīng)完全一致了。

TCP 四次揮手

TCP斷開鏈接的過程和建立鏈接的過程比較類似,只不過中間的兩部并不總是會合成一步走,所以它分成了4個動作,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。

之所以中間的兩個動作沒有合并,是因為tcp存在「半關(guān)閉」狀態(tài),也就是單向關(guān)閉。張三已經(jīng)揮了手,可是人還沒有走,只是不再說話,但是耳朵還是可以繼續(xù)聽,李四呢繼續(xù)喊話。等待李四累了,也不再說話了,朝張三揮了揮手,張三傷感地微笑了一下,才徹底結(jié)束了。

上面有一個非常特殊的狀態(tài)time_wait,它是主動關(guān)閉的一方在回復完對方的揮手后進入的一個長期狀態(tài),這個狀態(tài)標準的持續(xù)時間是4分鐘,4分鐘后才會進入到closed狀態(tài),釋放套接字資源。不過在具體實現(xiàn)上這個時間是可以調(diào)整的。

它就好比主動分手方要承擔的責任,是你提出的要分手,你得付出代價。這個后果就是持續(xù)4分鐘的time_wait狀態(tài),不能釋放套接字資源(端口),就好比守寡期,這段時間內(nèi)套接字資源(端口)不得回收利用。

它的作用是重傳最后一個ack報文,確保對方可以收到。因為如果對方?jīng)]有收到ack的話,會重傳fin報文,處于time_wait狀態(tài)的套接字會立即向?qū)Ψ街匕l(fā)ack報文。

同時在這段時間內(nèi),該鏈接在對話期間于網(wǎng)際路由上產(chǎn)生的殘留報文(因為路徑過于崎嶇,數(shù)據(jù)報文走的時間太長,重傳的報文都收到了,原始報文還在路上)傳過來時,都會被立即丟棄掉。4分鐘的時間足以使得這些殘留報文徹底消逝。不然當新的端口被重復利用時,這些殘留報文可能會干擾新的鏈接。

4分鐘就是2個MSL,每個MSL是2分鐘。MSL就是maximium segment lifetime——最長報文壽命。這個時間是由官方RFC協(xié)議規(guī)定的。至于為什么是2個MSL而不是1個MSL,我還沒有看到一個非常滿意的解釋。

四次揮手也并不總是四次揮手,中間的兩個動作有時候是可以合并一起進行的,這個時候就成了三次揮手,主動關(guān)閉方就會從fin_wait_1狀態(tài)直接進入到time_wait狀態(tài),跳過了fin_wait_2狀態(tài)。

總結(jié)

TCP狀態(tài)轉(zhuǎn)換是一個非常復雜的過程,本文僅對一些簡單的基礎知識點進行了類比講解。關(guān)于TCP的更多知識還需要讀者去搜尋相關(guān)技術(shù)文章進入深入學習。如果讀者對TCP的基礎知識掌握得比較牢固,高級的知識理解起來就不會太過于吃力。

以上就先分享這些吧,大家如果有其他建議或者看法呢可以在評論區(qū)留言,有技術(shù)問題可以進行探討哦,我開發(fā)10余年了,下面是我的一個技術(shù)QQ裙,前面是二二六,中間是九八五,后面是九三五。好東西要分享,如果您也是一個愿意分享的人,那么就加入進來吧。

跟著動畫來學習TCP三次握手和四次揮手的評論 (共 條)

分享到微博請遵守國家法律
独山县| 仙游县| 四川省| 凤城市| 杭锦后旗| 辽阳市| 广西| 曲阳县| 农安县| 嘉义县| 靖宇县| 峨山| 色达县| 裕民县| 鄂州市| 河池市| 桓仁| 石嘴山市| 民乐县| 蒲城县| 赤城县| 林西县| 石柱| 衡东县| 株洲市| 罗平县| 遵义市| 东源县| 沙河市| 靖西县| 双江| 双牌县| 剑川县| 大城县| 禄丰县| 塔河县| 莫力| 老河口市| 府谷县| 井研县| 泸定县|