1. 程式人生 > >TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的作用

TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的作用

  • 三次握手

    第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=10001的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機,此時狀態為SYN_SENT;
    第二次握手:主機B收到請求後要確認聯機資訊,向A傳送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=20001的包,此時狀態由LISTEN變為SYN_RECV;
    第三次握手:主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連線建立成功,雙方狀態ESTABLISHED。

    完成三次握手,主機A與主機B開始傳送資料

    • 各個狀態名稱與含義

      CLOSED: 這個沒什麼好說的了,表示初始狀態。
      LISTEN: 這個也是非常容易理解的一個狀態,表示伺服器端的某個SOCKET處於監聽狀態,可以接受連線了。
      SYN_RECV: 這個狀態表示接受到了SYN報文,在正常情況下,這個狀態是伺服器端的SOCKET在建立TCP連線時的三次握手會話過程中的一箇中間狀態,很短暫,基本 上用netstat你是很難看到這種狀態的,除非你特意寫了一個客戶端測試程式,故意將三次TCP握手過程中最後一個ACK報文不予傳送。因此這種狀態 時,當收到客戶端的ACK報文後,它會進入到ESTABLISHED狀態。
      SYN_SENT: 這個狀態與SYN_RECV遙想呼應,當客戶端SOCKET執行CONNECT連線時,它首先發送SYN報文,因此也隨即它會進入到了SYN_SENT狀 態,並等待服務端的傳送三次握手中的第2個報文。SYN_SENT狀態表示客戶端已傳送SYN報文。
      ESTABLISHED:這個容易理解了,表示連線已經建立了。

    • 四次揮手

      img

      FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別 是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連線,向對方傳送了FIN報文,此時該SOCKET即 進入到FIN_WAIT_1狀態。而當對方迴應ACK報文後,則進入到FIN_WAIT_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬 上回應ACK報文,所以FIN_WAIT_1狀態一般是比較難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。
      FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連線,也即有一方要求close連線,但另外還告訴對方,我暫時還有點資料需要傳送給你,稍後再關閉連線。
      TIME_WAIT: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後即可回到CLOSED可用狀態了。如果FIN_WAIT_1狀態下,收到了對方同時帶 FIN標誌和ACK標誌的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。
      CLOSING: 這種狀態比較特殊,實際情況中應該是很少見,屬於一種比較罕見的例外狀態。正常情況下,當你傳送FIN報文後,按理來說是應該先收到(或同時收到)對方的 ACK報文,再收到對方的FIN報文。但是CLOSING狀態表示你傳送FIN報文後,並沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。什 麼情況下會出現此種情況呢?其實細想一下,也不難得出結論:那就是如果雙方几乎在同時close一個SOCKET的話,那麼就出現了雙方同時傳送FIN報 文的情況,也即會出現CLOSING狀態,表示雙方都正在關閉SOCKET連線。
      CLOSE_WAIT: 這種狀態的含義其實是表示在等待關閉。怎麼理解呢?當對方close一個SOCKET後傳送FIN報文給自己,你係統毫無疑問地會迴應一個ACK報文給對 方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以 close這個SOCKET,傳送FIN報文給對方,也即關閉連線。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連線。
      LAST_ACK: 這個狀態還是比較容易好理解的,它是被動關閉一方在傳送FIN報文後,最後等待對方的ACK報文。當收到ACK報文後,也即可以進入到CLOSED可用狀態了。

    • 為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢
      這 是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一 個報文裡來發送。但關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部發送給對方了,所以你可以未 必會馬上會關閉SOCKET,也即你可能還需要傳送一些資料給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文 和FIN報文多數情況下都是分開發送的。

    • 為什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態
      因為雖然雙方都同意關閉連線了,而且握手的4個報文也都發送完畢,按理可以直接回到CLOSED 狀態(就好比從SYN_SENT 狀態到ESTABLISH 狀態那樣),但是我們必須假想網路是不可靠的,你無法保證你(客戶端)最後傳送的ACK報文一定會被對方收到,就是說對方處於LAST_ACK 狀態下的SOCKET可能會因為超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT 狀態的作用就是用來重發可能丟失的ACK報文。

    • 關閉TCP連線一定需要4次揮手嗎?
      不一定,4次揮手關閉TCP連線是最安全的做法。但在有些時候,我們不喜歡TIME_WAIT 狀態(如當MSL數值設定過大導致伺服器端有太多TIME_WAIT狀態的TCP連線,減少這些條目數可以更快地關閉連線,為新連線釋放更多資源),這時我們可以通過設定SOCKET變數的SO_LINGER標誌來避免SOCKET在close()之後進入TIME_WAIT狀態,這時將通過傳送RST強制終止TCP連線(取代正常的TCP四次握手的終止方式)。但這並不是一個很好的主意,TIME_WAIT 對於我們來說往往是有利的。

相關推薦

TCP握手揮手過程各個狀態名稱含義 握手(轉載)

TCP的三次握手與四次揮手過程,各個狀態名稱與含義 三次握手 第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=10001的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機,此時狀態為SYN_SENT; 第二次握手:主機B收到請求後要確

TCP握手揮手過程各個狀態名稱含義TIMEWAIT作用

三次握手 第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=10001的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機,此時狀態為SYN_SENT; 第二次握手:主機B收到請求後要確認聯機資訊,向A傳送ack number=(

TCP握手揮手過程各個狀態名稱含義TIMEWAIT作用

TCP建立連線要進行3次握手,大致流程如下:SYN(同步序號,表示此報文是一個連線請求或者連線接收報文),ACK(確認位,對接收到報文的確認),FIN(表示傳送方傳送完資料,用來釋放一個連線)1)  客戶端向伺服器端傳送一個SYN J,表示客戶端向伺服器端傳送一個連線請求報文

