国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

TCP三次握手應(yīng)用及原理

2024-07-21 02:06:15
字體:
供稿:網(wǎng)友
tcp/ip是很多的不同的協(xié)議組成,實際上是一個協(xié)議組,tcp用戶數(shù)據(jù)報表協(xié)議(也稱作tcp傳輸控制協(xié)議,transport control protocol。可靠的主機(jī)到主機(jī)層協(xié)議。這里要先強(qiáng)調(diào)一下,傳輸控制協(xié)議是osi網(wǎng)絡(luò)的第四層的叫法,tcp傳輸控制協(xié)議是tcp/ip傳輸?shù)?個基本協(xié)議的一種。兩個tcp意思非相同。 )。tcp是一種可靠的面向連接的傳送服務(wù)。它在傳送數(shù)據(jù)時是分段進(jìn)行的,主機(jī)交換數(shù)據(jù)必須建立一個會話。它用比特流通信,即數(shù)據(jù)被作為無結(jié)構(gòu)的字節(jié)流。 通過每個tcp傳輸?shù)淖侄沃付樞蛱枺垣@得可靠性。是在osi參考模型中的第四層,tcp是使用ip的網(wǎng)間互聯(lián)功能而提供可靠的數(shù)據(jù)傳輸,ip不停的把報文放到 網(wǎng)絡(luò)上,而tcp是負(fù)責(zé)確信報文到達(dá)。在協(xié)同ip的操作中tcp負(fù)責(zé):握手過程、報文管理、流量控制、錯誤檢測和處理(控制),可以根據(jù)一定的編號順序?qū)Ψ钦m樞虻膱笪慕o予從新排列順序。關(guān)于tcp的rfc文檔有rfc793、rfc791、rfc1700。

在tcp會話初期,有所謂的“三握手”:對每次發(fā)送的數(shù)據(jù)量是怎樣跟蹤進(jìn)行協(xié)商使數(shù)據(jù)段的發(fā)送和接收同步,根據(jù)所接收到的數(shù)據(jù)量而確定的數(shù)據(jù)確認(rèn)數(shù)及數(shù)據(jù)發(fā)送、接收完畢后何時撤消聯(lián)系,并建立虛連接。為了提供可靠的傳送,tcp在發(fā)送新的數(shù)據(jù)之前,以特定的順序?qū)?shù)據(jù)包的序號,并需要這些包傳送給目標(biāo)機(jī)之后的確認(rèn)消息。tcp總是用來發(fā)送大批量的數(shù)據(jù)。當(dāng)應(yīng)用程序在收到數(shù)據(jù)后要做出確認(rèn)時也要用到tcp。由于tcp需要時刻跟蹤,這需要額外開銷,使得tcp的格式有些顯得復(fù)雜。下面就讓我們看一個tcp的經(jīng)典案例,這是后來被稱為mitnick攻擊中kevin開創(chuàng)了兩種攻擊技術(shù):

tcp會話劫持
syn flood(同步洪流)

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

先讓我們明白tcp建立連接的基本簡單的過程。為了建設(shè)一個小型的模仿環(huán)境我們假設(shè)有3臺接入互聯(lián)網(wǎng)的機(jī)器。a為攻擊者操縱的攻擊機(jī)。b為中介跳板機(jī)器(受信任的服務(wù)器)。c為受害者使用的機(jī)器(多是服務(wù)器),這里把c機(jī)器鎖定為目標(biāo)機(jī)器。a機(jī)器向b機(jī)器發(fā)送syn包,請求建立連接,這時已經(jīng)響應(yīng)請求的b機(jī)器會向a機(jī)器回應(yīng)syn/ack表明同意建立連接,當(dāng)a機(jī)器接受到b機(jī)器發(fā)送的syn/ack回應(yīng)時,發(fā)送應(yīng)答ack建立a機(jī)器與b機(jī)器的網(wǎng)絡(luò)連接。這樣一個兩臺機(jī)器之間的tcp通話信道就建立成功了。

