1. 程式人生 > >關於三次握手與四次揮手你要知道這些

關於三次握手與四次揮手你要知道這些

TCP的整個連線過程

如果沒有基礎的話,直接看這張圖或者網路上各種文字描述,十分生澀,所以先看懂接下來的握手揮手的圖,理解之後,再看這個有限狀態機就感覺原來如此簡單。

三次握手

握手過程

第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=x的資料包到伺服器,客戶端進入SYN_SEND狀態,等待伺服器的確認;主機B由SYN=1知道A要求建立連線。

第二次握手:主機B收到請求後要確認連線資訊,向A傳送ack number(主機A的seq+1)、syn=1、ack=1,隨機產生seq=y的包,此時伺服器進入SYN_RECV狀態。

第三次握手:主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number(主機B的seq+1)、ack=1,主機B收到後確認seq值與ack=1則連線建立成功。客戶端和伺服器端都進入ESTABLISHED狀態。

三次握手的必要性

  1. 第一次握手:客戶端傳送網路包,服務端收到了。這樣服務端就能得出結論:客戶端的傳送能力、服務端的接收能力是正常的。
  2. 第二次握手:服務端發包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、傳送能力,客戶端的接收、傳送能力是正常的。不過此時伺服器並不能確認客戶端的接收能力是否正常。
  3. 第三次握手:客戶端發包,服務端收到了。這樣服務端就能得出結論:客戶端的接收能力,伺服器自己的傳送能力也正常。

至此,客戶端和服務端可以確定雙方的接收和傳送能力均正常。

第三次握手的必要性

這主要是為了防止已失效的連線請求報文段突然又傳送到了伺服器端,從而減少服務端的開銷。
如果只有兩次握手就建立連線會出現這種情況:客戶端發出的連線請求報文段在某些網路節點長時間滯留了,以致延誤到連線釋放以後的某個時間才能到達服務端。本來這是一個早已失效的報文段,但服務端收到此失效的連線請求報文段後,就誤認為客戶端又發出了一次新的連線請求。於是向客戶端發出確認報文段,同意建立連線。由於現在客戶端並沒有發出建立連線的請求,因此不會處理服務端的確認,也不會向服務端傳送資料。但服務端卻以為新的連線已經建立了,並一直等待客戶端發來資料。 服務端會因此浪費很多了。

如果第三次握手丟失了,客戶端服務端會如何處理?

服務端:
該TCP連線的狀態為SYN_RECV,並且會根據TCP的超時重傳機制,會等待3秒、6秒、12秒後重新發送SYN+ACK包,以便Client重新發送ACK包。而Server重發SYN+ACK包的次數,可以通過設定/proc/sys/net/ipv4/tcp_synack_retries修改,預設值為5。如果重發指定次數之後,仍然未收到客戶端的ACK應答,那麼一段時間後,服務端自動關閉這個連線。
客戶端:
客戶端在接收到SYN+ACK包,它的TCP連線狀態就為ESTABLISHED(已連線),表示該連線已經建立。那麼如果第三次握手中的ACK包丟失的情況下,客戶端向服務端傳送資料,服務端將以RST包(reset重置)響應,才能感知到服務端的錯誤。

什麼是syn flood攻擊

syn flood是一種經典的ddos攻擊手段,這裡面用到了TCP三次握手存在的漏洞。當服務端接收到SYN後進入SYN-RECV狀態,此時的連線稱為半連線,同時會被服務端寫入一個半連線佇列。如果攻擊者在短時間內不斷的向服務端傳送大量的SYN包而不響應,那麼伺服器的半連線佇列很快會被寫滿,從而導致無法工作。 實現syn flood 的手段,可以通過偽造源IP的方式,這樣伺服器的響應就永遠到達不了客戶端(握手無法完成);當然,通過設定客戶端防火牆規則也可以達到同樣的目的。對syn flood實現攔截是比較困難的,可以通過啟用 syn_cookies 的方式實現緩解,但這通常不是最佳方案。最好的辦法是通過專業的防火牆來解決,基本上所有的雲端計算大 都具備這個能力。

四次揮手

揮手過程

