<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## tcp的特點 這個大家基本都能說幾句,面試的時候候選人也肯定會告訴你這些: * 三次握手 * 四次揮手 * 可靠連接 * 丟包重傳 但是我只希望大家記住一個核心的:**tcp是可以可靠傳輸協議,它的所有特點都為這個可靠傳輸服務**。 ### [](http://jm.taobao.org/2017/06/08/20170608/#%E9%82%A3%E4%B9%88tcp%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E6%9D%A5%E4%BF%9D%E9%9A%9C%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93%E5%91%A2%EF%BC%9F "那么tcp是怎么樣來保障可靠傳輸呢?")那么tcp是怎么樣來保障可靠傳輸呢? tcp在傳輸過程中都有一個ack,接收方通過ack告訴發送方收到那些包了。這樣發送方能知道有沒有丟包,進而確定重傳。 ### [](http://jm.taobao.org/2017/06/08/20170608/#tcp%E5%BB%BA%E8%BF%9E%E6%8E%A5%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B "tcp建連接的三次握手")tcp建連接的三次握手 來看一個java代碼連接數據庫的三次握手過程 [![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/6d66dadecb72e11e3e5ab765c6c3ea2e.png)](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/6d66dadecb72e11e3e5ab765c6c3ea2e.png)image.png 三個紅框表示建立連接的三次握手: * 第一步:client 發送 syn 到server 發起握手; * 第二步:server 收到 syn后回復syn+ack給client; * 第三步:client 收到syn+ack后,回復server一個ack表示收到了server的syn+ack(此時client的48287端口的連接已經是established) 握手的核心目的是告知對方seq(綠框是client的初始seq,藍色框是server 的初始seq),對方回復ack(收到的seq+包的大小),這樣發送端就知道有沒有丟包了。 握手的次要目的是告知和協商一些信息,圖中黃框。 **這就是tcp為什么要握手建立連接,就是為了解決tcp的可靠傳輸。** ### [](http://jm.taobao.org/2017/06/08/20170608/#tcp%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B "tcp斷開連接的四次揮手")tcp斷開連接的四次揮手 再來看java連上mysql后,執行了一個SQL: select sleep(2); 然后就斷開了連接 [![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/b6f4a952cdf8ffbb8f6e9434d1432e05.png)](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/b6f4a952cdf8ffbb8f6e9434d1432e05.png)image.png 四個紅框表示斷開連接的四次揮手: * 第一步: client主動發送fin包給server * 第二步: server回復ack(對應第一步fin包的ack)給client,表示server知道client要斷開了 * 第三步: server發送fin包給client,表示server也可以斷開了 * 第四部: client回復ack給server,表示既然雙發都發送fin包表示斷開,那么就真的斷開吧 ### [](http://jm.taobao.org/2017/06/08/20170608/#%E4%B8%BA%E4%BB%80%E4%B9%88%E6%8F%A1%E6%89%8B%E4%B8%89%E6%AC%A1%E3%80%81%E6%8C%A5%E6%89%8B%E5%9B%9B%E6%AC%A1 "為什么握手三次、揮手四次")為什么握手三次、揮手四次 你再看三次握手的第二步發 syn+ack,如果拆分成兩步先發ack再發syn完全也是可以的(效率略低),這樣三次握手也變成四次握手了。 看起來揮手的時候多一次,主要是收到第一個fin包后單獨回復了一個ack包,如果能回復fin+ack那么四次揮手也就變成三次了。 來看一個案例: [![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/9db33f9304f8236b1ebcb215064bb2af.png)](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/9db33f9304f8236b1ebcb215064bb2af.png)image.png 圖中第二個紅框就是回復的fin+ack,這樣四次揮手變成三次了(如果一個包就是一次的話)。 我的理解:之所以絕大數時候我們看到的都是四次揮手,是因為收到fin后,知道對方要關閉了,然后OS通知應用層要關閉啥的,這里應用層可能需要做些準備工作,有一些延時,所以先回ack,準備好了再發fin 。 握手過程沒有這個準備過程所以可以立即發送syn+ack。 ### [](http://jm.taobao.org/2017/06/08/20170608/#ack-seq-len "ack=seq+len")ack=seq+len ack總是seq+len(包的大小),這樣發送方明確知道server收到那些東西了。 但是特例是三次握手和四次揮手,雖然len都是0,但是syn和fin都要占用一個seq號,所以這里的ack都是seq+1。 [![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/45c6d36ce8b17a5c0442e66fce002ab4.png)](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/45c6d36ce8b17a5c0442e66fce002ab4.png)image.png 看圖中左邊紅框里的len+seq就是接收方回復的ack的數字,表示這個包接收方收到了。然后下一個包的seq就是前一個包的len+seq,依次增加,一旦中間發出去的東西沒有收到ack就是丟包了,過一段時間(或者其他方式)觸發重傳,保障了tcp傳輸的可靠性。
                  <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>

                              哎呀哎呀视频在线观看