b終端受信任的服務(wù)器向c機(jī)器發(fā)起tcp連接,a機(jī)器對服務(wù)器發(fā)起syn信息,使c機(jī)器不能響應(yīng)b機(jī)器。在同時a機(jī)器也向b機(jī)器發(fā)送虛假的c機(jī)器回應(yīng)的syn數(shù)據(jù)包,接收到syn數(shù)據(jù)包的b機(jī)器(被c機(jī)器信任)開始發(fā)送應(yīng)答連接建立的syn/ack數(shù)據(jù)包,這時c機(jī)器正在忙于響應(yīng)以前發(fā)送的syn數(shù)據(jù)而無暇回應(yīng)b機(jī)器,而a機(jī)器的攻擊者預(yù)測出b機(jī)器包的序列號(現(xiàn)在的tcp序列號預(yù)測難度有所加大)假冒c機(jī)器向b機(jī)器發(fā)送應(yīng)答ack這時攻擊者騙取b機(jī)器的信任,假冒c機(jī)器與b機(jī)器建立起tcp協(xié)議的對話連接。這個時候的c機(jī)器還是在響應(yīng)攻擊者a機(jī)器發(fā)送的syn數(shù)據(jù)。

tcp協(xié)議棧的弱點:tcp連接的資源消耗,其中包括:數(shù)據(jù)包信息、條件狀態(tài)、序列號等。通過故意不完成建立連接所需要的三次握手過程,造成連接一方的資源耗盡。

通過攻擊者有意的不完成建立連接所需要的三次握手的全過程,從而造成了c機(jī)器的資源耗盡。序列號的可預(yù)測性,目標(biāo)主機(jī)應(yīng)答連接請求時返回的syn/ack的序列號時可預(yù)測的。(早期tcp協(xié)議棧,具體的可以參見1981年出的關(guān)于tcp雛形的rfc793文檔)


tcp頭結(jié)構(gòu)

tcp協(xié)議頭最少20個字節(jié),包括以下的區(qū)域(由于翻譯不禁相同,文章中給出相應(yīng)的英文單詞):

tcp源端口(source port):16位的源端口其中包含初始化通信的端口。源端口和源ip地址的作用是標(biāo)示報問的返回地址。

tcp目的端口(destination port):16位的目的端口域定義傳輸?shù)哪康摹_@個端口指明報文接收計算機(jī)上的應(yīng)用程序地址接口。

tcp序列號(序列碼,sequence number):32位的序列號由接收端計算機(jī)使用,重新分段的報文成最初形式。當(dāng)syn出現(xiàn),序列碼實際上是初始序列碼(isn),而第一個數(shù)據(jù)字節(jié)是isn+1。這個序列號(序列碼)是可以補(bǔ)償傳輸中的 不一致。

tcp應(yīng)答號(acknowledgment number):32位的序列號由接收端計算機(jī)使用,重組分段的報文成最初形式。,如果設(shè)置了ack控制位,這個值表示一個準(zhǔn)備接收的包的序列碼。

數(shù)據(jù)偏移量(hlen):4位包括tcp頭大小,指示何處數(shù)據(jù)開始。

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

標(biāo)志(code bits):6位標(biāo)志域。表示為:緊急標(biāo)志、有意義的應(yīng)答標(biāo)志、推、重置連接標(biāo)志、同步序列號標(biāo)志、完成發(fā)送數(shù)據(jù)標(biāo)志。按照順序排列是:urg、ack、psh、rst、syn、fin。

窗口(window):16位,用來表示想收到的每個tcp數(shù)據(jù)段的大小。

校驗位(checksum):16位tcp頭。源機(jī)器基于數(shù)據(jù)內(nèi)容計算一個數(shù)值,收信息機(jī)要與源機(jī)器數(shù)值 結(jié)果完全一樣,從而證明數(shù)據(jù)的有效性。

優(yōu)先指針(緊急,urgent pointer):16位,指向后面是優(yōu)先數(shù)據(jù)的字節(jié),在urg標(biāo)志設(shè)置了時才有效。如果urg標(biāo)志沒有被設(shè)置,緊急域作為填充。加快處理標(biāo)示為緊急的數(shù)據(jù)段。

