1. 程式人生 > >簡單說明TCP的狀態和三次握手、四次握手

簡單說明TCP的狀態和三次握手、四次握手

在TCP層,有個FLAGS欄位,這個欄位有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.

其中,對於我們日常的分析有用的就是前面的五個欄位。

 它們的含義是:

SYN表示建立連線,

FIN表示關閉連線,

ACK表示響應,

PSH表示有 DATA資料傳輸,

RST表示連線重置。

 其中,ACK是可能與SYN,FIN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連線之後的響應,

 如果只是單個的一個SYN,它表示的只是建立連線。

TCP的幾次握手就是通過這樣的ACK表現出來的。

 但SYN與FIN是不會同時為1的,因為前者表示的是建立連線,而後者表示的是斷開連線。

RST一般是在FIN之後才會出現為1的情況,表示的是連線重置。

 一般地,當出現FIN包或RST包時,我們便認為客戶端與伺服器端斷開了連線;而當出現SYN和SYN+ACK包時,我們認為客戶端與伺服器建立了一個連線。

PSH為1的情況,一般只出現在 DATA內容不為0的包中,也就是說PSH為1表示的是有真正的TCP資料包內容被傳遞。

TCP的連線建立和連線關閉,都是通過請求-響應的模式完成的。

 概念補充-TCP三次握手:

TCP(Transmission Control Protocol)傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線:

 位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼)

第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=1234567的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機;

 第二次握手:主機B收到請求後要確認聯機資訊,向A傳送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;

 第三次握手:主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連線建立成功。

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

 在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。  第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;  第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與伺服器開始傳送資料. 

斷開連線的四次握手用來關閉已建立的TCP連線

1. (B) --> ACK/FIN --> (A)

2. (B) <-- ACK <-- (A)

3. (B) <-- ACK/FIN <-- (A)

4. (B) --> ACK --> (A)

注意: 由於TCP連線是雙向連線, 因此關閉連線需要在兩個方向上做。ACK/FIN 包(ACK 和FIN 標記設為1)通常被認為是FIN(終結)包.然而, 由於連線還沒有關閉, FIN包總是打上ACK標記. 沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認為是惡意的

連線復位Resetting a connection

四次握手不是關閉TCP連線的唯一方法. 有時,如果主機需要儘快關閉連線(或連線超時,埠或主機不可達),RST (Reset)包將被髮送. 注意在,由於RST包不是TCP連線中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連線中RST包可以帶ACK確認標記

請注意RST包是可以不要收到方確認的?

無效的TCP標記Invalid TCP Flags

到目前為止,你已經看到了 SYN, ACK, FIN, 和RST 標記. 另外,還有PSH (Push) 和URG (Urgent)標記.

最常見的非法組合是SYN/FIN 包. 注意:由於 SYN包是用來初始化連線的, 它不可能和 FIN和RST標記一起出現. 這也是一個惡意攻擊.

由於現在大多數防火牆已知 SYN/FIN 包, 別的一些組合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明顯,當網路中出現這種包時,很你的網路肯定受到攻擊了。

別的已知的非法包有FIN (無ACK標記)和"NULL"包。如同早先討論的,由於ACK/FIN包的出現是為了關閉一個TCP連線,那麼正常的FIN包總是帶有 ACK 標記。"NULL"包就是沒有任何TCP標記的包(URG,ACK,PSH,RST,SYN,FIN都為0)。

到目前為止,正常的網路活動下,TCP協議棧不可能產生帶有上面提到的任何一種標記組合的TCP包。當你發現這些不正常的包時,肯定有人對你的網路不懷好意。

相關借鑑:

http://blog.csdn.net/onlyou930/article/details/7386484

http://www.cnblogs.com/azraelly/archive/2012/12/25/2832393.html

相關推薦

簡單說明TCP狀態握手握手

在TCP層,有個FLAGS欄位,這個欄位有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG. 其中,對於我們日常的分析有用的就是前面的五個欄位。  它們的含義是: SYN表示建立連線, FIN表示關閉連線, ACK表示響應, PSH表示有 DATA資料傳輸, RST表示連線重置。  其

TCP握手端口有限狀態

TCP三次握手、四次端口和有限狀態機1、TCP用三次握手(three-way handshake) 一對終端同時初始化一個它們之間的連接是可能的。但通常是由一端打開一個套接字(socket)然後監聽來自另一方的連接,這就是通常所指的被動打開(passive open)。服務器端被被動打開以後,用戶端就能開始創

TCP協議詳解(TCP報文握手揮手TIME_WAIT狀態滑動視窗擁塞控制粘包問題狀態轉換圖)

一、TCP報文 【重要的欄位】: 序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記; 確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確

TCP/IP握手揮手11種狀態知識點整理

