TCP三次握手(建立連線) 四次揮手(關閉連線)

2022-05-04 05:00:13 字數 3869 閱讀 2876

順序號(32位):用來標識從tcp源端向tcp目的端傳送的資料字節流,它表示在這個報文段中的第乙個資料位元組的順序號。如果將位元組流看作在兩個應用程式間的單向流動,則tcp用順序號對每個位元組進行計數。序號是32bit的無符號數,序號到達2^32-1後又從0開始。當建立乙個新的連線時,syn標誌為1(該報文段不攜帶資料,但是要消耗乙個序號),順序號字段包含由這個主機選擇的該連線的初始順序號isn(initial sequence number)。

確號(32位):包含傳送確認的一端所期望收到的下乙個順序號。因此,確認序號應當是上次已成功收到資料位元組順序號加1。只有ack標誌為1時確認序號欄位才有效。tcp為應用層提供全雙工服務,這意味資料能在兩個方向上獨立地進行傳輸。因此,連線的每一端必須保持每個方向上的傳輸資料順序號。

tcp報頭長度(4位):給出報頭中32bit字的數目,它實際上指明資料從**開始。需要這個值是因為任選欄位的長度是可變的。這個欄位佔4bit ,因此tcp最多有60位元組的首部。然而,沒有任選字段,正常的長度是20位元組。

保留位(6位):保留給將來使用,目前必須置為0。

控制位(control flags ,6位):在tcp 報頭中有6個標誌位元,它們中的多個可同時被設定為 1 。依次為:  

視窗大小(16位):資料位元組數,表示從確認號開始,本報文的源方可以接收的位元組數,即源方接收視窗大小。視窗大小是乙個16bit欄位,因而視窗大小最大為65535位元組。

校驗和(16位):此校驗和是對整個的tcp報文段,包括tcp頭部和tcp資料,以 16 位字進行計算所得。這是乙個強制性的字段,一定是由傳送端計算和儲存,並由接收端進行驗證。

緊急指標(16位):只有當urg標誌置1時緊急指標才有效。緊急指標是乙個正的偏移量,和順序號欄位中的值相加表示緊急資料最後乙個位元組的序號。 tcp 的緊急方式是傳送端向另一端傳送緊急資料的一種方式。

選項:最常見的可選字段是最長報文大小,又稱為mss(maximum segment size) 。每個連線方通常都在通訊的第乙個報文(為建立連線而設定 syn 標誌的那個段)中指明這個選項,它指明本端所能接收的最大長度的報文段。選項長度不一定是 32 位字的整數倍,所以要加填充位,使得報頭長度成為整字數。

資料:tcp 報文段中的資料部分是可選的。在乙個連線建立和乙個連線終止時,雙方交換的報文段僅有tcp首部。如果一方沒有資料要傳送,也使用沒有任何資料的首部來確認收到的資料。在處理超時的許多情況中,也會傳送不帶任何資料的報文段。

所謂三次握手(three-way handshake),是指建立乙個tcp連線時,需要客戶端和伺服器總共傳送3個包。三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換tcp視窗大小資訊.

tcp連線建立的過程:

伺服器b的tcp程序先建立傳輸控制塊tcb,準備接受客戶程序的連線請求。然後伺服器b進入listen狀態,等待客戶端的連線請求。

a的tcp程序首先建立傳輸控制塊tcb,然後向b發出連線請求報文段,這時首部中的同部位syn=1,同時選擇乙個合適的初始序號seq=x。tcp規定syn報文段不能攜帶資料。這時tcp客戶程序進入syn-send狀態。

b接收到請求報文段後,如果同意建立連線,則向a傳送確認。在報文段中把syn位和ack位設定為1,確認號ack=x+1,同時選擇乙個初始序號seq=y。這個報文段也不能攜帶資料,但同樣要消耗乙個序號。這時服務為進入syn-rcvd狀態。

tcp客戶程序收到b的確認後,還要向b發出確認。確認報文段ack=1,確認號ack=y+1,而自己的選號seq=x+1。tcp規定ack報文段可以攜帶資料。但是如果不攜帶資料則不消耗序列號,在這種情況下,下乙個報文段的seq=x+1。這時tcp連線已經建立,a進入established階段。

