TCP協(xié)議的通訊方式
一、TCP三次握手
傳輸控制協(xié)議(Transport Control Protocol)是一種面向連接的,可靠的傳輸層協(xié)議。面向連接是指一次正常的TCP傳輸需要通過在TCP客戶端和TCP服務(wù)端建立特定的虛電路連接來完成,該過程通常被稱為“三次握手”??煽啃钥梢酝ㄟ^很多種方法來提供保證,在這里我們關(guān)心的是數(shù)據(jù)序列和確認(rèn)。TCP通過數(shù)據(jù)分段(Segment)中的序列號(hào)保證所有傳輸?shù)臄?shù)據(jù)可以在遠(yuǎn)端按照正常的次序進(jìn)行重組,而且通過確認(rèn)保證數(shù)據(jù)傳輸?shù)耐暾?。要通過TCP傳輸數(shù)據(jù),必須在兩端主機(jī)之間建立連接。舉例說明,TCP客戶端需要和TCP服務(wù)端建立連接,過程如下所示:
在第一步中,客戶端向服務(wù)端提出連接請(qǐng)求。這時(shí)TCP SYN標(biāo)志置位??蛻舳烁嬖V服務(wù)端序列號(hào)區(qū)域合法,需要檢查??蛻舳嗽赥CP報(bào)頭的序列號(hào)區(qū)中插入自己的ISN。服務(wù)端收到該TCP分段后,在第二步以自己的ISN回應(yīng)(SYN標(biāo)志置位),同時(shí)確認(rèn)收到客戶端的第一個(gè)TCP分段(ACK標(biāo)志置位)。在第三步中,客戶端確認(rèn)收到服務(wù)端的ISN(ACK標(biāo)志置位)。到此為止建立完整的TCP連接,開始全雙工模式的數(shù)據(jù)傳輸過程。
二、TCP標(biāo)志
這里有必要介紹一下TCP分段中的標(biāo)志(Flag)置位情況。如下圖所示。
*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ù)器。通過TCP連接交換的數(shù)據(jù)中每一個(gè)字節(jié)都經(jīng)過序列編號(hào)。在TCP報(bào)頭中的序列編號(hào)欄包括了TCP分段中第一個(gè)字節(jié)的序列編號(hà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ù)。
*RST:復(fù)位標(biāo)志
復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的TCP連接。
*URG:緊急標(biāo)志
緊急(The urgent pointer) 標(biāo)志有效。緊急標(biāo)志置位,
*PSH:推標(biāo)志
該標(biāo)志置位時(shí),接收端不將該數(shù)據(jù)進(jìn)行隊(duì)列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時(shí),該標(biāo)志總是置位的。
*FIN:結(jié)束標(biāo)志
帶有該標(biāo)志置位的數(shù)據(jù)包用來結(jié)束一個(gè)TCP回話,但對(duì)應(yīng)端口仍處于開放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)。#p#
三、TCP端口
為了能夠支持同時(shí)發(fā)生的并行訪問請(qǐng)求,TCP提供一種叫做“端口”的用戶接口。端口是操作系統(tǒng)核心用來識(shí)別不同的網(wǎng)絡(luò)回話過程。這是一個(gè)嚴(yán)格的傳輸層定義。通過TCP端口和IP地址的配合使用,可以提供到達(dá)終端的通訊手段。實(shí)際上,在任一時(shí)刻的互聯(lián)網(wǎng)絡(luò)連接可以由4個(gè)數(shù)字進(jìn)行描述: 來源IP地址和來源端口,目的IP地址和目的端口。位于不同系統(tǒng)平臺(tái),用來提供服務(wù)的一端通過標(biāo)準(zhǔn)的端口提供相應(yīng)服務(wù)。舉例來說,標(biāo)準(zhǔn)的TELNET守護(hù)進(jìn)程(telnet daemon)通過監(jiān)聽TCP 23端口,準(zhǔn)備接收用戶端的連接請(qǐng)求。
四、TCP緩存(TCP Backlog)
通常情況下,操作系統(tǒng)會(huì)使用一塊限定的內(nèi)存來處理TCP連接請(qǐng)求。每當(dāng)用戶端發(fā)送的SYN標(biāo)志置位連接請(qǐng)求到服務(wù)端的一個(gè)合法端口(提供TCP服務(wù)的一端監(jiān)聽該端口)時(shí),處理所有連接請(qǐng)求的內(nèi)存使用量必須進(jìn)行限定。如果不進(jìn)行限定,系統(tǒng)會(huì)因處理大量的TCP連接請(qǐng)求而耗盡內(nèi)存,這在某種程度上可以說是一種簡單的DoS攻擊。這塊經(jīng)過限定的,用于處理TCP連接的內(nèi)存稱為TCP緩存(TCP Backlog),它實(shí)際上是用于處理進(jìn)站(inbound)連接請(qǐng)求的一個(gè)隊(duì)列。該隊(duì)列保存那些處于半開放(half-open)狀態(tài)的TCP連接項(xiàng)目,和已建立完整連接但仍未由應(yīng)用程序通過accept()調(diào)用提取的項(xiàng)目。如果這個(gè)緩存隊(duì)列被填滿,除非可以及時(shí)處理隊(duì)列中的項(xiàng)目,否則任何其它新的TCP連接請(qǐng)求會(huì)被丟棄。
一般情況下,該緩存隊(duì)列的容量很小。原因很簡單,在正常的情況下TCP可以很好的處理連接請(qǐng)求。如果當(dāng)緩存隊(duì)列填滿的時(shí)候新的客戶端連接請(qǐng)求被丟棄,客戶端只需要簡單的重新發(fā)送連接請(qǐng)求,服務(wù)端有時(shí)間清空緩存隊(duì)列以相應(yīng)新的連接請(qǐng)求。
在現(xiàn)實(shí)環(huán)境中,不同操作系統(tǒng)支持TCP緩沖隊(duì)列有所不同。在BSD結(jié)構(gòu)的系統(tǒng)中,如下所示:
五、TCP進(jìn)站(Inbound)處理過程
為了更好的講述TCP SYN Flood的攻擊過程,我們先來介紹一下正常情況下,TCP進(jìn)站處理的過程。
服務(wù)端處于監(jiān)聽狀態(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é)議控制塊。如果沒有找到,TCP將該分段丟棄并返回RST。(這就是TCP處理沒有端口監(jiān)聽情況下的機(jī)制) 如果該協(xié)議控制塊存在,但狀態(tài)為關(guān)閉,服務(wù)端不調(diào)用connect()或listen()。該分段丟棄,但不返回RST??蛻舳藭?huì)嘗試重新建立連接請(qǐng)求。
建立新的socket:當(dāng)處于監(jiān)聽狀態(tài)的socket收到該分段時(shí),會(huì)建立一個(gè)子socket,同時(shí)還有socket{},tcpcb{}和pcb{}建立。這時(shí)如果有錯(cuò)誤發(fā)生,會(huì)通過標(biāo)志位來拆除相應(yīng)的socket和釋放內(nèi)存,TCP連接失敗。如果緩存隊(duì)列處于填滿狀態(tài),TCP認(rèn)為有錯(cuò)誤發(fā)生,所有的后續(xù)連接請(qǐng)求會(huì)被拒絕。這里可以看出SYN Flood攻擊是如何起作用的。
丟棄:如果該分段中的標(biāo)志為RST或ACK,或者沒有SYN標(biāo)志,則該分段丟棄。并釋放相應(yīng)的內(nèi)存。
【編輯推薦】