<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## **TCP 三次握手** TCP 三次握手就好比兩個人在街上隔著50米看見了對方,但是因為霧霾等原因不能100%確認,所以要通過招手的方式相互確定對方是否認識自己。 ![](https://img.kancloud.cn/31/fe/31fe9aabd8a4f8445c82a7230f22df75_720x900.gif) 張三首先向李四招手(**syn**),李四看到張三向自己招手后,向對方點了點頭擠出了一個微笑(**ack**)。張三看到李四微笑后確認了李四成功辨認出了自己(進入**estalished**狀態)。 但是李四還有點狐疑,向四周看了一看,有沒有可能張三是在看別人呢,他也需要確認一下。所以李四也向張三招了招手(**syn**),張三看到李四向自己招手后知道對方是在尋求自己的確認,于是也點了點頭擠出了微笑(**ack**),李四看到對方的微笑后確認了張三就是在向自己打招呼(進入**established**狀態)。 于是兩人加快步伐,走到了一起,相互擁抱。 我們看到這個過程中一共是四個動作,張三招手--李四點頭微笑--李四招手--張三點頭微笑。其中李四連續進行了2個動作,先是點頭微笑(回復對方),然后再次招手(尋求確認),實際上可以將這兩個動作合一,招手的同時點頭和微笑(**syn+ack**)。于是四個動作就簡化成了三個動作,張三招手--李四點頭微笑并招手--張三點頭微笑。這就是三次握手的本質,中間的一次動作是兩個動作的合并。 我們看到有兩個中間狀態,**syn\_sent**和**syn\_rcvd**,這兩個狀態叫著「半打開」狀態,就是向對方招手了,但是還沒來得及看到對方的點頭微笑。**syn\_sent**是主動打開方的「半打開」狀態,**syn\_rcvd**是被動打開方的「半打開」狀態。客戶端是主動打開方,服務器是被動打開方。 * syn\_sent: syn package has been sent * syn\_rcvd: syn package has been received ## **TCP 數據傳輸** TCP 數據傳輸就是兩個人隔空對話,差了一點距離,所以需要對方反復確認聽見了自己的話。 張三喊了一句話(data),李四聽見了之后要向張三回復自己聽見了(ack)。 如果張三喊了一句,半天沒聽到李四回復,張三就認為自己的話被大風吹走了,李四沒聽見,所以需要重新喊話,這就是tcp重傳。 也有可能是李四聽到了張三的話,但是李四向張三的回復被大風吹走了,以至于張三沒聽見李四的回復。張三并不能判斷究竟是自己的話被大風吹走了還是李四的回復被大風吹走了,張三也不用管,重傳一下就是。 既然會重傳,李四就有可能同一句話聽見了兩次,這就是「去重」。「重傳」和「去重」工作操作系統的網絡內核模塊都已經幫我們處理好了,用戶層是不用關心的。 ![](https://pic3.zhimg.com/v2-0b35d62c2adeb9dca40a0f67d09e8686_b.jpg) 張三可以向李四喊話,同樣李四也可以向張三喊話,因為tcp鏈接是「雙工的」,雙方都可以主動發起數據傳輸。不過無論是哪方喊話,都需要收到對方的確認才能認為對方收到了自己的喊話。 張三可能是個高射炮,一說連說了八句話,這時候李四可以不用一句一句回復,而是連續聽了這八句話之后,一起向對方回復說前面你說的八句話我都聽見了,這就是批量ack。但是張三也不能一次性說了太多話,李四的腦子短時間可能無法消化太多,兩人之間需要有協商好的合適的發送和接受速率,這個就是「TCP窗口大小」。 網絡環境的數據交互同人類之間的對話還要復雜一些,它存在數據包亂序的現象。同一個來源發出來的不同數據包在「網際路由」上可能會走過不同的路徑,最終達到同一個地方時,順序就不一樣了。操作系統的網絡內核模塊會負責對數據包進行排序,到用戶層時順序就已經完全一致了。 ## **TCP 四次揮手** TCP斷開鏈接的過程和建立鏈接的過程比較類似,只不過中間的兩部并不總是會合成一步走,所以它分成了4個動作,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。 之所以中間的兩個動作沒有合并,是因為tcp存在「半關閉」狀態,也就是單向關閉。張三已經揮了手,可是人還沒有走,只是不再說話,但是耳朵還是可以繼續聽,李四呢繼續喊話。等待李四累了,也不再說話了,超張三揮了揮手,張三傷感地微笑了一下,才徹底結束了。 ![](https://pic4.zhimg.com/v2-c8762ecc2af9d9640a6185d36e6db903_b.jpg) 上面有一個非常特殊的狀態`time_wait`,它是主動關閉的一方在回復完對方的揮手后進入的一個長期狀態,這個狀態標準的持續時間是4分鐘,4分鐘后才會進入到closed狀態,釋放套接字資源。不過在具體實現上這個時間是可以調整的。 它就好比主動分手方要承擔的責任,是你提出的要分手,你得付出代價。這個后果就是持續4分鐘的`time_wait`狀態,不能釋放套接字資源(端口),就好比守寡期,這段時間內套接字資源(端口)不得回收利用。 它的作用是重傳最后一個ack報文,確保對方可以收到。因為如果對方沒有收到ack的話,會重傳fin報文,處于time\_wait狀態的套接字會立即向對方重發ack報文。 同時在這段時間內,該鏈接在對話期間于網際路由上產生的殘留報文(因為路徑過于崎嶇,數據報文走的時間太長,重傳的報文都收到了,原始報文還在路上)傳過來時,都會被立即丟棄掉。4分鐘的時間足以使得這些殘留報文徹底消逝。不然當新的端口被重復利用時,這些殘留報文可能會干擾新的鏈接。 4分鐘就是2個MSL,每個MSL是2分鐘。MSL就是`maximium segment lifetime`——最長報文壽命。這個時間是由官方RFC協議規定的。至于為什么是2個MSL而不是1個MSL,我還沒有看到一個非常滿意的解釋。 四次揮手也并不總是四次揮手,中間的兩個動作有時候是可以合并一起進行的,這個時候就成了三次揮手,主動關閉方就會從`fin_wait_1`狀態直接進入到`time_wait`狀態,跳過了`fin_wait_2`狀態。 ## **總結**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看