TCP的三次握手和四次揮手

2021-08-29 16:35:21 字數 3137 閱讀 8011

tcp握手協議

1.建立連線-三次握手

在tcp/ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線.

第一次握手:建立連線時,客戶端傳送syn包(seq=j)到伺服器,並進入syn_send狀態,等待伺服器確認;

syn:同步序列編號(synchronize sequence numbers)

第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送乙個syn包(seq=k),即syn+ack包,此時伺服器進入syn_recv狀態;

第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手.

(1)序號:seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

(2)確認序號:ack序號,佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack=seq+1。

(3)標誌位:共6個,即urg、ack、psh、rst、syn、fin等,具體含義如下:

(a)urg:緊急指標(urgent pointer)有效。

(b)ack:確認序號有效。

(c)psh:接收方應該盡快將這個報文交給應用層。

(d)rst:重置連線。

(e)syn:發起乙個新連線。

(f)fin:釋放乙個連線。

需要注意的是:

(a)不要將確認序號ack與標誌位中的ack搞混了。

(b)確認方ack=發起方seq+1,兩端配對。

第一次:客戶端傳送建立連線請求,syn=1,隨機生成seq=j,進入syn_sent狀態,等待伺服器確認

第二次:伺服器接收到建立連線請求,將syn=1,ack=1,回應ack=j + 1,隨機產生seq=k,傳送確認連線請求,進入syn_rcvd狀態

第三次:客戶端收到確認連線請求,檢查ack是否是j+1,ack是否為1;如果正確,傳送ack= 1,ack = k + 1到伺服器,客戶端狀態變為established,伺服器接受到確認建立包後,檢查ack和ack,正確就連線成功,進入established,完成三次握手,可以傳輸資料。

syn攻擊:在第一次握手的時候,偽造大量不存在的ip位址,不斷向server傳送syn請求包,然後server就會不斷處理請求,這些偽造的syn包就會占用未連線的佇列,導致正常的syn請求因為佇列滿而被丟棄,可以通過指令指令檢查,如果大量半連線的狀態且源ip是隨機的,那麼就是遭到syn攻擊了。

為什麼需要三次握手?

如果是兩次握手,即客戶端傳送請求,syn=1,seq = x;但是由於網路延時,導致這個包超時沒有送到伺服器;因此超時重傳,客戶端再傳送乙個請求包syn=1, seq = y,此時伺服器收到了並建立連線,傳送syn = 1,ack =1,seq = j,ack =y + 1;然後進行資料傳輸,並釋放了連線。

就在這時,伺服器收到了那個超時的請求包,以為客戶端又要建立連線,就傳送了syn = 1,ack =1,seq = k,ack =x + 1;此時是兩次握手,連線建立了,因此伺服器等待客戶端傳送資料,但是客戶端此時並不想建立連線,即不會傳送資料,導致伺服器長時間等待,浪費資源。

如果使用三次握手,為什麼能解決這個問題,因為如果客戶端收到伺服器確認連線的請求,並且syn = 1,ack =1,seq = k,ack =x + 1;說明伺服器收到的請求包是客戶端放棄的請求包,因此客戶端可以不理睬這個確認連線請求,但是會傳送乙個復位報文段,rst =1,ack=1,ack = k+1,表明拒絕tcp連線建立請求,並且告知伺服器已經收到其發的確認連線包。

2. 釋放連線-四次揮手

由於tcp全雙工,因此每個方向都要單獨進行關閉,當一方完成資料傳送任務後,傳送fin來終止這一方向的連線,收到fin只是意味著乙個方向上沒有資料流動了,即不會再收到資料了,但是tcp連線上依然能傳送資料,知道這一方向也傳送fin。

首先是進行關閉的一方主動關閉,然後另一方則被動關閉。

第一次:客戶端傳送乙個fin = 1,seq = m用來關閉客戶端到伺服器方向的資料傳送,客戶端進入fin_wait1狀態

第二次:伺服器收到fin之後,傳送乙個ack=1,ack = m +1,伺服器進入close_wait狀態

第三次:伺服器傳送乙個fin=1,seq = n,用來關閉伺服器到客戶端這個方向上的資料傳送,伺服器進入last_ack狀態。

第四次:客戶端數到fin之後,進入time_wait狀態,接著傳送乙個ack=1,ack = n +1,進入close狀態,server收到ack和ack進行核對後,也進入close狀態,完成四次揮手。

還有一種是同時主動關閉

為什麼釋放連線需要四次揮手?

因為是全雙工的形式連線,所以為了避免客戶端資料傳送完畢後,向服務端傳送fin,然後服務端還有資料沒有傳送完畢的情況,如果服務端傳送fin,那麼這些未傳送的資料就不能傳送了,因此需要先確認收到ack,表明客戶端已經關閉傳送資料連線,等到服務端未傳送的資料傳送完了,那麼再傳送fin請求,關閉服務端的傳送連線。

關於time_wait?

等待2ms的原因,因為伺服器那邊可能會在一段時間內,沒有收到客戶端的ack訊號,就會超時重傳,這樣客戶端就知道上一條確認關閉請求沒有傳送成功,從而重新傳送。如果沒有等待2ms立即關閉,那麼伺服器就不知道客戶端是否收到自己的關閉請求,因此會引起關閉異常;

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

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

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...