三次握手和四次揮手

TCP三次握手:

 三次握手和四次揮手

                                     3

第一次握手:建立連接。客戶端發送位碼為SYN=1,隨機產生一個值seq=x(隨機產生的一個序號)的數據包發送到服務器,要求建立連接,然后客戶端進入SYN_SENT(同步已發送)狀態,等待服務器的確認。

第二次握手:服務器收到請求要確認連接信息,發送SYN=1,ACK=1,ack=x+1(確認號,意思就是你發的x包我收到了,希望下次你發x+1的包),seq=y(隨機產生),的數據包發送給客戶端確認連接請求,服務器進入SYN_RCVD(同步收到)狀態。(ACK表示標記位,ack表示確認號)

第三次握手:客戶端收到后發送ACK=1(確認收到了服務器發的請求),seq=x+1(上次發送的是x包,這次發送x+1的包),ack=y+1(確認收到y給服務器,客戶端和服務器都進入ESTABLISHED(已建立連接)狀態,完成三次握手。

(之所以會是三次握手,是出于安全考慮。雖然三次握手也有隱患,相對來說較合適)

TCP四次揮手:(以客戶端揮手為例)

 三次握手和四次揮手

                                          圖2

第一次揮手:客戶端發送FIN=1(發送關閉連接請求),seq=u去關閉客戶端到服務器的數據傳送,客戶端進入FIN_WAIT_1(終止等待1)狀態。

第二次揮手:服務器收到FIN后,發送ACK=1(關閉連接請求收到了)給客戶機,seq=v(隨機生成的號),ack=u+1(確認客戶端發送的u收到了,希望下次發u+1),服務器進入CLOSE_WAIT(關閉等待)狀態。

第三次揮手:服務器發送FIN=1,ACK=1,seq=w,ack=u+1(確認收到了u+1)用來關閉服務器到客戶端的數據傳送,服務器進入LAST_ACK(最后確認)狀態。

第四次揮手:客戶端收到FIN后,進入TIME_WAIT(時間等待)狀態,接著發送ACK=1,seq=u+1(確認收到u+1),ack=w+1(收到w,希望下次發w+1)給服務器,服務器進入CLOSED狀態,完成四次揮手。

狀態:

CLOSED 沒有任何連接狀態

LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求

SYN-SENT 在發送連接請求后,等待對方確認

SYN-RECEIVED 在收到和發送一個連接請求后,等待對方確認

ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態

FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認

FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失

CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,并已確認

LAST-ACK 被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失

LOSING 雙方同時嘗試關閉傳輸連接,等待對方確認

注:
   1.為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?
    這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之后,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這里的ACK報文和FIN報文多數情況下都是分開發送的。
   2.為什么TIME_WAIT狀態還需要等2MSL后才能返回到CLOSED狀態?
    這是因為雖然雙方都同意關閉連接了,而且握手的4個報文也都協調和發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SEND狀態到ESTABLISH狀態那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發送的ACK報文會一定被對方收到,因此對方處于LAST_ACK狀態下的SOCKET可能會因為超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文。

 


原創文章,作者:吼吼哈嘿,如若轉載,請注明出處:http://www.www58058.com/85993

(0)
吼吼哈嘿吼吼哈嘿
上一篇 2017-09-02
下一篇 2017-09-02

相關推薦

  • 第六周 N21 總有刁民想害朕

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;    %s/\(^[[:space:]]\)/#\1/ 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.…

    Linux干貨 2016-08-08
  • Linux三劍客之sed

    sed:全稱stream EDit 行文本編輯器 作用:是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在模式空間,接著用 sed命令處理緩沖區中的內容,處理完成后,把模式空間的內容輸出到標準輸出。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。 Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操…

    Linux干貨 2016-08-12
  • Linux文件系統管理

    馬哥教育網絡班23期+第3周課程練習 Linux文件系統管理 由于第三周所學的只是比較零碎,知識量比較大,這篇博客主要講述的是一些習題,包括怎樣完成的練習的思路和截圖等等。首先我們看第一個題目 1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。    [root@localhost]/media/P…

    Linux干貨 2016-09-23
  • 如何理解云計算中IaaS、PaaS和SaaS?很簡單,就像吃貨想吃披薩了…

                                                      &nbsp…

    2015-04-17
  • lvs-nat集群

    lvs-nat算法 nat模型樣式 vs服務器:公網地址 172.18.250.253 私網地址 192.168.57.129 (DIP) 各私網服務器網關指向服務器DIP 各私網服務器做集群:web (telnet,ssh) 私網服務器使用httpd實現 rs私網服務器1 centos7 ip:192.168.57.132 rs私網服務器2 centos6…

    Linux干貨 2017-05-15
  • 小白易患錯誤之絕對路徑和相對路徑的操作錯誤

    小白易患錯誤之絕對路徑和相對路徑的操作錯誤 作為一個不安穩的小白,一天都在那路亂折騰,恰巧,老師課程題目中有一題將/etc/skel 這個目錄的文件除了..和. 復制到/home/USRNAEM 的家目錄下。然后自以為是不按照老師的方法,自己折騰用了這樣一條命令 [root@local skel]# ls -A .bash_lo…

    Linux干貨 2016-08-05
欧美性久久久久