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

                ## Tcp為什么是三次握手,為什么是四次揮手 (1) 三次握手的原因 因為信道是不可靠的,可能存在延時或者丟包,而三次是滿足可靠傳輸的最小次數。如果只有兩次,假設主機A發送的第一個請求包延時,主機A在等待一段時間后又重新發送一個請求包,完成數據連接并斷開。但是這時上次發送的請求包才到達主機B,這時主機B認為又是一次連接,因此發送一個請求包給A,但A并沒有發出新的請求,因此丟失了該數據包,最后B一直等待A發送數據,浪費了資源。除此之外我認為三次握手更加安全,加大了攻擊的難度。如果是兩次,一個發送,一個應答,那么攻擊者可以采用IP欺騙,發動SYN洪水攻擊,并且服務端還都是ESTABLISHED狀態,不能進行防御,對于三次握手可以限制半連接的數量來達到一個防御的作用 (2) 四次揮手的原因 Tcp通信是一種全雙工的通信,可以進行半關閉(與半打開的區別:半打開是連接后的客戶端和服務端有一端異常關閉了),所謂半關閉是指可以之關閉從A到B的方向,而B到A的方向還可以繼續傳輸,因此客戶端和服務器端分別進行關閉 ## 三次握手四次揮手詳解 ![](https://img.kancloud.cn/ea/1d/ea1df8d1ded6c3d57571315466a09f3c_702x723.png) syn(synchronous)同時的,同步的,在http中指建立請求的第一個包 ack (acknowledgement) 確認的意思 fin(finally) 我要最后一次啦,我暫時這樣理解這個含義 建立TCP需要三次握手才能建立,而斷開連接則需要四次揮手。整個過程如下圖所示: ![](https://img.kancloud.cn/af/03/af031732f09c69ba8f06f4355255e308_554x771.png) 先來看看如何建立連接的。 ![](https://img.kancloud.cn/e3/5e/e35e796c099541f482eba5e38b13a6f0_502x410.png) 首先Client端發送連接請求報文,Server段接受連接后回復ACK報文,并為這次連接分配資源。Client端接收到ACK報文后也向Server段發生ACK報文,并分配資源,這樣TCP連接就建立了。 那如何斷開連接呢?簡單的過程如下: ![](https://img.kancloud.cn/a9/67/a967f6b5e3ad4a49603d887af55d9f51_359x498.png) 【注意】中斷連接端可以是Client端,也可以是Server端。 假設Client端發起中斷連接請求,也就是發送FIN報文。Server端接到FIN報文后,意思是說"我Client端沒有數據要發給你了",但是如果你還有數據沒有發送完成,則不必急著關閉Socket,可以繼續發送數據。所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉連接了"。Client端收到FIN報文后,"就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK后進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了! 整個過程Client端所經歷的狀態如下 ![](https://img.kancloud.cn/8e/00/8e006ecc066d1978eebd605e858cd238_518x473.png) 而Server端所經歷的過程如下 ![](https://img.kancloud.cn/6a/1e/6a1e2154c41fead72fd3646f6babe279_542x476.png) 【注意】 在TIME_WAIT狀態中,如果TCP client端最后一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴于實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之后連接正式關閉,并且所有的資源(包括端口號)都被釋放。 【問題1】為什么連接的時候是三次握手,關閉的時候卻是四次握手? 答:因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。 【問題2】為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態? 答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。 tcp 內核相關參數調優: 原文鏈接:https://blog.csdn.net/m0_37947204/article/details/80088788 原文鏈接:https://blog.csdn.net/baixiaoshi/article/details/67712853
                  <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>

                              哎呀哎呀视频在线观看