筆記 TCP協議的三次握手四次揮手 詳解

2022-06-02 00:42:16 字數 3753 閱讀 9887

tcp 提供一種面向連線的、可靠的位元組流服務

在乙個 tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於 tcp

tcp 使用校驗和,確認和重傳機制來保證可靠傳輸

tcp 給資料分節進行排序,並使用累積確認保證資料的順序不變和非重複

tcp 使用滑動視窗機制來實現流量控制,通過動態改變視窗的大小進行擁塞控制

注意:tcp 並不能保證資料一定會被對方接收到,因為這是不可能的。tcp 能夠做到的是,如果有可能,就把資料遞送到接收方,否則就(通過放棄重傳並且中斷連線這一手段)通知使用者。因此準確說 tcp 也不是 100% 可靠的協議,它所能提供的是資料的可靠遞送或故障的可靠通知。

所謂三次握手(three-way handshake),是指建立乙個 tcp 連線時,需要客戶端和伺服器總共傳送3個包。

三次握手的目的是連線伺服器指定埠,建立 tcp 連線,並同步連線雙方的序列號和確認號,交換 tcp 視窗大小資訊。在 socket 程式設計中,客戶端執行connect()時。將觸發三次握手。

第一次握手(syn=1, seq=x):

客戶端傳送乙個 tcp 的 syn 標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號 x,儲存在包頭的序列號(sequence number)欄位裡。

傳送完畢後,客戶端進入syn_send狀態。

第二次握手(syn=1, ack=1, seq=y, acknum=x+1):

伺服器發回確認包(ack)應答。即 syn 標誌位和 ack 標誌位均為1。伺服器端選擇自己 isn 序列號,放到 seq 域裡,同時將確認序號(acknowledgement number)設定為客戶的 isn 加1,即x+1。 傳送完畢後,伺服器端進入syn_rcvd狀態。

第三次握手(ack=1,acknum=y+1)

客戶端再次傳送確認包(ack),syn 標誌位為0,ack 標誌位為1,並且把伺服器發來 ack 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫isn的+1

傳送完畢後,客戶端進入established狀態,當伺服器端接收到這個包時,也進入established狀態,tcp 握手結束。

三次握手的過程的示意圖如下:

tcp 的連線的拆除需要傳送四個包,因此稱為四次揮手(four-way handshake),也叫做改進的三次握手。客戶端或伺服器均可主動發起揮手動作,在 socket 程式設計中,任何一方執行close()操作即可產生揮手操作。

第一次揮手(fin=1,seq=x)

假設客戶端想要關閉連線,客戶端傳送乙個 fin 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。

傳送完畢後,客戶端進入fin_wait_1狀態。

第二次揮手(ack=1,acknum=x+1)

伺服器端確認客戶端的 fin 包,傳送乙個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。

傳送完畢後,伺服器端進入close_wait狀態,客戶端接收到這個確認包之後,進入fin_wait_2狀態,等待伺服器端關閉連線。

第三次揮手(fin=1,seq=y)

伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,fin 置為1。

傳送完畢後,伺服器端進入last_ack狀態,等待來自客戶端的最後乙個ack。

第四次揮手(ack=1,acknum=y+1)

客戶端接收到來自伺服器端的關閉請求,傳送乙個確認包,並進入time_wait狀態,等待可能出現的要求重傳的 ack 包。

伺服器端接收到這個確認包之後,關閉連線,進入closed狀態。

客戶端等待了某個固定時間(兩個最大段生命週期,2msl,2 maximum segment lifetime)之後,沒有收到伺服器端的 ack ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入closed狀態。

四次揮手的示意圖如下:

什麼是 syn 攻擊(syn flood)?

在三次握手過程中,伺服器傳送 syn-ack 之後,收到客戶端的 ack 之前的 tcp 連線稱為半連線(half-open connect)。此時伺服器處於 syn_rcvd 狀態。當收到 ack 後,伺服器才能轉入 established 狀態.

