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傳輸協議,客戶端在與伺服器建立連線前需要經過三次握手,過程如下...