當b收到a的確認後,也進入established階段。

在三次握手過程中,伺服器傳送syn-ack之後,收到客戶端的ack之前的tcp連線稱為半連線(half-open connect).此時伺服器處於syn_recv狀態.當收到ack後,伺服器轉入established狀態.syn攻擊就是攻擊客戶端在短時間內偽造大量不存在的ip位址,向伺服器不斷地傳送syn包,伺服器回覆確認包,並等待客戶的確認,由於源位址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的syn包將長時間占用未連線佇列,正常的syn請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。

syn攻擊是乙個典型的ddos攻擊。檢測syn攻擊非常的方便,當你在伺服器上看到大量的半連線狀態時,特別是源ip位址是隨機的,基本上可以斷定這是一次syn攻擊.在linux下可以如下命令檢測是否被syn攻擊netstat -n -p tcp | grep syn_recv

一般較新的tcp/ip協議棧都對這一過程進行修正來防範syn攻擊,修改tcp協議實現。主要方法有synattackprotect保護機制、syn cookies技術、增加最大半連線和縮短超時時間等.但是不能完全防範syn攻擊。

tcp的連線的拆除需要傳送四個包,因此稱為四次揮手(four-way handshake)。客戶端或伺服器均可主動發起揮手動作。

tcp釋放連線的過程:

a的應用程序向tcp發出釋放連線報文段,並停止傳送資料,主動關閉tcp連線。a把釋放連線報文段首部的fin設定為1,其序列號seq=u,它等於前面已傳送過的資料的最後乙個位元組的序號加1.這是a進入fin-wait-1狀態,等待b的確認。tcp規定fin報文段即使不攜帶任何資料也要消耗乙個序號。

b收到連線釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,v於b前面已經傳送過的資料的最後乙個位元組的序號加1.然後b就進入close_wait狀態。tcp程序伺服器這時通知高層應用程序,因而從a到b的這個方向的連線就釋放了,這時tcp連線處於半關閉(half_close)狀態。即a已經沒有資料要傳送了,但b如有資料傳送a仍可以接受。

a收到來自b的確認後,進入fin-wait-2狀態,等待b發出連線釋放報文段。

若b已經沒有要向a傳送的資料,其應用程序就通知tcp釋放連線。這時b發出的連線釋放報文fin=1.現在假定序號為w(在半關閉狀態b可能又傳送了一些資料)。b還必須重複上次已經傳送的確認號ack=u+1。這時b就進入last-ack狀態。

a在收到b的釋放報文段後,發出確認。在確認報文段把ack設定為1,確認號ack=w+1,而自己的序列號seq=u+1。然後進入time-wait狀態。請注意現在連線還沒有釋放。必須經過時間等待計時器設定的時間2msl後,a進入closed狀態。msl(最長報文段壽命)。

1、 為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?

這是因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步

作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,

所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡

的ack報文和fin報文多數情況下都是分開傳送的。

2、 為什麼time_wait狀態還需要等2msl後才能返回到closed狀態?

這是因為:雖然雙方都同意關閉連線了,而且握手的4個報文也都協調和傳送完畢,按理可以直接回到closed狀態(就好比從syn_send狀

態到establish狀態那樣);但是因為我們必須要假想網路是不可靠的,你無法保證你最後傳送的ack報文會一定被對方收到,因此對方處於

last_ack狀態下的socket可能會因為超時未收到ack報文,而重發fin報文,所以這個time_wait狀態的作用就是用來重發可能丟失的

ack報文。

TCP三次握手建立連線 四次揮手連線釋放

第一次握手 客戶端向服務端傳送連線請求報文段,tcp報文段首部同步位syn 1,初始序號seq x。客戶端程序進入同步傳送狀態。第二次握手 服務端收到連線請求報文段後,向客戶端傳送確認報文段。把tcp報文段首部syn位和ack位置為1,初始序號seq y,確認號ack x 1。服務端進入同步接收狀態...

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...