syn 攻擊指的是,攻擊客戶端在短時間內偽造大量不存在的ip位址,向伺服器不斷地傳送syn包,伺服器回覆確認包,並等待客戶的確認。由於源位址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的syn包將長時間占用未連線佇列,正常的syn請求被丟棄,導致目標系統執行緩慢,嚴重者會引起網路堵塞甚至系統癱瘓。

syn 攻擊是一種典型的 dos/ddos 攻擊。

如何檢測 syn 攻擊?

檢測 syn 攻擊非常的方便,當你在伺服器上看到大量的半連線狀態時,特別是源ip位址是隨機的,基本上可以斷定這是一次syn攻擊。在 linux/unix 上可以使用系統自帶的 netstats 命令來檢測 syn 攻擊。

如何防禦 syn 攻擊?

syn攻擊不能完全被阻止,除非將tcp協議重新設計。我們所做的是盡可能的減輕syn攻擊的危害,常見的防禦 syn 攻擊的方法有如下幾種:

tcp 的連線,實際上是一種純軟體層面的概念,在物理層面並沒有「連線」這種概念。tcp 通訊雙方建立互動的連線,但是並不是一直存在資料互動,有些連線會在資料互動完畢後,主動釋放連線,而有些不會。在長時間無資料互動的時間段內,互動雙方都有可能出現掉電、宕機、異常重啟等各種意外,當這些意外發生之後,這些 tcp 連線並未來得及正常釋放,在軟體層面上,連線的另一方並不知道對端的情況,它會一直維護這個連線,長時間的積累會導致非常多的半開啟連線,造成端系統資源的消耗和浪費,為了解決這個問題,在傳輸層可以利用 tcp 的 keepalive 機制實現來實現。主流的作業系統基本都在核心裡支援了這個特性。

tcp keepalive 的基本原理是,隔一段時間給連線對端傳送乙個探測包,如果收到對方回應的 ack,則認為連線還是存活的,在超過一定重試次數之後還是沒有收到對方的回應,則丟棄該 tcp 連線。

tcp-keepalive-howto 有對 tcp keepalive 特性的詳細介紹,有興趣的同學可以參考。這裡主要說一下,tcp keepalive 的侷限。首先 tcp keepalive 監測的方式是傳送乙個 probe 包,會給網路帶來額外的流量,另外 tcp keepalive 只能在核心層級監測連線的存活與否,而連線的存活不一定代表服務的可用。例如當乙個伺服器 cpu 程序伺服器占用達到 100%,已經卡死不能響應請求了,此時 tcp keepalive 依然會認為連線是存活的。因此 tcp keepalive 對於應用層程式的價值是相對較小的。需要做連線保活的應用層程式,例如 qq,往往會在應用層實現自己的心跳功能。

計算機網路:自頂向下方法

tcp三次握手及四次揮手詳細**

tcp協議三次握手過程分析

tcp協議中的三次握手和四次揮手(**)

tcp-keepalive-howto

TCP三次握手和四次揮

一 tcp報文格式 在了解三次握手和四次揮手之前,首先要知道tcp報文內部包含了哪些東西。報文主要段的含義 序號 seq 用來標記資料段的順序,確保tcp傳輸有序。ack 確認 確認序號標誌,ack 1表示確認號字段有效,ack 0表示確認序號無效。syn 同步 連線請求序號標誌,用於建立連線。sy...

三次握手和四次揮手 TCP三次握手和四次揮手的理解

相比較於udp傳輸協議,tcp傳輸協議被認為是安全可靠的,這是由於tcp協議的三次握手和四次揮手保證了資料傳輸的安全性。tcp報文格式簡介 要了解tcp協議的三次握手和四次揮手,需要先了解在tcp協議中請求和響應的資料報報文格式。在報文中有幾個值得注意的字段 1 序號 seq序號,佔32位,用來標識...

HTTP協議簡介及TCP三次握手和四次揮手

一 tcp ip協議介紹 tcp ip協議是分層的,從底層至應用層分別為 物理層,鏈路層,網路層,傳輸層和應用層 從應用層至物理層,資料是一層層封裝,封裝的方式一般都是在原有的資料的前面加乙個資料控制頭,資料封裝格式如下 其中,對於tcp傳輸協議,客戶端在與伺服器建立連線前需要經過三次握手,過程如下...