第一次揮手:主機A(可以是客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機B傳送一個FIN報文段;此時,主機A進入FIN_WAIT_1狀態;這表示主機A沒有資料要傳送給主機B了。
第二次揮手:主機B收到了主機A傳送的FIN報文段,向主機A回一個ACK報文段,Acknowledgment Number為Sequence Number加1,主機A進入FIN_WAIT_2狀態;主機B告訴主機A,我也沒有資料要傳送了,可以進行關閉連線了。
第三次揮手:主機B向主機A傳送FIN報文段,請求關閉連線,同時主機B進入CLOSE_WAIT狀態。
第四次揮手:主機A收到主機B傳送的FIN報文段,向主機B傳送ACK報文段,然後主機A進入TIME_WAIT狀態;主機B收到主機A的ACK報文段以後,就關閉連線;此時,主機A等待2MSL後依然沒有收到回覆,則證明主機B已正常關閉,那好,主機A也可以關閉連線了。

主機B傳送了FIN-ACK之後,會立即啟動超時重傳計時器
主機A在傳送最後一個ACK之後,會立即啟動時間等待計時器

揮手為什麼需要四次?

因為當服務端收到客戶端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當服務端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴客戶端,"你發的FIN報文我收到了"。只有等到我服務端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四次揮手。

RST是什麼,為什麼會出現

RST 是一個特殊的標記,用來表示當前應該立即終止連線。以下這些情況都會產生RST:

  • 向一個未被監聽的埠傳送資料
  • 對方已經呼叫 close 關閉連線
  • 存在一些資料未處理(接收緩衝區),請求關閉連線時,會發送RST強制關閉
  • 某些請求發生了超時

為什麼伺服器會有大量closewait

半關閉的狀態下的伺服器連線會處於closewait狀態,直到伺服器傳送了FIN。 那麼在應用層則是呼叫socket.close()會執行FIN的傳送,如果伺服器出現大量CLOSE_WAIT狀態的連線,那麼有可能的原因:

  • 伺服器壓力過大,根本來不及呼叫close
  • 存在連線洩露問題(Bug),伺服器未及時關閉連線

四次揮手釋放連線時,等待2MSL的意義

為了保證客戶端傳送的最後一個ACK報文段能夠到達伺服器。因為這個ACK有可能丟失,從而導致處在LAST-ACK狀態的伺服器收不到對FIN-ACK的確認報文。伺服器會超時重傳這個FIN-ACK,接著客戶端再重傳一次確認,重新啟動時間等待計時器。最後客戶端和伺服器都能正常的關閉。假設客戶端不等待2MSL,而是在傳送完ACK之後直接釋放關閉,一但這個ACK丟失的話,伺服器就無法正常的進入關閉連線狀態。

MSL是Maximum Segment Lifetime的英文縮寫,可譯為“最長報文段壽命”,它是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。我們都知道IP頭部中有個TTL欄位,TTL是time to live的縮寫,可譯為“生存時間”,這個生存時間是由源主機設定初始值代表一個IP資料包可以經過的最大路由數,每經過一個路由器,它的值就減1,當此值為0則資料報被丟棄,同時傳送ICMP報文通知源主機。RFC793中規定MSL為2分鐘,但這完全是從工程上來考慮,對於現在的網路,常用值30秒或1分鐘。因此TCP允許不同的實現可根據具體情況使用更小的MSL值。

最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。如果想獲得更多的學習資源或者想和更多的是技術愛好者一起交流,可以關注我的公眾號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入前後端技術交流群和程式設計師副業群。同時也可以加入程式設計師副業群Q群:735764906 一起交流。

相關推薦

關於握手揮手知道這些

TCP的整個連線過程 如果沒有基礎的話,直接看這張圖或者網路上各種文字描述,十分生澀,所以先看懂接下來的握手揮手的圖,理解之後,再看這個有限狀態機就感覺原來如此簡單。 三次握手 握手過程 第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=x的資料包到伺服器,客戶端進入SYN_S

tcp協議報文和握手揮手

tcp報文 三次握手與四次揮手 tcp11種狀態tcp協議:tcp是面向連接、可靠的進程到進程之間的協議。tcp提供全雙工服務:即:數據可在同一時間雙向傳輸。tcp報文段首部格式:各字段含義:源端口號:16位字段,為發送端進程對應的端口號目標端口:16位字段,為接收端進程對應的端口號,接收方接收到數據

TCP協議握手揮手通俗解析

再次 方式 32位 sent 時間 應用層 系統 socket編程 檢測 TCP/IP協議三次握手與四次握手流程解析 一、TCP報文格式 TCP/IP協議的詳細信息參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖: 圖1 TCP報文格式 上圖中

TCP握手揮手詳解

socket 抓包 掉線 syn 還要 就是 創建 iss closed TCP三次握手與四次揮手詳解 @(TCP/IP) [TOC] 1.TCP報文格式 TCP(Transmission Control Protocol) 傳輸控制協議。TCP是主機對主機層的傳輸控制協議

理解TCP/IP握手揮手的正確姿勢

ron eight AI 主動 ddos攻擊 ID set 什麽 方案 背景 和女朋友異地戀一年多,為了保持感情我提議每天晚上視頻聊天一次。 從好上開始,到現在,一年多也算堅持下來了。 問題 有時候聊天的過程中,我的網絡或者她的網絡可能會不好,視頻就會卡住,聽不到對方的聲音

以女朋友為例講解 TCP/IP 握手揮手

seq 關於 轉載 向上 情況 日常 socket 標示 但是 背景 和女朋友異地戀一年多,為了保持感情我提議每天晚上視頻聊天一次。 從好上開始,到現在,一年多也算堅持下來了。 問題 有時候聊天的過程中,我的網絡或者她的網絡可能會不好,視頻就會卡住,聽不到對方的聲音

TCP握手揮手過程

結束 傳輸 tro img 連接 回復 重新 選擇 主動斷開 TCP連接的建立(三次握手) 首先,客戶端與服務器均處於未連接狀態,並且是客戶端主動向服務器請求建立連接:   客戶端將報文段中的SYN=1(同步位),並選擇一個seq=x,(即該請求報文的序號為x) 將這

握手揮手

傳輸 重復 其中 客戶 狀態 首部 信息 客戶端 打開 傳輸層有兩個協議:TCP協議和UDP協議,兩者主要的區別是TCP是提供可靠服務,而UDP是提供不可靠服務。UDP沒有TCP為了保證傳輸而進行的三次握手和四次揮手,所以UDP在效率上高於TCP,目前還應用在一些語音、視頻

TCP的握手揮手

number 雙工 地址 ffffff ber 通信 control ext des TCP的三次握手與四次揮手 一、TCP(Transmission Control Protocol 傳輸控制協議) TCP是面向對連接,可靠的進程到進程通信的協議

簡單理解TCP的握手揮手

lar syn sdn -a art seq 而是 time_wait 揮手 seq(消息序號):第一次請求時,隨機生成一個值,而後每次+1 ack(確認序號):接收上一條信息的seq+1 SYN:發起一個新連接的請求時,為1 FIN:釋放一個連接的請求時,為1 ACK:與

面試題之------握手揮手過程

客戶端 服務 但是 到來 重新 因此 同步 等待 上一個 首先,客戶端與服務器均處於未連接狀態,並且是客戶端主動向服務器請求建立連接: 客戶端將報文段中的SYN=1,並選擇一個seq=x,(即該請求報文的序號為x) 將這個報文發送到服務器。此時,客戶端進入同步已發送狀態

TCP協議握手揮手

文章目錄 TCP報文格式 三次握手 四次揮手 注 TCP報文格式 TCP/IP協議的詳細資訊參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖: 上圖中有幾個欄位需要重點介紹下: (1

TCP握手揮手複習

TCP,提供面向連線的服務,在傳送資料之前必須先建立連線,資料傳送完成後要釋放連線。因此TCP是一種可靠的的運輸服務,但是正因為這樣,不可避免的增加了許多的開銷,比如確認,流量控制等 TCP連線的建立(三次握手)   三次握手(我要和你建立連結,你真的要和我建立連結麼,我

詳解TCP握手揮手

一、TCP三次握手和socket詳解 1.TCP連線 第一次:cli傳送SYN包(SYN = j)到ser,並且進入SYN_SEND狀態,等待伺服器確認; 第二次:ser收到SYN包,必須確認客戶的SYN(ACK = j+1),同事自己也傳送一個SYN包(SYN = k),即SYN+

TCP握手揮手

計算機網路中TCP的三次握手與四次揮手一直都不是很清楚,今天認真的學習了一下,在此記錄下來: 三次握手: 這裡A代表TCP客戶端程式(Client),B代表TCP伺服器程式,最初兩者都是處於CLOAE(關閉)狀態。現在A先開啟連線,B被動開啟連線 ,B的TCP

TCP的握手揮手(詳解+動圖)

源埠和目的埠,各佔2個位元組,分別寫入源埠和目的埠; 序號,佔4個位元組,TCP連線中傳送的位元組流中的每個位元組都按順序編號。例如,一段報文的序號欄位值是 301 ,而攜帶的資料共有100欄位,顯然下一個報文段(如果還有的話)的資料序號應該從401開始; 確認號,佔4個位元組,是期望收到對方下一個報文的

TCP的握手揮手(詳解+圖片)

1、TCP與UDP? 1.1、概述 傳輸控制協議(TCP)是一個比較複雜的協議。主要特點如下: (1)TCP是面向連線的運輸層協議。也就是說,在使用TCP協議之前,需要建立TCP連線,當傳輸資料完畢,必須釋放已經建立的TCP連線。 (2)每一條TCP連線只能是點

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

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

TCP 握手揮手?(解釋一下握手揮手

TCP 三次握手與四次揮手?(解釋一下三次握手與四次揮手) 三次握手建立連線 1)  主機A傳送一個SYN段到主機B告訴B想要連線的主機埠,以及初始的序列號(ISN:x)(報文段1) 2) 主機B應答,伺服器發回包含B的初始序號的SYN報文段(報文段

深入淺出之 TCP協議(握手揮手、超時重發、流量控制、擁塞控制、UDP區別)

TCP/IP 中有兩個具有代表性的傳輸層協議,分別是TCP、UDP。TCP提供可靠的通訊傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通訊傳輸。 要知道TCP為了這簡單描述“可靠的通訊傳輸”背後所做的努力,你會深感佩服其強大性。TCP的特徵:序列化+確認應