選項(option):長度不定,但長度必須以字節(jié)。如果 沒有 選項就表示這個一字節(jié)的域等于0。

填充:不定長,填充的內(nèi)容必須為0,它是為了數(shù)學(xué)目的而存在。目的是確保空間的可預(yù)測性。保證包頭的結(jié)合和數(shù)據(jù)的開始處偏移量能夠被32整除,一般額外的零以保證tcp頭是32位的整數(shù)倍。


標(biāo)志控制功能

urg:緊急標(biāo)志
緊急(the urgent pointer) 標(biāo)志有效。緊急標(biāo)志置位,

ack:確認(rèn)標(biāo)志
確認(rèn)編號(acknowledgement number)欄有效。大多數(shù)情況下該標(biāo)志位是置位的。tcp報頭內(nèi)的確認(rèn)編號欄內(nèi)包含的確認(rèn)編號(w+1,figure:1)為下一個預(yù)期的序列編號,同時提示遠(yuǎn)端系統(tǒng)已經(jīng)成功接收所有數(shù)據(jù)。

  psh:推標(biāo)志
該標(biāo)志置位時,接收端不將該數(shù)據(jù)進(jìn)行隊列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時,該標(biāo)志總是置位的。

rst:復(fù)位標(biāo)志
  復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的tcp連接。

syn:同步標(biāo)志
同步序列編號(synchronize sequence numbers)欄有效。該標(biāo)志僅在三次握手建立tcp連接時有效。它提示tcp連接的服務(wù)端檢查序列編號,該序列編號為tcp連接初始端(一般是客戶端)的初始序列編號。在這里,可以把tcp序列編號看作是一個范圍從0到4,294,967,295的32位計數(shù)器。通過tcp連接交換的數(shù)據(jù)中每一個字節(jié)都經(jīng)過序列編號。在tcp報頭中的序列編號欄包括了tcp分段中第一個字節(jié)的序列編號。

  fin:結(jié)束標(biāo)志
  帶有該標(biāo)志置位的數(shù)據(jù)包用來結(jié)束一個tcp回話,但對應(yīng)端口仍處于開放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)。

服務(wù)端處于監(jiān)聽狀態(tài),客戶端用于建立連接請求的數(shù)據(jù)包(ip packet)按照tcp/ip協(xié)議堆棧組合成為tcp處理的分段(segment)。

  
分析報頭信息: tcp層接收到相應(yīng)的tcp和ip報頭,將這些信息存儲到內(nèi)存中。

  檢查tcp校驗和(checksum):標(biāo)準(zhǔn)的校驗和位于分段之中(figure:2)。如果檢驗失敗,不返回確認(rèn),該分段丟棄,并等待客戶端進(jìn)行重傳。

  查找協(xié)議控制塊(pcb{}):tcp查找與該連接相關(guān)聯(lián)的協(xié)議控制塊。如果沒有找到,tcp將該分段丟棄并返回rst。(這就是tcp處理沒有端口監(jiān)聽情況下的機(jī)制) 如果該協(xié)議控制塊存在,但狀態(tài)為關(guān)閉,服務(wù)端不調(diào)用connect()或listen()。該分段丟棄,但不返回rst。客戶端會嘗試重新建立連接請求。

  建立新的socket:當(dāng)處于監(jiān)聽狀態(tài)的socket收到該分段時,會建立一個子socket,同時還有socket{},tcpcb{}和pub{}建立。這時如果有錯誤發(fā)生,會通過標(biāo)志位來拆除相應(yīng)的socket和釋放內(nèi)存,tcp連接失敗。如果緩存隊列處于填滿狀態(tài),tcp認(rèn)為有錯誤發(fā)生,所有的后續(xù)連接請求會被拒絕。這里可以看出syn flood攻擊是如何起作用的。

  丟棄:如果該分段中的標(biāo)志為rst或ack,或者沒有syn標(biāo)志,則該分段丟棄。并釋放相應(yīng)的內(nèi)存。


發(fā)送序列變量

snd.una : 發(fā)送未確認(rèn)

snd.nxt : 發(fā)送下一個

snd.wnd : 發(fā)送窗口

snd.up : 發(fā)送優(yōu)先指針

