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小時拔下,多充也沒有什麼作用的,目前手機都有保護功能,在電池充滿後手機會自動斷開充電狀態。鋰電池的壽命,與高溫和充電次數是有關係的,不要邊充邊玩,每次充電把電池充滿在拔下,避免多次重複充電。隨...