TCP协议三次握手连接四次握手断开和DOS攻击
生活随笔
收集整理的這篇文章主要介紹了
TCP协议三次握手连接四次握手断开和DOS攻击
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載:
http://hi.baidu.com/xgdcisco/blog/item/60da65f70fd8145d342acc28.html;
http://blog.csdn.net/lostyears/article/details/7104349
TCP連接的狀態(tài)圖
TCP建立連接的三次握手過程,以及關(guān)閉連接的四次握手過程
貼一個(gè)telnet建立連接,斷開連接的使用wireshark捕獲的packet截圖。
1、建立連接協(xié)議(三次握手)
(1)客戶 端發(fā)送一個(gè)帶SYN標(biāo)志的TCP報(bào)文到服務(wù)器。這是三次握手過程中的報(bào)文1。
(2) 服務(wù)器端回應(yīng)客戶端的,這是三次握手中的第2個(gè)報(bào)文,這個(gè)報(bào)文同時(shí)帶ACK標(biāo)志和SYN標(biāo)志。因此它表示對(duì)剛才客戶端SYN報(bào)文的回應(yīng);同時(shí)又標(biāo)志SYN給客戶端,詢問客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)通 訊。
(3) 客戶必須再次回應(yīng)服務(wù)段一個(gè)ACK報(bào)文,這是報(bào)文段3。
2、連接終止協(xié)議(四次握手)
由于TCP連 接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
(1) TCP客 戶端發(fā)送一個(gè)FIN,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報(bào)文段4)。
(2) 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。
(3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端(報(bào)文段6)。
(4) 客戶段發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)。
CLOSED: 這個(gè)沒什么好說的了,表示初始狀態(tài)。
LISTEN: 這個(gè)也是非常容易理解的一個(gè)狀態(tài),表示服務(wù)器端的某個(gè)SOCKET處 于監(jiān)聽狀態(tài),可以接受連接了。
SYN_RCVD: 這個(gè)狀態(tài)表示接受到了SYN報(bào)文,在正常情況下,這個(gè)狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時(shí)的三次握手會(huì)話過程中的一個(gè)中間狀態(tài),很短暫,基本上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個(gè)客戶端測試程序,故意將三次TCP握手過程中最后一個(gè)ACK報(bào)文不予發(fā)送。因此這種狀態(tài)時(shí),當(dāng)收到客戶端的ACK報(bào)文 后,它會(huì)進(jìn)入到ESTABLISHED狀態(tài)。
SYN_SENT: 這個(gè)狀態(tài)與SYN_RCVD遙想呼應(yīng),當(dāng)客戶端SOCKET執(zhí)行CONNECT連接時(shí),它首先發(fā)送SYN報(bào)文,因此也隨即它會(huì)進(jìn)入到了SYN_SENT狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個(gè)報(bào)文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報(bào)文。
ESTABLISHED:這個(gè)容易理解了,表示連接已經(jīng)建立了。
FIN_WAIT_1: 這個(gè)狀態(tài)要好好解釋一下,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí),它想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài)。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2狀態(tài),當(dāng)然在實(shí)際的正常情況下,無論對(duì)方何種情況下,都應(yīng)該馬上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時(shí)常常可以用netstat看到。
FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài),實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對(duì)方,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你,稍后再關(guān)閉連接。
TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)。
CLOSING: 這種狀態(tài)比較特殊,實(shí)際情況中應(yīng)該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當(dāng)你發(fā)送FIN報(bào)文后,按理來說是應(yīng)該先收到(或同時(shí)收到)對(duì)方的ACK報(bào)文,再收到對(duì)方的FIN報(bào)文。但是CLOSING狀態(tài)表示你發(fā)送FIN報(bào)文后,并沒有收到對(duì)方的ACK報(bào)文,反而卻也收到了對(duì)方的FIN報(bào)文。什么情況下會(huì)出現(xiàn)此種情況呢?其實(shí)細(xì)想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時(shí)close一個(gè)SOCKET的話,那么就出現(xiàn)了雙方同時(shí)發(fā)送FIN報(bào)文的情況,也即會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。
CLOSE_WAIT: 這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己,你系統(tǒng)毫無疑問地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來呢,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方,如果沒有的話,那么你也就可以close這個(gè)SOCKET,發(fā)送FIN報(bào)文給對(duì)方,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。
LAST_ACK: 這個(gè)狀態(tài)還是比較容易好理解的,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文。當(dāng)收到ACK報(bào)文后,也即可以進(jìn)入到CLOSED可用狀態(tài)了。
補(bǔ)充:
a. 默認(rèn)情況下(不改變socket選項(xiàng)),當(dāng)你調(diào)用close( or closesocket,以下說close不再重復(fù))時(shí),如果發(fā)送緩沖中還有數(shù)據(jù),TCP會(huì)繼續(xù)把數(shù)據(jù)發(fā)送完。
b. 發(fā)送了FIN只是表示這端不能繼續(xù)發(fā)送數(shù)據(jù)(應(yīng)用層不能再調(diào)用send發(fā)送),但是還可以接收數(shù)據(jù)。
c. 應(yīng)用層如何知道對(duì)端關(guān)閉?通常,在最簡單的阻塞模型中,當(dāng)你調(diào)用recv時(shí),如果返回0,則表示對(duì)端關(guān)閉。在這個(gè)時(shí)候通常的做法就是也調(diào)用close,那么TCP層就發(fā)送FIN,繼續(xù)完成四次握手。如果你不調(diào)用close,那么對(duì)端就會(huì)處于FIN_WAIT_2狀態(tài),而本端則會(huì)處于CLOSE_WAIT狀態(tài)。這個(gè)可以寫代碼試試。
d. 在很多時(shí)候,TCP連接的斷開都會(huì)由TCP層自動(dòng)進(jìn)行,例如你CTRL+C終止你的程序,TCP連接依然會(huì)正常關(guān)閉,你可以寫代碼試試。
1、 為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報(bào)文的建連請(qǐng)求后,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一個(gè)報(bào)文里來發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文通知時(shí),它僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以未必會(huì)馬上會(huì)關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對(duì)方之后,再發(fā)送FIN報(bào)文給對(duì)方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報(bào)文和FIN報(bào)文多數(shù)情況下都是分開發(fā)送的。
2、 為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)?
什么是2MSL?MSL即Maximum Segment Lifetime,也就是報(bào)文最大生存時(shí)間,引用《TCP/IP詳解》中的話:“它(MSL)是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時(shí)間。”那么,2MSL也就是這個(gè)時(shí)間的2倍,當(dāng)TCP連接完成四個(gè)報(bào)文段的交換時(shí),主動(dòng)關(guān)閉的一方將繼續(xù)等待一定時(shí)間(2-4分鐘),即使兩端的應(yīng)用程序結(jié)束。例如在上面的telnet程序客戶端關(guān)閉后,使用netstat查看的結(jié)果:
C:\>netstat -na | find "172.29.21.25"
TCP 172.29.132.60:2795 172.29.21.25:23 TIME_WAIT
為什么需要這個(gè)2MSL呢,
第一,雖然雙方都同意關(guān)閉連接了,而且握手的4個(gè)報(bào)文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到ESTABLISH狀態(tài)那樣);但是因?yàn)槲覀儽仨氁傧刖W(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報(bào)文會(huì)一定被對(duì)方收到,因此對(duì)方處于LAST_ACK狀態(tài)下的SOCKET可能會(huì)因?yàn)槌瑫r(shí)未收到ACK報(bào)文,而重發(fā)FIN報(bào)文,所以這個(gè)TIME_WAIT狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報(bào)文。
第二,報(bào)文可能會(huì)被混淆,意思是說,其他時(shí)候的連接可能會(huì)被當(dāng)作本次的連接。直接引用《The TCP/IP Guide》的說法:The second is to provide a “buffering period” between the end of this connection and any subsequent ones. If not for this period, it is possible that packets from different connections could be mixed, creating confusion.
當(dāng)某個(gè)連接的一端處于TIME_WAIT狀態(tài)時(shí),該連接將不能再被使用。事實(shí)上,對(duì)于我們比較有現(xiàn)實(shí)意義的是,這個(gè)端口將不能再被使用。某個(gè)端口處于TIME_WAIT狀態(tài)(其實(shí)應(yīng)該是這個(gè)連接)時(shí),這意味著這個(gè)TCP連接并沒有斷開(完全斷開),那么,如果你bind這個(gè)端口,就會(huì)失敗。對(duì)于服務(wù)器而言,如果服務(wù)器突然crash掉了,那么它將無法在2MSL內(nèi)重新啟動(dòng),因?yàn)閎ind會(huì)失敗。解決這個(gè)問題的一個(gè)方法就是設(shè)置socket的SO_REUSEADDR選項(xiàng)。這個(gè)選項(xiàng)意味著你可以重用一個(gè)地址。
當(dāng)建立一個(gè)TCP連接時(shí),服務(wù)器端會(huì)繼續(xù)用原有端口監(jiān)聽,同時(shí)用這個(gè)端口與客戶端通信。而客戶端默認(rèn)情況下會(huì)使用一個(gè)隨機(jī)端口與服務(wù)器端的監(jiān)聽端口通信。有時(shí)候,為了服務(wù)器端的安全性,我們需要對(duì)客戶端進(jìn)行驗(yàn)證,即限定某個(gè)IP某個(gè)特定端口的客戶端。客戶端可以使用bind來使用特定的端口。對(duì)于服務(wù)器端,當(dāng)設(shè)置了SO_REUSEADDR選項(xiàng)時(shí),它可以在2MSL內(nèi)啟動(dòng)并listen成功。但是對(duì)于客戶端,當(dāng)使用bind并設(shè)置SO_REUSEADDR時(shí),如果在2MSL內(nèi)啟動(dòng),雖然bind會(huì)成功,但是在windows平臺(tái)上connect會(huì)失敗。而在linux上則不存在這個(gè)問題。(我的實(shí)驗(yàn)平臺(tái):winxp, ubuntu7.10)
要解決windows平臺(tái)的這個(gè)問題,可以設(shè)置SO_LINGER選項(xiàng)。SO_LINGER選項(xiàng)決定調(diào)用close時(shí)TCP的行為。SO_LINGER涉及到linger結(jié)構(gòu)體,如果設(shè)置結(jié)構(gòu)體中l(wèi)_onoff為非0,l_linger為0,那么調(diào)用close時(shí)TCP連接會(huì)立刻斷開,TCP不會(huì)將發(fā)送緩沖中未發(fā)送的數(shù)據(jù)發(fā)送,而是立即發(fā)送一個(gè)RST報(bào)文給對(duì)方,這個(gè)時(shí)候TCP連接(關(guān)閉時(shí))就不會(huì)進(jìn)入TIME_WAIT狀態(tài)。如你所見,這樣做雖然解決了問題,但是并不安全。通過以上方式設(shè)置SO_LINGER狀態(tài),等同于設(shè)置SO_DONTLINGER狀態(tài)。
當(dāng)TCP連接發(fā)生一些物理上的意外情況時(shí),例如網(wǎng)線斷開,linux上的TCP實(shí)現(xiàn)會(huì)依然認(rèn)為該連接有效,而windows則會(huì)在一定時(shí)間后返回錯(cuò)誤信息。這似乎可以通過設(shè)置SO_KEEPALIVE選項(xiàng)來解決,不過不知道這個(gè)選項(xiàng)是否對(duì)于所有平臺(tái)都有效。
3. 為什么不能用兩次握手進(jìn)行連接?
我們知道,3次握手完成兩個(gè)重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準(zhǔn)備工作(雙方都知道彼此已準(zhǔn)備好),也要允許雙方就初始序列號(hào)進(jìn)行協(xié)商,這個(gè)序列號(hào)在握手過程中被發(fā)送和確認(rèn)。
現(xiàn)在把三次握手改成僅需要兩次握手,死鎖是可能發(fā)生的。作為例子,考慮計(jì)算機(jī)S和C之間的通信,假定C給S發(fā)送一個(gè)連接請(qǐng)求分組,S收到了這個(gè)分組,并發(fā)送了確認(rèn)應(yīng)答分組。按照兩次握手的協(xié)定,S認(rèn)為連接已經(jīng)成功地建立了,可以開始發(fā)送數(shù)據(jù)分組。可是,C在S的應(yīng)答分組在傳輸中被丟失的情況下,將不知道S是否已準(zhǔn)備好,不知道S建立什么樣的序列號(hào),C甚至懷疑S是否收到自己的連接請(qǐng)求分組。在這種情況下,C認(rèn)為連接還未建立成功,將忽略S發(fā)來的任何數(shù)據(jù)分組,只等待連接確認(rèn)應(yīng)答分組。而S在發(fā)出的分組超時(shí)后,重復(fù)發(fā)送同樣的分組。這樣就形成了死鎖。
DoS攻擊
DoS攻擊、DDoS攻擊和DRDoS攻擊相信大家已經(jīng)早有耳聞了吧!DoS是Denial of Service的簡寫就是拒絕服務(wù),而DDoS就是Distributed Denial of Service的簡寫就是分布式拒絕服務(wù),而DRDoS就是Distributed Reflection Denial of Service的簡寫,這是分布反射式拒絕服務(wù)的意思。
不過這3中攻擊方法最厲害的還是DDoS,那個(gè)DRDoS攻擊雖然是新近出的一種攻擊方法,但它只是DDoS攻擊的變形,它的唯一不同就是不用占領(lǐng)大量的“肉雞”。這三種方法都是利用TCP三次握手的漏洞進(jìn)行攻擊的,所以對(duì)它們的防御辦法都是差不多的。
DoS攻擊是最早出現(xiàn)的,它的攻擊方法說白了就是單挑,是比誰的機(jī)器性能好、速度快。但是現(xiàn)在的科技飛速發(fā)展,一般的網(wǎng)站主機(jī)都有十幾臺(tái)主機(jī),而且各個(gè)主機(jī)的處理能力、內(nèi)存大小和網(wǎng)絡(luò)速度都有飛速的發(fā)展,有的網(wǎng)絡(luò)帶寬甚至超過了千兆級(jí)別。這樣我們的一對(duì)一單挑式攻擊就沒有什么作用了,搞不好自己的機(jī)子就會(huì)死掉。舉個(gè)這樣的攻擊例子,假如你的機(jī)器每秒能夠發(fā)送10個(gè)攻擊用的數(shù)據(jù)包,而被你攻擊的機(jī)器(性能、網(wǎng)絡(luò)帶寬都是頂尖的)每秒能夠接受并處理100攻擊數(shù)據(jù)包,那樣的話,你的攻擊就什么用處都沒有了,而且非常有死機(jī)的可能。要知道,你若是發(fā)送這種1Vs1的攻擊,你的機(jī)器的CPU占用率是90%以上的,你的機(jī)器要是配置不夠高的話,那你就死定了。
不過,科技在發(fā)展,黑客的技術(shù)也在發(fā)展。正所謂道高一尺,魔高一仗。經(jīng)過無數(shù)次當(dāng)機(jī),黑客們終于又找到一種新的DoS攻擊方法,這就是DDoS攻擊。它的原理說白了就是群毆,用好多的機(jī)器對(duì)目標(biāo)機(jī)器一起發(fā)動(dòng) DoS攻擊,但這不是很多黑客一起參與的,這種攻擊只是由一名黑客來操作的。這名黑客不是擁有很多機(jī)器,他是通過他的機(jī)器在網(wǎng)絡(luò)上占領(lǐng)很多的“肉雞”,并且控制這些“肉雞”來發(fā)動(dòng)DDoS攻擊,要不然怎么叫做分布式呢。還是剛才的那個(gè)例子,你的機(jī)器每秒能發(fā)送10攻擊數(shù)據(jù)包,而被攻擊的機(jī)器每秒能夠接受100的數(shù)據(jù)包,這樣你的攻擊肯定不會(huì)起作用,而你再用10臺(tái)或更多的機(jī)器來對(duì)被攻擊目標(biāo)的機(jī)器進(jìn)行攻擊的話,嘿嘿!結(jié)果我就不說了。
DRDoS分布反射式拒絕服務(wù)攻擊這是DDoS攻擊的變形,它與DDoS的不同之處就是DrDoS不需要在攻擊之前占領(lǐng)大量的“肉雞”。它的攻擊原理和Smurf攻擊原理相近,不過DRDoS是可以在廣域網(wǎng)上進(jìn)行的,而Smurf攻擊是在局域網(wǎng)進(jìn)行的。它的作用原理是基于廣播地址與回應(yīng)請(qǐng)求的。一臺(tái)計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送一些特殊的數(shù)據(jù)包如ping請(qǐng)求時(shí),會(huì)接到它的回應(yīng);如果向本網(wǎng)絡(luò)的廣播地址發(fā)送請(qǐng)求包,實(shí)際上會(huì)到達(dá)網(wǎng)絡(luò)上所有的計(jì)算機(jī),這時(shí)就會(huì)得到所有計(jì)算機(jī)的回應(yīng)。這些回應(yīng)是需要被接收的計(jì)算機(jī)處理的,每處理一個(gè)就要占用一份系統(tǒng)資源,如果同時(shí)接到網(wǎng)絡(luò)上所有計(jì)算機(jī)的回應(yīng),接收方的系統(tǒng)是有可能吃不消的,就象遭到了DDoS攻擊一樣。不過是沒有人笨到自己攻擊自己,不過這種方法被黑客加以改進(jìn)就具有很大的威力了。黑客向廣播地址發(fā)送請(qǐng)求包,所有的計(jì)算機(jī)得到請(qǐng)求后,卻不會(huì)把回應(yīng)發(fā)到黑客那里,而是發(fā)到被攻擊主機(jī)。這是因?yàn)楹诳兔俺淞吮还糁鳈C(jī)。黑客發(fā)送請(qǐng)求包所用的軟件是可以偽造源地址的,接到偽造數(shù)據(jù)包的主機(jī)會(huì)根據(jù)源地址把回應(yīng)發(fā)出去,這當(dāng)然就是被攻擊主機(jī)的地址。黑客同時(shí)還會(huì)把發(fā)送請(qǐng)求包的時(shí)間間隔減小,這樣在短時(shí)間能發(fā)出大量的請(qǐng)求包,使被攻擊主機(jī)接到從被欺騙計(jì)算機(jī)那里傳來的洪水般的回應(yīng),就像遭到了DDoS攻擊導(dǎo)致系統(tǒng)崩潰。駭客借助了網(wǎng)絡(luò)中所有計(jì)算機(jī)來攻擊受害者,而不需要事先去占領(lǐng)這些被欺騙的主機(jī),這就是Smurf攻擊。而DRDoS攻擊正是這個(gè)原理,黑客同樣利用特殊的發(fā)包工具,首先把偽造了源地址的SYN連接請(qǐng)求包發(fā)送到那些被欺騙的計(jì)算機(jī)上,根據(jù)TCP三次握手的規(guī)則,這些計(jì)算機(jī)會(huì)向源IP發(fā)出SYN+ACK或RST包來響應(yīng)這個(gè)請(qǐng)求。同Smurf攻擊一樣,黑客所發(fā)送的請(qǐng)求包的源IP地址是被攻擊主機(jī)的地址,這樣受欺騙的主機(jī)就都會(huì)把回應(yīng)發(fā)到被攻擊主機(jī)處,造成被攻擊主機(jī)忙于處理這些回應(yīng)而癱瘓。
解釋:
SYN:(Synchronize sequence numbers)用來建立連接,在連接請(qǐng)求中,SYN=1,ACK=0,連接響應(yīng)時(shí),SYN=1,ACK=1。即,SYN和ACK來區(qū)分Connection Request和Connection Accepted。
RST:(Reset the connection)用于復(fù)位因某種原因引起出現(xiàn)的錯(cuò)誤連接,也用來拒絕非法數(shù)據(jù)和請(qǐng)求。如果接收到RST位時(shí)候,通常發(fā)生了某些錯(cuò)誤。
ACK:(Acknowledgment field significant)置1時(shí)表示確認(rèn)號(hào)(Acknowledgment Number)為合法,為0的時(shí)候表示數(shù)據(jù)段不包含確認(rèn)信息,確認(rèn)號(hào)被忽略。
設(shè)我們要準(zhǔn)備建立連接,服務(wù)器正處于正常的接聽狀態(tài)。
第一步:我們也就是客戶端發(fā)送一個(gè)帶SYN位的請(qǐng)求,向服務(wù)器表示需要連接,假設(shè)請(qǐng)求包的序列號(hào)為10,那么則為:SYN=10,ACK=0,然后等待服務(wù)器的回應(yīng)。
第二步:服務(wù)器接收到這樣的請(qǐng)求包后,查看是否在接聽的是指定的端口,如果不是就發(fā)送RST=1回應(yīng),拒絕建立連接。如果接收請(qǐng)求包,那么服務(wù)器發(fā)送確認(rèn)回應(yīng),SYN為服務(wù)器的一個(gè)內(nèi)碼,假設(shè)為100,ACK位則是客戶端的請(qǐng)求序號(hào)加1,本例中發(fā)送的數(shù)據(jù)是:SYN=100,ACK=11,用這樣的數(shù)據(jù)回應(yīng)給我們。向我們表示,服務(wù)器連接已經(jīng)準(zhǔn)備好了,等待我們的確認(rèn)。這時(shí)我們接收到回應(yīng)后,分析得到的信息,準(zhǔn)備發(fā)送確認(rèn)連接信號(hào)到服務(wù)器。
第三步:我們發(fā)送確認(rèn)建立連接的信息給服務(wù)器。確認(rèn)信息的SYN位是服務(wù)器發(fā)送的ACK位,ACK位是服務(wù)器發(fā)送的SYN位加1。即:SYN=11,ACK=101。
這樣我們的連接就建立起來了。
DDoS究竟如何攻擊?目前最流行也是最好用的攻擊方法就是使用SYN-Flood進(jìn)行攻擊,SYN-Flood也就是SYN洪水攻擊。SYN-Flood不會(huì)完成TCP三次握手的第三步,也就是不發(fā)送確認(rèn)連接的信息給服務(wù)器。這樣,服務(wù)器無法完成第三次握手,但服務(wù)器不會(huì)立即放棄,服務(wù)器會(huì)不停的重試并等待一定的時(shí)間后放棄這個(gè)未完成的連接,這段時(shí)間叫做SYN timeout,這段時(shí)間大約30秒-2分鐘左右。若是一個(gè)用戶在連接時(shí)出現(xiàn)問題導(dǎo)致服務(wù)器的一個(gè)線程等待1分鐘并不是什么大不了的問題,但是若有人用特殊的軟件大量模擬這種情況,那后果就可想而知了。一個(gè)服務(wù)器若是處理這些大量的半連接信息而消耗大量的系統(tǒng)資源和網(wǎng)絡(luò)帶寬,這樣服務(wù)器就不會(huì)再有空余去處理普通用戶的正常請(qǐng)求(因?yàn)榭蛻舻恼U?qǐng)求比率很小)。這樣這個(gè)服務(wù)器就無法工作了,這種攻擊就叫做:SYN-Flood攻擊。
到目前為止,進(jìn)行DDoS攻擊的防御還是比較困難的。首先,這種攻擊的特點(diǎn)是它利用了TCP/IP協(xié)議的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻擊。不過這不等于我們就沒有辦法阻擋DDoS攻擊,我們可以盡力來減少DDoS的攻擊。下面就是一些防御方法:
1.確保服務(wù)器的系統(tǒng)文件是最新的版本,并及時(shí)更新系統(tǒng)補(bǔ)丁。
2.關(guān)閉不必要的服務(wù)。
3.限制同時(shí)打開的SYN半連接數(shù)目。
4.縮短SYN半連接的time out 時(shí)間。
5.正確設(shè)置防火墻
6.禁止對(duì)主機(jī)的非開放服務(wù)的訪問
7.限制特定IP地址的訪問
8.啟用防火墻的防DDoS的屬性
9.嚴(yán)格限制對(duì)外開放的服務(wù)器的向外訪問
10.運(yùn)行端口映射程序禍端口掃描程序,要認(rèn)真檢查特權(quán)端口和非特權(quán)端口。
11.認(rèn)真檢查網(wǎng)絡(luò)設(shè)備和主機(jī)/服務(wù)器系統(tǒng)的日志。只要日志出現(xiàn)漏洞或是時(shí)間變更,那這臺(tái)機(jī)器就可能遭到了攻擊。
12.限制在防火墻外與網(wǎng)絡(luò)文件共享。這樣會(huì)給黑客截取系統(tǒng)文件的機(jī)會(huì),主機(jī)的信息暴露給黑客,無疑是給了對(duì)方入侵的機(jī)會(huì)。
TCP連接的狀態(tài)圖
TCP建立連接的三次握手過程,以及關(guān)閉連接的四次握手過程
貼一個(gè)telnet建立連接,斷開連接的使用wireshark捕獲的packet截圖。
1、建立連接協(xié)議(三次握手)
(1)客戶 端發(fā)送一個(gè)帶SYN標(biāo)志的TCP報(bào)文到服務(wù)器。這是三次握手過程中的報(bào)文1。
(2) 服務(wù)器端回應(yīng)客戶端的,這是三次握手中的第2個(gè)報(bào)文,這個(gè)報(bào)文同時(shí)帶ACK標(biāo)志和SYN標(biāo)志。因此它表示對(duì)剛才客戶端SYN報(bào)文的回應(yīng);同時(shí)又標(biāo)志SYN給客戶端,詢問客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)通 訊。
(3) 客戶必須再次回應(yīng)服務(wù)段一個(gè)ACK報(bào)文,這是報(bào)文段3。
2、連接終止協(xié)議(四次握手)
由于TCP連 接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
(1) TCP客 戶端發(fā)送一個(gè)FIN,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報(bào)文段4)。
(2) 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。
(3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端(報(bào)文段6)。
(4) 客戶段發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)。
CLOSED: 這個(gè)沒什么好說的了,表示初始狀態(tài)。
LISTEN: 這個(gè)也是非常容易理解的一個(gè)狀態(tài),表示服務(wù)器端的某個(gè)SOCKET處 于監(jiān)聽狀態(tài),可以接受連接了。
SYN_RCVD: 這個(gè)狀態(tài)表示接受到了SYN報(bào)文,在正常情況下,這個(gè)狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時(shí)的三次握手會(huì)話過程中的一個(gè)中間狀態(tài),很短暫,基本上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個(gè)客戶端測試程序,故意將三次TCP握手過程中最后一個(gè)ACK報(bào)文不予發(fā)送。因此這種狀態(tài)時(shí),當(dāng)收到客戶端的ACK報(bào)文 后,它會(huì)進(jìn)入到ESTABLISHED狀態(tài)。
SYN_SENT: 這個(gè)狀態(tài)與SYN_RCVD遙想呼應(yīng),當(dāng)客戶端SOCKET執(zhí)行CONNECT連接時(shí),它首先發(fā)送SYN報(bào)文,因此也隨即它會(huì)進(jìn)入到了SYN_SENT狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個(gè)報(bào)文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報(bào)文。
ESTABLISHED:這個(gè)容易理解了,表示連接已經(jīng)建立了。
FIN_WAIT_1: 這個(gè)狀態(tài)要好好解釋一下,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí),它想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài)。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2狀態(tài),當(dāng)然在實(shí)際的正常情況下,無論對(duì)方何種情況下,都應(yīng)該馬上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時(shí)常常可以用netstat看到。
FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài),實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對(duì)方,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你,稍后再關(guān)閉連接。
TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)。
CLOSING: 這種狀態(tài)比較特殊,實(shí)際情況中應(yīng)該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當(dāng)你發(fā)送FIN報(bào)文后,按理來說是應(yīng)該先收到(或同時(shí)收到)對(duì)方的ACK報(bào)文,再收到對(duì)方的FIN報(bào)文。但是CLOSING狀態(tài)表示你發(fā)送FIN報(bào)文后,并沒有收到對(duì)方的ACK報(bào)文,反而卻也收到了對(duì)方的FIN報(bào)文。什么情況下會(huì)出現(xiàn)此種情況呢?其實(shí)細(xì)想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時(shí)close一個(gè)SOCKET的話,那么就出現(xiàn)了雙方同時(shí)發(fā)送FIN報(bào)文的情況,也即會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。
CLOSE_WAIT: 這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己,你系統(tǒng)毫無疑問地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來呢,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方,如果沒有的話,那么你也就可以close這個(gè)SOCKET,發(fā)送FIN報(bào)文給對(duì)方,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。
LAST_ACK: 這個(gè)狀態(tài)還是比較容易好理解的,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文。當(dāng)收到ACK報(bào)文后,也即可以進(jìn)入到CLOSED可用狀態(tài)了。
補(bǔ)充:
a. 默認(rèn)情況下(不改變socket選項(xiàng)),當(dāng)你調(diào)用close( or closesocket,以下說close不再重復(fù))時(shí),如果發(fā)送緩沖中還有數(shù)據(jù),TCP會(huì)繼續(xù)把數(shù)據(jù)發(fā)送完。
b. 發(fā)送了FIN只是表示這端不能繼續(xù)發(fā)送數(shù)據(jù)(應(yīng)用層不能再調(diào)用send發(fā)送),但是還可以接收數(shù)據(jù)。
c. 應(yīng)用層如何知道對(duì)端關(guān)閉?通常,在最簡單的阻塞模型中,當(dāng)你調(diào)用recv時(shí),如果返回0,則表示對(duì)端關(guān)閉。在這個(gè)時(shí)候通常的做法就是也調(diào)用close,那么TCP層就發(fā)送FIN,繼續(xù)完成四次握手。如果你不調(diào)用close,那么對(duì)端就會(huì)處于FIN_WAIT_2狀態(tài),而本端則會(huì)處于CLOSE_WAIT狀態(tài)。這個(gè)可以寫代碼試試。
d. 在很多時(shí)候,TCP連接的斷開都會(huì)由TCP層自動(dòng)進(jìn)行,例如你CTRL+C終止你的程序,TCP連接依然會(huì)正常關(guān)閉,你可以寫代碼試試。
1、 為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報(bào)文的建連請(qǐng)求后,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一個(gè)報(bào)文里來發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文通知時(shí),它僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以未必會(huì)馬上會(huì)關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對(duì)方之后,再發(fā)送FIN報(bào)文給對(duì)方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報(bào)文和FIN報(bào)文多數(shù)情況下都是分開發(fā)送的。
2、 為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)?
什么是2MSL?MSL即Maximum Segment Lifetime,也就是報(bào)文最大生存時(shí)間,引用《TCP/IP詳解》中的話:“它(MSL)是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時(shí)間。”那么,2MSL也就是這個(gè)時(shí)間的2倍,當(dāng)TCP連接完成四個(gè)報(bào)文段的交換時(shí),主動(dòng)關(guān)閉的一方將繼續(xù)等待一定時(shí)間(2-4分鐘),即使兩端的應(yīng)用程序結(jié)束。例如在上面的telnet程序客戶端關(guān)閉后,使用netstat查看的結(jié)果:
C:\>netstat -na | find "172.29.21.25"
TCP 172.29.132.60:2795 172.29.21.25:23 TIME_WAIT
為什么需要這個(gè)2MSL呢,
第一,雖然雙方都同意關(guān)閉連接了,而且握手的4個(gè)報(bào)文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到ESTABLISH狀態(tài)那樣);但是因?yàn)槲覀儽仨氁傧刖W(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報(bào)文會(huì)一定被對(duì)方收到,因此對(duì)方處于LAST_ACK狀態(tài)下的SOCKET可能會(huì)因?yàn)槌瑫r(shí)未收到ACK報(bào)文,而重發(fā)FIN報(bào)文,所以這個(gè)TIME_WAIT狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報(bào)文。
第二,報(bào)文可能會(huì)被混淆,意思是說,其他時(shí)候的連接可能會(huì)被當(dāng)作本次的連接。直接引用《The TCP/IP Guide》的說法:The second is to provide a “buffering period” between the end of this connection and any subsequent ones. If not for this period, it is possible that packets from different connections could be mixed, creating confusion.
當(dāng)某個(gè)連接的一端處于TIME_WAIT狀態(tài)時(shí),該連接將不能再被使用。事實(shí)上,對(duì)于我們比較有現(xiàn)實(shí)意義的是,這個(gè)端口將不能再被使用。某個(gè)端口處于TIME_WAIT狀態(tài)(其實(shí)應(yīng)該是這個(gè)連接)時(shí),這意味著這個(gè)TCP連接并沒有斷開(完全斷開),那么,如果你bind這個(gè)端口,就會(huì)失敗。對(duì)于服務(wù)器而言,如果服務(wù)器突然crash掉了,那么它將無法在2MSL內(nèi)重新啟動(dòng),因?yàn)閎ind會(huì)失敗。解決這個(gè)問題的一個(gè)方法就是設(shè)置socket的SO_REUSEADDR選項(xiàng)。這個(gè)選項(xiàng)意味著你可以重用一個(gè)地址。
當(dāng)建立一個(gè)TCP連接時(shí),服務(wù)器端會(huì)繼續(xù)用原有端口監(jiān)聽,同時(shí)用這個(gè)端口與客戶端通信。而客戶端默認(rèn)情況下會(huì)使用一個(gè)隨機(jī)端口與服務(wù)器端的監(jiān)聽端口通信。有時(shí)候,為了服務(wù)器端的安全性,我們需要對(duì)客戶端進(jìn)行驗(yàn)證,即限定某個(gè)IP某個(gè)特定端口的客戶端。客戶端可以使用bind來使用特定的端口。對(duì)于服務(wù)器端,當(dāng)設(shè)置了SO_REUSEADDR選項(xiàng)時(shí),它可以在2MSL內(nèi)啟動(dòng)并listen成功。但是對(duì)于客戶端,當(dāng)使用bind并設(shè)置SO_REUSEADDR時(shí),如果在2MSL內(nèi)啟動(dòng),雖然bind會(huì)成功,但是在windows平臺(tái)上connect會(huì)失敗。而在linux上則不存在這個(gè)問題。(我的實(shí)驗(yàn)平臺(tái):winxp, ubuntu7.10)
要解決windows平臺(tái)的這個(gè)問題,可以設(shè)置SO_LINGER選項(xiàng)。SO_LINGER選項(xiàng)決定調(diào)用close時(shí)TCP的行為。SO_LINGER涉及到linger結(jié)構(gòu)體,如果設(shè)置結(jié)構(gòu)體中l(wèi)_onoff為非0,l_linger為0,那么調(diào)用close時(shí)TCP連接會(huì)立刻斷開,TCP不會(huì)將發(fā)送緩沖中未發(fā)送的數(shù)據(jù)發(fā)送,而是立即發(fā)送一個(gè)RST報(bào)文給對(duì)方,這個(gè)時(shí)候TCP連接(關(guān)閉時(shí))就不會(huì)進(jìn)入TIME_WAIT狀態(tài)。如你所見,這樣做雖然解決了問題,但是并不安全。通過以上方式設(shè)置SO_LINGER狀態(tài),等同于設(shè)置SO_DONTLINGER狀態(tài)。
當(dāng)TCP連接發(fā)生一些物理上的意外情況時(shí),例如網(wǎng)線斷開,linux上的TCP實(shí)現(xiàn)會(huì)依然認(rèn)為該連接有效,而windows則會(huì)在一定時(shí)間后返回錯(cuò)誤信息。這似乎可以通過設(shè)置SO_KEEPALIVE選項(xiàng)來解決,不過不知道這個(gè)選項(xiàng)是否對(duì)于所有平臺(tái)都有效。
3. 為什么不能用兩次握手進(jìn)行連接?
我們知道,3次握手完成兩個(gè)重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準(zhǔn)備工作(雙方都知道彼此已準(zhǔn)備好),也要允許雙方就初始序列號(hào)進(jìn)行協(xié)商,這個(gè)序列號(hào)在握手過程中被發(fā)送和確認(rèn)。
現(xiàn)在把三次握手改成僅需要兩次握手,死鎖是可能發(fā)生的。作為例子,考慮計(jì)算機(jī)S和C之間的通信,假定C給S發(fā)送一個(gè)連接請(qǐng)求分組,S收到了這個(gè)分組,并發(fā)送了確認(rèn)應(yīng)答分組。按照兩次握手的協(xié)定,S認(rèn)為連接已經(jīng)成功地建立了,可以開始發(fā)送數(shù)據(jù)分組。可是,C在S的應(yīng)答分組在傳輸中被丟失的情況下,將不知道S是否已準(zhǔn)備好,不知道S建立什么樣的序列號(hào),C甚至懷疑S是否收到自己的連接請(qǐng)求分組。在這種情況下,C認(rèn)為連接還未建立成功,將忽略S發(fā)來的任何數(shù)據(jù)分組,只等待連接確認(rèn)應(yīng)答分組。而S在發(fā)出的分組超時(shí)后,重復(fù)發(fā)送同樣的分組。這樣就形成了死鎖。
DoS攻擊
DoS攻擊、DDoS攻擊和DRDoS攻擊相信大家已經(jīng)早有耳聞了吧!DoS是Denial of Service的簡寫就是拒絕服務(wù),而DDoS就是Distributed Denial of Service的簡寫就是分布式拒絕服務(wù),而DRDoS就是Distributed Reflection Denial of Service的簡寫,這是分布反射式拒絕服務(wù)的意思。
不過這3中攻擊方法最厲害的還是DDoS,那個(gè)DRDoS攻擊雖然是新近出的一種攻擊方法,但它只是DDoS攻擊的變形,它的唯一不同就是不用占領(lǐng)大量的“肉雞”。這三種方法都是利用TCP三次握手的漏洞進(jìn)行攻擊的,所以對(duì)它們的防御辦法都是差不多的。
DoS攻擊是最早出現(xiàn)的,它的攻擊方法說白了就是單挑,是比誰的機(jī)器性能好、速度快。但是現(xiàn)在的科技飛速發(fā)展,一般的網(wǎng)站主機(jī)都有十幾臺(tái)主機(jī),而且各個(gè)主機(jī)的處理能力、內(nèi)存大小和網(wǎng)絡(luò)速度都有飛速的發(fā)展,有的網(wǎng)絡(luò)帶寬甚至超過了千兆級(jí)別。這樣我們的一對(duì)一單挑式攻擊就沒有什么作用了,搞不好自己的機(jī)子就會(huì)死掉。舉個(gè)這樣的攻擊例子,假如你的機(jī)器每秒能夠發(fā)送10個(gè)攻擊用的數(shù)據(jù)包,而被你攻擊的機(jī)器(性能、網(wǎng)絡(luò)帶寬都是頂尖的)每秒能夠接受并處理100攻擊數(shù)據(jù)包,那樣的話,你的攻擊就什么用處都沒有了,而且非常有死機(jī)的可能。要知道,你若是發(fā)送這種1Vs1的攻擊,你的機(jī)器的CPU占用率是90%以上的,你的機(jī)器要是配置不夠高的話,那你就死定了。
不過,科技在發(fā)展,黑客的技術(shù)也在發(fā)展。正所謂道高一尺,魔高一仗。經(jīng)過無數(shù)次當(dāng)機(jī),黑客們終于又找到一種新的DoS攻擊方法,這就是DDoS攻擊。它的原理說白了就是群毆,用好多的機(jī)器對(duì)目標(biāo)機(jī)器一起發(fā)動(dòng) DoS攻擊,但這不是很多黑客一起參與的,這種攻擊只是由一名黑客來操作的。這名黑客不是擁有很多機(jī)器,他是通過他的機(jī)器在網(wǎng)絡(luò)上占領(lǐng)很多的“肉雞”,并且控制這些“肉雞”來發(fā)動(dòng)DDoS攻擊,要不然怎么叫做分布式呢。還是剛才的那個(gè)例子,你的機(jī)器每秒能發(fā)送10攻擊數(shù)據(jù)包,而被攻擊的機(jī)器每秒能夠接受100的數(shù)據(jù)包,這樣你的攻擊肯定不會(huì)起作用,而你再用10臺(tái)或更多的機(jī)器來對(duì)被攻擊目標(biāo)的機(jī)器進(jìn)行攻擊的話,嘿嘿!結(jié)果我就不說了。
DRDoS分布反射式拒絕服務(wù)攻擊這是DDoS攻擊的變形,它與DDoS的不同之處就是DrDoS不需要在攻擊之前占領(lǐng)大量的“肉雞”。它的攻擊原理和Smurf攻擊原理相近,不過DRDoS是可以在廣域網(wǎng)上進(jìn)行的,而Smurf攻擊是在局域網(wǎng)進(jìn)行的。它的作用原理是基于廣播地址與回應(yīng)請(qǐng)求的。一臺(tái)計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送一些特殊的數(shù)據(jù)包如ping請(qǐng)求時(shí),會(huì)接到它的回應(yīng);如果向本網(wǎng)絡(luò)的廣播地址發(fā)送請(qǐng)求包,實(shí)際上會(huì)到達(dá)網(wǎng)絡(luò)上所有的計(jì)算機(jī),這時(shí)就會(huì)得到所有計(jì)算機(jī)的回應(yīng)。這些回應(yīng)是需要被接收的計(jì)算機(jī)處理的,每處理一個(gè)就要占用一份系統(tǒng)資源,如果同時(shí)接到網(wǎng)絡(luò)上所有計(jì)算機(jī)的回應(yīng),接收方的系統(tǒng)是有可能吃不消的,就象遭到了DDoS攻擊一樣。不過是沒有人笨到自己攻擊自己,不過這種方法被黑客加以改進(jìn)就具有很大的威力了。黑客向廣播地址發(fā)送請(qǐng)求包,所有的計(jì)算機(jī)得到請(qǐng)求后,卻不會(huì)把回應(yīng)發(fā)到黑客那里,而是發(fā)到被攻擊主機(jī)。這是因?yàn)楹诳兔俺淞吮还糁鳈C(jī)。黑客發(fā)送請(qǐng)求包所用的軟件是可以偽造源地址的,接到偽造數(shù)據(jù)包的主機(jī)會(huì)根據(jù)源地址把回應(yīng)發(fā)出去,這當(dāng)然就是被攻擊主機(jī)的地址。黑客同時(shí)還會(huì)把發(fā)送請(qǐng)求包的時(shí)間間隔減小,這樣在短時(shí)間能發(fā)出大量的請(qǐng)求包,使被攻擊主機(jī)接到從被欺騙計(jì)算機(jī)那里傳來的洪水般的回應(yīng),就像遭到了DDoS攻擊導(dǎo)致系統(tǒng)崩潰。駭客借助了網(wǎng)絡(luò)中所有計(jì)算機(jī)來攻擊受害者,而不需要事先去占領(lǐng)這些被欺騙的主機(jī),這就是Smurf攻擊。而DRDoS攻擊正是這個(gè)原理,黑客同樣利用特殊的發(fā)包工具,首先把偽造了源地址的SYN連接請(qǐng)求包發(fā)送到那些被欺騙的計(jì)算機(jī)上,根據(jù)TCP三次握手的規(guī)則,這些計(jì)算機(jī)會(huì)向源IP發(fā)出SYN+ACK或RST包來響應(yīng)這個(gè)請(qǐng)求。同Smurf攻擊一樣,黑客所發(fā)送的請(qǐng)求包的源IP地址是被攻擊主機(jī)的地址,這樣受欺騙的主機(jī)就都會(huì)把回應(yīng)發(fā)到被攻擊主機(jī)處,造成被攻擊主機(jī)忙于處理這些回應(yīng)而癱瘓。
解釋:
SYN:(Synchronize sequence numbers)用來建立連接,在連接請(qǐng)求中,SYN=1,ACK=0,連接響應(yīng)時(shí),SYN=1,ACK=1。即,SYN和ACK來區(qū)分Connection Request和Connection Accepted。
RST:(Reset the connection)用于復(fù)位因某種原因引起出現(xiàn)的錯(cuò)誤連接,也用來拒絕非法數(shù)據(jù)和請(qǐng)求。如果接收到RST位時(shí)候,通常發(fā)生了某些錯(cuò)誤。
ACK:(Acknowledgment field significant)置1時(shí)表示確認(rèn)號(hào)(Acknowledgment Number)為合法,為0的時(shí)候表示數(shù)據(jù)段不包含確認(rèn)信息,確認(rèn)號(hào)被忽略。
設(shè)我們要準(zhǔn)備建立連接,服務(wù)器正處于正常的接聽狀態(tài)。
第一步:我們也就是客戶端發(fā)送一個(gè)帶SYN位的請(qǐng)求,向服務(wù)器表示需要連接,假設(shè)請(qǐng)求包的序列號(hào)為10,那么則為:SYN=10,ACK=0,然后等待服務(wù)器的回應(yīng)。
第二步:服務(wù)器接收到這樣的請(qǐng)求包后,查看是否在接聽的是指定的端口,如果不是就發(fā)送RST=1回應(yīng),拒絕建立連接。如果接收請(qǐng)求包,那么服務(wù)器發(fā)送確認(rèn)回應(yīng),SYN為服務(wù)器的一個(gè)內(nèi)碼,假設(shè)為100,ACK位則是客戶端的請(qǐng)求序號(hào)加1,本例中發(fā)送的數(shù)據(jù)是:SYN=100,ACK=11,用這樣的數(shù)據(jù)回應(yīng)給我們。向我們表示,服務(wù)器連接已經(jīng)準(zhǔn)備好了,等待我們的確認(rèn)。這時(shí)我們接收到回應(yīng)后,分析得到的信息,準(zhǔn)備發(fā)送確認(rèn)連接信號(hào)到服務(wù)器。
第三步:我們發(fā)送確認(rèn)建立連接的信息給服務(wù)器。確認(rèn)信息的SYN位是服務(wù)器發(fā)送的ACK位,ACK位是服務(wù)器發(fā)送的SYN位加1。即:SYN=11,ACK=101。
這樣我們的連接就建立起來了。
DDoS究竟如何攻擊?目前最流行也是最好用的攻擊方法就是使用SYN-Flood進(jìn)行攻擊,SYN-Flood也就是SYN洪水攻擊。SYN-Flood不會(huì)完成TCP三次握手的第三步,也就是不發(fā)送確認(rèn)連接的信息給服務(wù)器。這樣,服務(wù)器無法完成第三次握手,但服務(wù)器不會(huì)立即放棄,服務(wù)器會(huì)不停的重試并等待一定的時(shí)間后放棄這個(gè)未完成的連接,這段時(shí)間叫做SYN timeout,這段時(shí)間大約30秒-2分鐘左右。若是一個(gè)用戶在連接時(shí)出現(xiàn)問題導(dǎo)致服務(wù)器的一個(gè)線程等待1分鐘并不是什么大不了的問題,但是若有人用特殊的軟件大量模擬這種情況,那后果就可想而知了。一個(gè)服務(wù)器若是處理這些大量的半連接信息而消耗大量的系統(tǒng)資源和網(wǎng)絡(luò)帶寬,這樣服務(wù)器就不會(huì)再有空余去處理普通用戶的正常請(qǐng)求(因?yàn)榭蛻舻恼U?qǐng)求比率很小)。這樣這個(gè)服務(wù)器就無法工作了,這種攻擊就叫做:SYN-Flood攻擊。
到目前為止,進(jìn)行DDoS攻擊的防御還是比較困難的。首先,這種攻擊的特點(diǎn)是它利用了TCP/IP協(xié)議的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻擊。不過這不等于我們就沒有辦法阻擋DDoS攻擊,我們可以盡力來減少DDoS的攻擊。下面就是一些防御方法:
1.確保服務(wù)器的系統(tǒng)文件是最新的版本,并及時(shí)更新系統(tǒng)補(bǔ)丁。
2.關(guān)閉不必要的服務(wù)。
3.限制同時(shí)打開的SYN半連接數(shù)目。
4.縮短SYN半連接的time out 時(shí)間。
5.正確設(shè)置防火墻
6.禁止對(duì)主機(jī)的非開放服務(wù)的訪問
7.限制特定IP地址的訪問
8.啟用防火墻的防DDoS的屬性
9.嚴(yán)格限制對(duì)外開放的服務(wù)器的向外訪問
10.運(yùn)行端口映射程序禍端口掃描程序,要認(rèn)真檢查特權(quán)端口和非特權(quán)端口。
11.認(rèn)真檢查網(wǎng)絡(luò)設(shè)備和主機(jī)/服務(wù)器系統(tǒng)的日志。只要日志出現(xiàn)漏洞或是時(shí)間變更,那這臺(tái)機(jī)器就可能遭到了攻擊。
12.限制在防火墻外與網(wǎng)絡(luò)文件共享。這樣會(huì)給黑客截取系統(tǒng)文件的機(jī)會(huì),主機(jī)的信息暴露給黑客,無疑是給了對(duì)方入侵的機(jī)會(huì)。
總結(jié)
以上是生活随笔為你收集整理的TCP协议三次握手连接四次握手断开和DOS攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP十一种状态
- 下一篇: TCP 通信过程中各步骤的状态