簡述TCP的三次握手機制

時間 2021-10-14 21:23:07

1樓:我是江偉偉

tcp三次握手及原理

tcp/ip 是很多的不同的協議組成,實際上是一個協議組,tcp 使用者資料包表協議(也

稱作tcp 傳輸控制協議,transport control protocol。可靠的主機到主機層協議。這裡要先

強調一下,傳輸控制協議是osi 網路的第四層的叫法,tcp 傳輸控制協議是tcp/ip 傳輸的

6 個基本協議的一種。兩個tcp 意思非相同。)。tcp 是一種可靠的面向連線的傳送服務。

它在傳送資料時是分段進行的,主機交換資料必須建立一個會話。它用位元流通訊,即資料

被作為無結構的位元組流。通過每個tcp 傳輸的欄位指定順序號,以獲得可靠性。是在osi

參考模型中的第四層,tcp 是使用ip 的網間互聯功能而提供可靠的資料傳輸,ip 不停的把

報文放到網路上,而tcp 是負責確信報文到達。在協同ip 的操作中tcp 負責:握手過程、

報文管理、流量控制、錯誤檢測和處理(控制),可以根據一定的編號順序對非正常順序的

報文給予從新排列順序。關於tcp 的rfc 文件有rfc793、rfc791、rfc1700。

在tcp 會話初期,有所謂的「三握手」:對每次傳送的資料量是怎樣跟蹤進行協商使

資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送、接收完

畢後何時撤消聯絡,並建立虛連線。為了提供可靠的傳送,tcp 在傳送新的資料之前,以

特定的順序將資料包的序號,並需要這些包傳送給目標機之後的確認訊息。tcp 總是用來

傳送大批量的資料。當應用程式在收到資料後要做出確認時也要用到tcp。由於tcp 需要

時刻跟蹤,這需要額外開銷,使得tcp 的格式有些顯得複雜。下面就讓我們看一個tcp 的

經典案例,這是後來被稱為mitnick 攻擊中kevin 開創了兩種攻擊技術:

tcp 會話劫持

syn flood(同步洪流)

在這裡我們討論的時tcp 會話劫持的問題。

先讓我們明白tcp 建立連線的基本簡單的過程。為了建設一個小型的模仿環境我們假

設有3 臺接入網際網路的機器。a 為攻擊者操縱的攻擊機。b 為中介跳板機器(受信任的服務

器)。c 為受害者使用的機器(多是伺服器),這裡把c 機器鎖定為目標機器。a 機器向b

機器傳送syn 包,請求建立連線,這時已經響應請求的b 機器會向a 機器迴應syn/ack

表明同意建立連線,當a 機器接受到b 機器傳送的syn/ack 迴應時,傳送應答ack 建立

a 機器與b 機器的網路連線。這樣一個兩臺機器之間的tcp 通話通道就建立成功了。

b 終端受信任的伺服器向c 機器發起tcp 連線,a 機器對伺服器發起syn 資訊,使

c 機器不能響應b 機器。在同時a 機器也向b 機器傳送虛假的c 機器迴應的syn 資料包,

接收到syn 資料包的b 機器(被c 機器信任)開始傳送應答連線建立的syn/ack 資料包,

這時c 機器正在忙於響應以前傳送的syn 資料而無暇迴應b 機器,而a 機器的攻擊者預

測出b 機器包的序列號(現在的tcp 序列號**難度有所加大)假冒c 機器向b 機器傳送

應答ack 這時攻擊者騙取b 機器的信任,假冒c 機器與b 機器建立起tcp 協議的對話連

接。這個時候的c 機器還是在響應攻擊者a 機器傳送的syn 資料。

tcp 協議棧的弱點:tcp 連線的資源消耗,其中包括:資料包資訊、條件狀態、序列

號等。通過故意不完成建立連線所需要的三次握手過程,造成連線一方的資源耗盡。

通過攻擊者有意的不完成建立連線所需要的三次握手的全過程,從而造成了c 機器的

資源耗盡。序列號的可**性,目標主機應答連線請求時返回的syn/ack 的序列號時可預

測的。(早期tcp 協議棧,具體的可以參見1981 年出的關於tcp 雛形的rfc793 文件)

tcp 頭結構

tcp 協議頭最少20 個位元組,包括以下的區域(由於翻譯不禁相同,文章中給出

相應的英文單詞):

tcp 源埠(source port):16 位的源埠其中包含初始化通訊的埠。源埠和

源ip 地址的作用是標示報問的返回地址。

tcp 目的埠(destination port):16 位的目的埠域定義傳輸的目的。這個埠指