做應用層做得比較久了,底層的一些知識點有點遺忘,今天正好有空梳理了一下關於TCP/IP通訊相關的一些知識點。 TCP三次握手建立連線 Tcp頭部   六個標誌位中,我們要用到三個: SYN:SYNchronous,SYN= 1 表示這是一個連線請求或連線接受報文。在建立連線時用來進行同步序號(個人理解

【前端面試】OSI七層模型TCP握手揮手

osi七層模型: TCP協議頭部的格式 Source Port和DestinationPort:分別佔用16位,表示源埠號和目的埠號;用於區別主機中的不同程序,而IP地址是用來區分不同的主機的,源埠號和目的埠號配合上IP首部中的源IP地址和目的

TCP握手斷開與十一種狀態

多線程 半雙工 可靠傳輸 set number 加密 判斷 節點 關閉 一:OSI 模型 Open System Interconnect開放系統互連參考模型,是由ISO(國際標準化組織)定義的,它是個靈活的、穩健的和可互操作的模型,OSI模型的目的是為了規範不同系統的互聯

簡單說說TCP握手揮手機制

1.什麼是TCP TCP全稱Transmission Control Protocol(傳輸控制協議),是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。是為了在不可靠的網際網路絡上提供可靠的端到端位元組流而專門設計的一個傳輸協議。  關鍵資訊:    1)面向連線 &nb

TCP握手握手

如果 就是 三次 應用程序 產生 通知 的確 計時器 同時  前言   TCP用於應用程序之間的通信。當應用程序希望通過TCP與另一個應用程序通信時,它會發送一個通信請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP將在兩個應用程序之間建立一個全雙工的通信

TCP握手揮手

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

TCP協議握手揮手

TCP的概述 TCP 把連線作為最基本的物件,每一條 TCP 連線都有兩個端點,這種斷點我們叫作套接字(socket),它的定義為埠號拼接到 IP 地址即構成了套接字,例如,若 IP 地址為 192.3.4.16  而埠號為 80,那麼得到的套接字為 192.3.4.16:80 。 但凡是基於

淺析TCP握手揮手

一、 1、2、3是三次握手 1:客戶端向伺服器請求連線 2:伺服器確認可以連線,,(相當於告訴客戶端,我準備好啦) 3:客戶端確認可以連線,,(客戶端:我也準備好啦) 二、 4,也就是Socket通訊了 三、 5、6、7、8是四次揮手,這裡假設是Client

用wireshark抓包分析TCP握手揮手以及TCP實現可靠傳輸的機制(轉)

關於TCP三次握手和四次揮手大家都在《計算機網路》課程裡學過,還記得當時高超老師耐心地講解。大學裡我遇到的最好的老師大概就是這位了,雖然他只給我講過《java程式設計》和《計算機網路》,但每次課幾乎都動手敲程式碼或者當場做實驗。好了不扯了,下面進入正題。      關

面試題:TCP握手握手內容整理

第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(s

為什麼TCP需要“握手揮手”?

更多傳輸層知識點:傳輸層的UDP通訊和TCP通訊 為什麼TCP需要“三次握手”、“四次揮手”? 三次握手過程 1、連線過程最新的一次連線都不可靠,因為最新的這次連線可能丟包、損壞等。 2、如果是兩次握手,伺服器在接收到連線請求後,需要建立資料結構來維護連線請求,如果伺服器

TCP協議握手揮手詳解

本文參考自文章http://blog.csdn.net/whuslei/article/details/6667471/,但文章只給了大致流程(某些部分太大略了)。這裡將詳細流程記錄下來,並添加了自己

TCP 握手揮手以及安全傳輸

TCP協議使用連線管理、流量控制、擁塞控制三大機制來保證可靠性傳輸 三次握手: 開始客戶端處於 close  初始關閉狀態 客戶端:傳送SYN=1(表示請求連線),seq=x(申明自己序號為x) 之後客戶端處於 syn_sent  表示已經發送syn報文

TCP握手揮手內容整理

轉自:https://blog.csdn.net/qq_18425655/article/details/52163228 三次握手: 在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線. 一次握手:建立連線時,客戶端傳送syn包(syn=

面試總結:TCP握手揮手

TCP三次握手、四次揮手 1、三次握手 三次握手的過程如下: 客戶端A 傳送SYN(seq = x)報文給伺服器B,然後進入SYN_SENT狀態; B收到SYN報文,迴應一個SYN(se

輕鬆理解tcp握手揮手

介紹:tcp是面向連線的協議,運輸連線是用來傳送tcp報文的,所以每次連線都有三個過程:建立連線、資料傳送、連線釋放。 tcp連線建立過程中要解決一下三個問題: (1)要使每一方知道對方的存在 (2)要允許雙方協商一些引數(如最大視窗值、是否使用視窗擴大選項等) (3)能夠對運輸實體資源(如

TCP/IP之TCP協議首部握手揮手FSM

timestamp 我希望 可能 傳輸 同步 調用 emc ron 超時 TCP包頭 <--------------------------------32 位------------------------------> 0 8