TCP三次握手及原理
在TCP會(huì)話初期,有所謂的“三握手”:對(duì)每次發(fā)送的數(shù)據(jù)量是怎樣跟蹤進(jìn)行協(xié)商使數(shù)據(jù)段的發(fā)送和接收同步,根據(jù)所接收到的數(shù)據(jù)量而確定的數(shù)據(jù)確認(rèn)數(shù)及數(shù)據(jù)發(fā)送、接收完畢后何時(shí)撤消聯(lián)系,并建立虛連接。為了提供可靠的傳送,TCP在發(fā)送新的數(shù)據(jù)之前,以特定的順序?qū)?shù)據(jù)包的序號(hào),并需要這些包傳送給目標(biāo)機(jī)之后的確認(rèn)消息。TCP總是用來(lái)發(fā)送大批量的數(shù)據(jù)。當(dāng)應(yīng)用程序在收到數(shù)據(jù)后要做出確認(rèn)時(shí)也要用到TCP。由于TCP需要時(shí)刻跟蹤,這需要額外開(kāi)銷,使得TCP的格式有些顯得復(fù)雜。下面就讓我們看一個(gè)TCP的經(jīng)典案例,這是后來(lái)被稱為MITNICK攻擊中KEVIN開(kāi)創(chuàng)了兩種攻擊技術(shù):
TCP會(huì)話劫持
SYN FLOOD(同步洪流)
在這里我們討論的時(shí)TCP會(huì)話劫持的問(wèn)題。
先讓我們明白TCP建立連接的基本簡(jiǎn)單的過(guò)程。為了建設(shè)一個(gè)小型的模仿環(huán)境我們假設(shè)有3臺(tái)接入互聯(lián)網(wǎng)的機(jī)器。A為攻擊者操縱的攻擊機(jī)。B為中介跳板機(jī)器(受信任的服務(wù)器)。C為受害者使用的機(jī)器(多是服務(wù)器),這里把C機(jī)器鎖定為目標(biāo)機(jī)器。A機(jī)器向B機(jī)器發(fā)送SYN包,請(qǐng)求建立連接,這時(shí)已經(jīng)響應(yīng)請(qǐng)求的B機(jī)器會(huì)向A機(jī)器回應(yīng)SYN/ACK表明同意建立連接,當(dāng)A機(jī)器接受到B機(jī)器發(fā)送的SYN/ACK回應(yīng)時(shí),發(fā)送應(yīng)答ACK建立A機(jī)器與B機(jī)器的網(wǎng)絡(luò)連接。這樣一個(gè)兩臺(tái)機(jī)器之間的TCP通話信道就建立成功了。
B終端受信任的服務(wù)器向C機(jī)器發(fā)起TCP連接,A機(jī)器對(duì)服務(wù)器發(fā)起SYN信息,使C機(jī)器不能響應(yīng)B機(jī)器。在同時(shí)A機(jī)器也向B機(jī)器發(fā)送虛假的C機(jī)器回應(yīng)的SYN數(shù)據(jù)包,接收到SYN數(shù)據(jù)包的B機(jī)器(被C機(jī)器信任)開(kāi)始發(fā)送應(yīng)答連接建立的SYN/ACK數(shù)據(jù)包,這時(shí)C機(jī)器正在忙于響應(yīng)以前發(fā)送的SYN數(shù)據(jù)而無(wú)暇回應(yīng)B機(jī)器,而A機(jī)器的攻擊者預(yù)測(cè)出B機(jī)器包的序列號(hào)(現(xiàn)在的TCP序列號(hào)預(yù)測(cè)難度有所加大)假冒C機(jī)器向B機(jī)器發(fā)送應(yīng)答ACK這時(shí)攻擊者騙取B機(jī)器的信任,假冒C機(jī)器與B機(jī)器建立起TCP協(xié)議的對(duì)話連接。這個(gè)時(shí)候的C機(jī)器還是在響應(yīng)攻擊者A機(jī)器發(fā)送的SYN數(shù)據(jù)。
TCP協(xié)議棧的弱點(diǎn):TCP連接的資源消耗,其中包括:數(shù)據(jù)包信息、條件狀態(tài)、序列號(hào)等。通過(guò)故意不完成建立連接所需要的三次握手過(guò)程,造成連接一方的資源耗盡。
通過(guò)攻擊者有意的不完成建立連接所需要的三次握手的全過(guò)程,從而造成了C機(jī)器的資源耗盡。序列號(hào)的可預(yù)測(cè)性,目標(biāo)主機(jī)應(yīng)答連接請(qǐng)求時(shí)返回的SYN/ACK的序列號(hào)時(shí)可預(yù)測(cè)的。(早期TCP協(xié)議棧,具體的可以參見(jiàn)1981年出的關(guān)于TCP雛形的RFC793文檔)
TCP頭結(jié)構(gòu)
TCP協(xié)議頭最少20個(gè)字節(jié),包括以下的區(qū)域(由于翻譯不禁相同,文章中給出相應(yīng)的英文單詞):
TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是標(biāo)示報(bào)問(wèn)的返回地址。
TCP目的端口(Destination port):16位的目的端口域定義傳輸?shù)哪康?。這個(gè)端口指明報(bào)文接收計(jì)算機(jī)上的應(yīng)用程序地址接口。
TCP序列號(hào)(序列碼,Sequence Number):32位的序列號(hào)由接收端計(jì)算機(jī)使用,重新分段的報(bào)文成最初形式。當(dāng)SYN出現(xiàn),序列碼實(shí)際上是初始序列碼(ISN),而第一個(gè)數(shù)據(jù)字節(jié)是ISN+1。這個(gè)序列號(hào)(序列碼)是可以補(bǔ)償傳輸中的 不一致。
TCP應(yīng)答號(hào)(Acknowledgment Number):32位的序列號(hào)由接收端計(jì)算機(jī)使用,重組分段的報(bào)文成最初形式。,如果設(shè)置了ACK控制位,這個(gè)值表示一個(gè)準(zhǔn)備接收的包的序列碼。
數(shù)據(jù)偏移量(HLEN):4位包括TCP頭大小,指示何處數(shù)據(jù)開(kāi)始。
保留(Reserved):6位值域,這些位必須是0。為了將來(lái)定義新的用途所保留。
標(biāo)志(Code Bits):6位標(biāo)志域。表示為:緊急標(biāo)志、有意義的應(yīng)答標(biāo)志、推、重置連接標(biāo)志、同步序列號(hào)標(biāo)志、完成發(fā)送數(shù)據(jù)標(biāo)志。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN。
窗口(Window):16位,用來(lái)表示想收到的每個(gè)TCP數(shù)據(jù)段的大小。
校驗(yàn)位(Checksum):16位TCP頭。源機(jī)器基于數(shù)據(jù)內(nèi)容計(jì)算一個(gè)數(shù)值,收信息機(jī)要與源機(jī)器數(shù)值 結(jié)果完全一樣,從而證明數(shù)據(jù)的有效性。
優(yōu)先指針(緊急,Urgent Pointer):16位,指向后面是優(yōu)先數(shù)據(jù)的字節(jié),在URG標(biāo)志設(shè)置了時(shí)才有效。如果URG標(biāo)志沒(méi)有被設(shè)置,緊急域作為填充。加快處理標(biāo)示為緊急的數(shù)據(jù)段。
選項(xiàng)(Option):長(zhǎng)度不定,但長(zhǎng)度必須以字節(jié)。如果 沒(méi)有 選項(xiàng)就表示這個(gè)一字節(jié)的域等于0。
填充:不定長(zhǎng),填充的內(nèi)容必須為0,它是為了數(shù)學(xué)目的而存在。目的是確保空間的可預(yù)測(cè)性。保證包頭的結(jié)合和數(shù)據(jù)的開(kāi)始處偏移量能夠被32整除,一般額外的零以保證TCP頭是32位的整數(shù)倍。
標(biāo)志控制功能
URG:緊急標(biāo)志
緊急(The urgent pointer) 標(biāo)志有效。緊急標(biāo)志置位,
ACK:確認(rèn)標(biāo)志
確認(rèn)編號(hào)(Acknowledgement Number)欄有效。大多數(shù)情況下該標(biāo)志位是置位的。TCP報(bào)頭內(nèi)的確認(rèn)編號(hào)欄內(nèi)包含的確認(rèn)編號(hào)(w+1,F(xiàn)igure:1)為下一個(gè)預(yù)期的序列編號(hào),同時(shí)提示遠(yuǎn)端系統(tǒng)已經(jīng)成功接收所有數(shù)據(jù)。
PSH:推標(biāo)志
該標(biāo)志置位時(shí),接收端不將該數(shù)據(jù)進(jìn)行隊(duì)列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時(shí),該標(biāo)志總是置位的。
RST:復(fù)位標(biāo)志
復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的TCP連接。
SYN:同步標(biāo)志
同步序列編號(hào)(Synchronize Sequence Numbers)欄有效。該標(biāo)志僅在三次握手建立TCP連接時(shí)有效。它提示TCP連接的服務(wù)端檢查序列編號(hào),該序列編號(hào)為TCP連接初始端(一般是客戶端)的初始序列編號(hào)。在這里,可以把TCP序列編號(hào)看作是一個(gè)范圍從0到4,294,967,295的32位計(jì)數(shù)器。通過(guò)TCP連接交換的數(shù)據(jù)中每一個(gè)字節(jié)都經(jīng)過(guò)序列編號(hào)。在TCP報(bào)頭中的序列編號(hào)欄包括了TCP分段中第一個(gè)字節(jié)的序列編號(hào)。
FIN:結(jié)束標(biāo)志
帶有該標(biāo)志置位的數(shù)據(jù)包用來(lái)結(jié)束一個(gè)TCP回話,但對(duì)應(yīng)端口仍處于開(kāi)放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)。
服務(wù)端處于監(jiān)聽(tīng)狀態(tài),客戶端用于建立連接請(qǐng)求的數(shù)據(jù)包(IP packet)按照TCP/IP協(xié)議堆棧組合成為TCP處理的分段(segment)。
分析報(bào)頭信息: TCP層接收到相應(yīng)的TCP和IP報(bào)頭,將這些信息存儲(chǔ)到內(nèi)存中。
檢查TCP校驗(yàn)和(checksum):標(biāo)準(zhǔn)的校驗(yàn)和位于分段之中(Figure:2)。如果檢驗(yàn)失敗,不返回確認(rèn),該分段丟棄,并等待客戶端進(jìn)行重傳。
查找協(xié)議控制塊(PCB{}):TCP查找與該連接相關(guān)聯(lián)的協(xié)議控制塊。如果沒(méi)有找到,TCP將該分段丟棄并返回RST。(這就是TCP處理沒(méi)有端口監(jiān)聽(tīng)情況下的機(jī)制) 如果該協(xié)議控制塊存在,但狀態(tài)為關(guān)閉,服務(wù)端不調(diào)用connect()或listen()。該分段丟棄,但不返回RST。客戶端會(huì)嘗試重新建立連接請(qǐng)求。
建立新的socket:當(dāng)處于監(jiān)聽(tīng)狀態(tài)的socket收到該分段時(shí),會(huì)建立一個(gè)子socket,同時(shí)還有socket{},tcpcb{}和pub{}建立。這時(shí)如果有錯(cuò)誤發(fā)生,會(huì)通過(guò)標(biāo)志位來(lái)拆除相應(yīng)的socket和釋放內(nèi)存,TCP連接失敗。如果緩存隊(duì)列處于填滿狀態(tài),TCP認(rèn)為有錯(cuò)誤發(fā)生,所有的后續(xù)連接請(qǐng)求會(huì)被拒絕。這里可以看出SYN Flood攻擊是如何起作用的。
丟棄:如果該分段中的標(biāo)志為RST或ACK,或者沒(méi)有SYN標(biāo)志,則該分段丟棄。并釋放相應(yīng)的內(nèi)存。
發(fā)送序列變量
SND.UNA : 發(fā)送未確認(rèn)
SND.NXT : 發(fā)送下一個(gè)
SND.WND : 發(fā)送窗口
SND.UP : 發(fā)送優(yōu)先指針
SND.WL1 : 用于最后窗口更新的段序列號(hào)
SND.WL2 : 用于最后窗口更新的段確認(rèn)號(hào)
ISS : 初始發(fā)送序列號(hào)
接收序列號(hào)
RCV.NXT : 接收下一個(gè)
RCV.WND : 接收下一個(gè)
RCV.UP : 接收優(yōu)先指針
IRS : 初始接收序列號(hào)
當(dāng)前段變量
SEG.SEQ : 段序列號(hào)
SEG.ACK : 段確認(rèn)標(biāo)記
SEG.LEN : 段長(zhǎng)
SEG.WND : 段窗口
SEG.UP : 段緊急指針
SEG.PRC : 段優(yōu)先級(jí)
CLOSED表示沒(méi)有連接,各個(gè)狀態(tài)的意義如下:
LISTEN : 監(jiān)聽(tīng)來(lái)自遠(yuǎn)方TCP端口的連接請(qǐng)求。
SYN-SENT : 在發(fā)送連接請(qǐng)求后等待匹配的連接請(qǐng)求。
SYN-RECEIVED : 在收到和發(fā)送一個(gè)連接請(qǐng)求后等待對(duì)連接請(qǐng)求的確認(rèn)。
ESTABLISHED : 代表一個(gè)打開(kāi)的連接,數(shù)據(jù)可以傳送給用戶。
FIN-WAIT-1 : 等待遠(yuǎn)程TCP的連接中斷請(qǐng)求,或先前的連接中斷請(qǐng)求的確認(rèn)。
FIN-WAIT-2 : 從遠(yuǎn)程TCP等待連接中斷請(qǐng)求。
CLOSE-WAIT : 等待從本地用戶發(fā)來(lái)的連接中斷請(qǐng)求。
CLOSING : 等待遠(yuǎn)程TCP對(duì)連接中斷的確認(rèn)。
LAST-ACK : 等待原來(lái)發(fā)向遠(yuǎn)程TCP的連接中斷請(qǐng)求的確認(rèn)。
TIME-WAIT : 等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請(qǐng)求的確認(rèn)。
CLOSED : 沒(méi)有任何連接狀態(tài)。
TCP連接過(guò)程是狀態(tài)的轉(zhuǎn)換,促使發(fā)生狀態(tài)轉(zhuǎn)換的是用戶調(diào)用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS。傳送過(guò)來(lái)的數(shù)據(jù)段,特別那些包括以下標(biāo)記的數(shù)據(jù)段SYN,ACK,RST和FIN。還有超時(shí),上面所說(shuō)的都會(huì)時(shí)TCP狀態(tài)發(fā)生變化。
序列號(hào)
請(qǐng)注意,我們?cè)赥CP連接中發(fā)送的字節(jié)都有一個(gè)序列號(hào)。因?yàn)榫幜颂?hào),所以可以確認(rèn)它們的收到。對(duì)序列號(hào)的確認(rèn)是累積性的。TCP必須進(jìn)行的序列號(hào)比較操作種類包括以下幾種:
?、?zèng)Q定一些發(fā)送了的但未確認(rèn)的序列號(hào)。
?、跊Q定所有的序列號(hào)都已經(jīng)收到了。
?、蹧Q定下一個(gè)段中應(yīng)該包括的序列號(hào)。
對(duì)于發(fā)送的數(shù)據(jù)TCP要接收確認(rèn),確認(rèn)時(shí)必須進(jìn)行的:
SND.UNA = 最老的確認(rèn)了的序列號(hào)。
SND.NXT = 下一個(gè)要發(fā)送的序列號(hào)。
SEG.ACK = 接收TCP的確認(rèn),接收TCP期待的下一個(gè)序列號(hào)。
SEG.SEQ = 一個(gè)數(shù)據(jù)段的第一個(gè)序列號(hào)。
SEG.LEN = 數(shù)據(jù)段中包括的字節(jié)數(shù)。
SEG.SEQ+SEG.LEN-1 = 數(shù)據(jù)段的最后一個(gè)序列號(hào)。
如果一個(gè)數(shù)據(jù)段的序列號(hào)小于等于確認(rèn)號(hào)的值,那么整個(gè)數(shù)據(jù)段就被確認(rèn)了。而在接收數(shù)據(jù)時(shí)下面的比較操作是必須的:
RCV.NXT = 期待的序列號(hào)和接收窗口的最低沿。
RCV.NXT+RCV.WND:1 = 最后一個(gè)序列號(hào)和接收窗口的最高沿。
SEG.SEQ = 接收到的第一個(gè)序列號(hào)。
SEG.SEQ+SEG.LEN:1 = 接收到的最后一個(gè)序列號(hào).
文章錄入:csh 責(zé)任編輯:csh- 基于python模擬TCP3次握手連接及發(fā)送數(shù)據(jù)
- TCP/IP協(xié)議中三次握手四次揮手的原理及流程分析
- TCP的三次握手與四次揮手詳細(xì)介紹
- Wireshark基本介紹和學(xué)習(xí)TCP三次握手
- TCP socket SYN隊(duì)列和Accept隊(duì)列區(qū)別原理解析
- Java基于TCP協(xié)議socket網(wǎng)絡(luò)編程的文件傳送的實(shí)現(xiàn)
- TCP性能調(diào)優(yōu)實(shí)現(xiàn)原理及過(guò)程解析
- Java 基于tcp協(xié)議實(shí)現(xiàn)文件上傳
- TCP第三次握手傳數(shù)據(jù)過(guò)程圖解
相關(guān)文章
撥號(hào)網(wǎng)絡(luò)的簡(jiǎn)單知識(shí)
撥號(hào)網(wǎng)絡(luò)的簡(jiǎn)單知識(shí)...2007-09-09從交換機(jī)原理看網(wǎng)絡(luò)廣播風(fēng)暴的幾種原因
從交換機(jī)原理看網(wǎng)絡(luò)廣播風(fēng)暴的幾種原因...2007-09-09如何提高城域網(wǎng)路由器網(wǎng)絡(luò)層的可靠性?
如何提高城域網(wǎng)路由器網(wǎng)絡(luò)層的可靠性?...2007-09-09總結(jié)Cisco設(shè)備做流量監(jiān)控的方法
總結(jié)Cisco設(shè)備做流量監(jiān)控的方法...2007-09-09