明報文接收計算機上的應用程式地址介面。

tcp 序列號(序列碼,sequence number):32 位的序列號由接收端計算機使用,重

新分段的報文成最初形式。當syn 出現,序列碼實際上是初始序列碼(isn),而第一個數

據位元組是isn+1。這個序列號(序列碼)是可以補償傳輸中的不一致。

tcp 應答號(acknowledgment number):32 位的序列號由接收端計算機使用,重

組分段的報文成最初形式。,如果設定了ack 控制位,這個值表示一個準備接收的包的序

列碼。資料偏移量(hlen):4 位包括tcp 頭大小,指示何處資料開始。

保留(reserved):6 位值域,這些位必須是0。為了將來定義新的用途所保留。

標誌(code bits):6 位標誌域。表示為:緊急標誌、有意義的應答標誌、推、重置

連線標誌、同步序列號標誌、完成傳送資料標誌。按照順序排列是:urg、ack、psh、

rst、syn、fin。

視窗(window):16 位,用來表示想收到的每個tcp 資料段的大小。

校驗位(checksum):16 位tcp 頭。源機器基於資料內容計算一個數值,收資訊機

要與源機器數值結果完全一樣,從而證明資料的有效性。

優先指標(緊急,urgent pointer):16 位,指向後面是優先資料的位元組,在urg

標誌設定了時才有效。如果urg 標誌沒有被設定,緊急域作為填充。加快處理標示為緊急

的資料段。

選項(option):長度不定,但長度必須以位元組。如果沒有選項就表示這個一位元組

的域等於0。

填充:不定長,填充的內容必須為0,它是為了數學目的而存在。目的是確保空

間的可**性。保證包頭的結合和資料的開始處偏移量能夠被32 整除,一般額外的零以保

證tcp 頭是32 位的整數倍。

標誌控制功能

urg:緊急標誌

緊急(the urgent pointer) 標誌有效。緊急標誌置位,

ack:確認標誌

確認編號(acknowledgement number)欄有效。大多數情況下該標誌位是置位的。

tcp 報頭內的確認編號欄內包含的確認編號(w+1,figure:1)為下一個預期的序列編號,同

時提示遠端系統已經成功接收所有資料。

psh:推標誌

該標誌置位時,接收端不將該資料進行佇列處理,而是儘可能快將資料轉由應用

處理。在處理telnet 或rlogin 等互動模式的連線時,該標誌總是置位的。

rst:復位標誌

復位標誌有效。用於復位相應的tcp 連線。

syn:同步標誌

同步序列編號(synchronize sequence numbers)欄有效。該標誌僅在三次握手建立

tcp 連線時有效。它提示tcp 連線的服務端檢查序列編號,該序列編號為tcp 連線初始端

(一般是客戶端)的初始序列編號。在這裡,可以把tcp 序列編號看作是一個範圍從0 到4,

294,967,295 的32 位計數器。通過tcp 連線交換的資料中每一個位元組都經過序列編號。

在tcp 報頭中的序列編號欄包括了tcp 分段中第一個位元組的序列編號。

fin:結束標誌

帶有該標誌置位的資料包用來結束一個tcp 回話,但對應埠仍處於開放狀態,

準備接收後續資料。

服務端處於監聽狀態,客戶端用於建立連線請求的資料包(ip packet)按照tcp/ip

協議堆疊組合成為tcp 處理的分段(segment)。

分析報頭資訊: tcp 層接收到相應的tcp 和ip 報頭,將這些資訊儲存到記憶體中。

檢查tcp 校驗和(checksum):標準的校驗和位於分段之中(figure:2)。如果檢驗

失敗,不返回確認,該分段丟棄,並等待客戶端進行重傳。

查詢協議控制塊(pcb{}):tcp 查詢與該連線相關聯的協議控制塊。如果沒有找

到,tcp 將該分段丟棄並返回rst。(這就是tcp 處理沒有埠監聽情況下的機制) 如果該

協議控制塊存在,但狀態為關閉,服務端不呼叫connect()或listen()。該分段丟棄,但不返

回rst。客戶端會嘗試重新建立連線請求。

建立新的socket:當處於監聽狀態的socket 收到該分段時,會建立一個子socket,

同時還有socket{},tcpcb{}和pub{}建立。這時如果有錯誤發生,會通過標誌位來拆除相應

的socket 和釋放記憶體,tcp 連線失敗。如果快取佇列處於填滿狀態,tcp 認為有錯誤發生,

所有的後續連線請求會被拒絕。這裡可以看出syn flood 攻擊是如何起作用的。

丟棄:如果該分段中的標誌為rst 或ack,或者沒有syn 標誌,則該分段丟棄。