snd.wl1 : 用于最后窗口更新的段序列號

snd.wl2 : 用于最后窗口更新的段確認(rèn)號

iss : 初始發(fā)送序列號

 


接收序列號

rcv.nxt : 接收下一個

rcv.wnd : 接收下一個

rcv.up : 接收優(yōu)先指針

irs : 初始接收序列號


當(dāng)前段變量

seg.seq : 段序列號

seg.ack : 段確認(rèn)標(biāo)記

seg.len : 段長

seg.wnd : 段窗口

seg.up : 段緊急指針

seg.prc : 段優(yōu)先級


closed表示沒有連接,各個狀態(tài)的意義如下:

listen : 監(jiān)聽來自遠(yuǎn)方tcp端口的連接請求。

syn-sent : 在發(fā)送連接請求后等待匹配的連接請求。

syn-received : 在收到和發(fā)送一個連接請求后等待對連接請求的確認(rèn)。

established : 代表一個打開的連接,數(shù)據(jù)可以傳送給用戶。

fin-wait-1 : 等待遠(yuǎn)程tcp的連接中斷請求,或先前的連接中斷請求的確認(rèn)。

fin-wait-2 : 從遠(yuǎn)程tcp等待連接中斷請求。

close-wait : 等待從本地用戶發(fā)來的連接中斷請求。

closing : 等待遠(yuǎn)程tcp對連接中斷的確認(rèn)。

last-ack : 等待原來發(fā)向遠(yuǎn)程tcp的連接中斷請求的確認(rèn)。

time-wait : 等待足夠的時間以確保遠(yuǎn)程tcp接收到連接中斷請求的確認(rèn)。

closed : 沒有任何連接狀態(tài)。

tcp連接過程是狀態(tài)的轉(zhuǎn)換,促使發(fā)生狀態(tài)轉(zhuǎn)換的是用戶調(diào)用:open,send,receive,close,abort和status。傳送過來的數(shù)據(jù)段,特別那些包括以下標(biāo)記的數(shù)據(jù)段syn,ack,rst和fin。還有超時,上面所說的都會時tcp狀態(tài)發(fā)生變化。


序列號

請注意,我們在tcp連接中發(fā)送的字節(jié)都有一個序列號。因為編了號,所以可以確認(rèn)它們的收到。對序列號的確認(rèn)是累積性的。tcp必須進(jìn)行的序列號比較操作種類包括以下幾種:

①決定一些發(fā)送了的但未確認(rèn)的序列號。

②決定所有的序列號都已經(jīng)收到了。

③決定下一個段中應(yīng)該包括的序列號。


對于發(fā)送的數(shù)據(jù)tcp要接收確認(rèn),確認(rèn)時必須進(jìn)行的:

snd.una = 最老的確認(rèn)了的序列號。

snd.nxt = 下一個要發(fā)送的序列號。

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

seg.seq = 一個數(shù)據(jù)段的第一個序列號。

seg.len = 數(shù)據(jù)段中包括的字節(jié)數(shù)。

seg.seq+seg.len-1 = 數(shù)據(jù)段的最后一個序列號。

如果一個數(shù)據(jù)段的序列號小于等于確認(rèn)號的值,那么整個數(shù)據(jù)段就被確認(rèn)了。而在接收數(shù)據(jù)時下面的比較操作是必須的:

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

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

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

seg.seq+seg.len:1 = 接收到的最后一個序列號注冊會員,創(chuàng)建你的web開發(fā)資料庫,
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 余姚市| 集贤县| 炎陵县| 宣城市| 濮阳县| 五家渠市| 阳高县| 瑞金市| 金华市| 商洛市| 峨边| 尖扎县| 祁阳县| 昌平区| 都匀市| 赣榆县| 察雅县| 循化| 浮梁县| 普兰县| 越西县| 平定县| 读书| 阳谷县| 永安市| 广汉市| 广元市| 平远县| 松江区| 廊坊市| 酉阳| 江北区| 宝清县| 呈贡县| 庆云县| 水富县| 台中县| 旬阳县| 华蓥市| 剑川县| 滕州市|