TCP 握手揮手重傳

一、看圖說話 1、基於套接字的TCP伺服器/客戶端程式流程   2、TCP三次握手建立連線   3、TCP四次互動斷開連線 4、TCP狀態轉移圖 這張圖看不懂的話解釋在計算機網路第四版P274。解釋下MSL:最長分節生存週期,他代表了IP資

TCP協議的握手揮手

揮手 這一 nbsp 服務端 msl cnblogs chm 可靠的 不相信 TCP報文段格式圖: 序號:seq序號,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。 確認號:ack序號,只有ACK標誌位為1時,確認序號字段才有效,Ack=seq+1

TCP握手揮手

tcp握手和揮手TCP報文的頭部信息: SEQ SYN ACK FIN此時會用上ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須為1SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同

TCP握手揮手

可能 事情 斷開 fin 最長 time 重復 延時 cnblogs 三次握手 TCP連接是通過三次握手來連接的。 第一次握手 當客戶端向服務器發起連接請求時,客戶端會發送同步序列標號SYN到服務器,在這裏我們設SYN為m,等待服務器確認,這時客戶端的狀態為SYN_SENT

TCP握手揮手過程

-1 連接狀態 字段 osi listen 情況 time 連接 -a TCP包頭:其中ACK,SYN,FIN在這兩個過程中會用到,簡單介紹如下: ACK:表示是否前面的確認號字段是否有效,ACK=1,表示有效,只有當ACK=1時,前面的確認號字段才有效,TCP規

TCP握手揮手詳解

tcp三次握手和四次揮手詳解TCP(Transmission Control Protocol)網絡傳輸控制協議,是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據傳輸前建立連接的工作要經過三次握手,數據傳輸後斷開連接的工作要經過四次揮手。工作過程TCP標誌位:TCP共有6個標誌位,分別是:SYN(s

TCP協議中的握手揮手(圖解)(轉)

繼續 丟失 get 所有 如果 idt 請求報文 網絡 center 轉自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而斷開連接則需要四次握手。整個過程如下圖所示: 先來看看如

如何應對考官的TCP握手&揮手提問?

tcp三次握手&四次揮手 提問 簡述TCP三次握手:簡短回答: 首先A向B發送同步請求SYN, 然後B回復A同步請求應答SYN+ACK, 最後A回復BACK確認。 詳細回答:首先A向B發

真的懂了:TCP協議中的三次握手四次揮手(關閉連接時, 當收到對方的FIN報文時, 僅僅表示對方不在發送數據了, 但是還能接收數據, 己方也未必全部數據都發送對方了。相當於一開始還沒接上話不要緊後來接上話以後得讓人把話講完)

流程圖 .cn 服務 soc knowledge ber tcp連接 是什麽 一次 一、TCP報文格式   下面是TCP報文格式圖:              (1) 序號, Seq(Sequence number), 占32位,用來標識從TCP源端向目的端發送的字節

TCP握手揮手以及11種狀態

tcp soc 客戶端請求 3次握手 ast ket 監聽 服務 標識 TCP三次握手和四次揮手以及11種狀態 1、三次握手 置位概念:根據TCP的包頭字段,存在3個重要的標識ACK、SYN、FIN ACK:表示驗證字段 SYN:位數置1,表示建立TCP連接 FIN:位數置

使用 WireShark 分析 TCP/IP 握手揮手

vertical 客戶端 我們 訪問 out 完成 strong 開始 概覽 TCP 三次握手 示意圖 Wireshark 抓包註意事項 為了演示一個TCP三次握手建立連接的過程,我們通過 Chrome 訪問一個網頁。 已知 HTTP 協議就是建立在TCP鏈接上的

tcp、的握手揮手

.com 服務端 server 成功 四次揮手 fin CP 產生一個隨機數 再次 TCP 三次握手第一次: 客戶端將標誌位SYN置為1,隨機產生一個值seq=x,並將該數據包發送給服務端,客戶端進入等待狀態,等待服務端確認。第二次: 服務端收到數據包後確認SYN=1

TCP/IP協議握手揮手大白話解說

ini 存在 detail 系統 超時 定時 com 又能 ssi TCP/IP協議三次握手和四次揮手大白話解說 前言 昨天晚上被一位師傅問到了TCP/IP的工作機制,心裏很清楚三次握手,然而對於四次揮手卻忘了,這是大學習裏學過的,奮而翻閱書籍和網絡對之前所學的做一個溫

TCP握手揮手學習

意思 手動 斷開 arch sha etime 揮手 HA 等待 所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送4個包(兩個SYN,兩個ACK); 第一次握手:當客戶端向服務器發起連接請求時,客戶端會發送同步序

TCP握手揮手

序號 img 因此 連接重置 .com 也不會 tcp標誌位 失效 gem TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接: 位碼即tcp標誌位,有6種表示: SYN(synchronous建立連接) ACK(acknowledgeme

腦殘式網絡編程入門(一):跟著動畫來學TCP握手揮手

syn 批量 一點 sock 基於 網絡編程 中間件 分析 著名 、引言 網絡編程中TCP協議的三次握手和四次揮手的問題,在面試中是最為常見的知識點之一。很多讀者都知道“三次”和“四次”,但是如果問深入一點,他們往往都無法作出準確回答。 本篇文章嘗試使用動畫圖片的方式,來對

Python中的TCP握手揮手過程

時間 斷開連接 產生 等待 ip地址 狀態 ima ack 丟失 tcp三次握手和四次揮手 首先先介紹什麽是傳輸層: 1、三次握手 1) 三次握手的詳述 首先Client(客戶)端發送連接請求報文,Server(服務器)段接受連接後回復ACK報文,並為這