並釋放相應的記憶體。

傳送序列變數

snd.una : 傳送未確認

snd.nxt : 傳送下一個

snd.wnd : 傳送視窗

snd.up : 傳送優先指標

snd.wl1 : 用於最後視窗更新的段序列號

snd.wl2 : 用於最後視窗更新的段確認號

iss : 初始傳送序列號

接收序列號

rcv.nxt : 接收下一個

rcv.wnd : 接收下一個

rcv.up : 接收優先指標

irs : 初始接收序列號

當前段變數

seg.seq : 段序列號

seg.ack : 段確認標記

seg.len : 段長

seg.wnd : 段視窗

seg.up : 段緊急指標

seg.prc : 段優先順序

closed 表示沒有連線,各個狀態的意義如下:

listen : 監聽來自遠方tcp 埠的連線請求。

syn-sent : 在傳送連線請求後等待匹配的連線請求。

syn-received : 在收到和傳送一個連線請求後等待對連線請求的確認。

established : 代表一個開啟的連線,資料可以傳送給使用者。

fin-wait-1 : 等待遠端tcp 的連線中斷請求,或先前的連線中斷請求的確認。

fin-wait-2 : 從遠端tcp 等待連線中斷請求。

close-wait : 等待從本地使用者發來的連線中斷請求。

closing : 等待遠端tcp 對連線中斷的確認。

last-ack : 等待原來發向遠端tcp 的連線中斷請求的確認。

time-wait : 等待足夠的時間以確保遠端tcp 接收到連線中斷請求的確認。

closed : 沒有任何連線狀態。

tcp 連線過程是狀態的轉換,促使發生狀態轉換的是使用者呼叫:open,send,

receive,close,abort 和status。傳送過來的資料段,特別那些包括以下標記的數

據段syn,ack,rst 和fin。還有超時,上面所說的都會時tcp 狀態發生變化。

序列號請注意,我們在tcp 連線中傳送的位元組都有一個序列號。因為編了號,所以可以

確認它們的收到。對序列號的確認是累積性的。tcp 必須進行的序列號比較操作種類包括

以下幾種:

①決定一些傳送了的但未確認的序列號。

②決定所有的序列號都已經收到了。

③決定下一個段中應該包括的序列號。

對於傳送的資料tcp 要接收確認,確認時必須進行的:

snd.una = 最老的確認了的序列號。

snd.nxt = 下一個要傳送的序列號。

seg.ack = 接收tcp 的確認,接收tcp 期待的下一個序列號。

seg.seq = 一個資料段的第一個序列號。

seg.len = 資料段中包括的位元組數。

seg.seq+seg.len-1 = 資料段的最後一個序列號。

如果一個資料段的序列號小於等於確認號的值,那麼整個資料段就被確認了。而

在接收資料時下面的比較操作是必須的:

rcv.nxt = 期待的序列號和接收視窗的最低沿。

rcv.nxt+rcv.wnd:1 = 最後一個序列號和接收視窗的最高沿。

seg.seq = 接收到的第一個序列號。

seg.seq+seg.len:1 = 接收到的最後一個序列號。

為什麼tcp連線的時候是三次握手,關閉的時候是四次握手

郭巨俠不愛說話 tcp需要三次握手才能建立連線,那麼為什麼需要三次握手呢?tcp建立連線為什麼需要三次握手而結束要四次 綦竹 tcp三次握手過程 一個完整的 tcp連線的建立,需要三次握手,然後雙方以全雙工的方式傳送和接收資料。很多的埠掃描技術是依靠 tcp三次握手來實現的,所以,下面對 tcp的三...

tcp第三次握手之後伺服器端是否傳送了確認資訊

三次握手後,服務端已經是establish狀態,也就是就緒了,客戶端可以傳送資料包文了。所謂的確認是指客戶端需要確認服務端是否就緒,服務端通過ack訊息通知客戶端,因為服務端一直是偵聽狀態的。 建立連線的時候三次握手後伺服器和客戶機全部進入establish狀態。關閉的時候是四次。在tcp三次握手中...

蘋果手機前三次怎麼充電,蘋果手機前三次充電需多久?

目前手機所用的都是鋰電池,不存在啟用或是記憶性一說,正常充電充滿拔下即可,如果不放心,可充滿後延時半小時到1小時拔下,多充也沒有什麼作用的,目前手機都有保護功能,在電池充滿後手機會自動斷開充電狀態。鋰電池的壽命,與高溫和充電次數是有關係的,不要邊充邊玩,每次充電把電池充滿在拔下,避免多次重複充電。隨...