簡體   English   中英

Http 請求與 scapy

[英]Http request with scapy

我需要用 scapy 實現 http 請求以完成學校作業。 一切正常,直到我需要確認 http 段並關閉連接。 必須使用 scapy 並手動打開和關閉 tcp 連接。 在wireshark中我可以看到2個錯誤是TCP重傳和TCP亂序段。 誰能解決這個問題? 提前致謝!

from scapy.all import *

sport = random.randint(1024,65535)
dest = "128.119.245.12" 
getStr = 'GET / HTTP/1.1\r\nHost:' + dest + '\r\nAccept-Encoding: gzip, deflate\r\n\r\n'


#SYN
ip=IP(src='192.168.1.6',dst='128.119.245.12')
SYN=TCP(sport=sport, dport=80, flags='S', seq=0)
SYNACK=sr1(ip/SYN)
print(SYNACK.summary())


# SYN-ACK
ACK=TCP(sport=sport, dport=80, flags='A', seq=1, ack=SYNACK.seq + 1)
send(ip/ACK)

response = sr1(IP(dst=dest) / TCP(dport=80, sport=sport, seq=1, ack=SYNACK.seq + 1, flags='P''A') / getStr, timeout = 5)
print(response.dataofs)

ACK=TCP(sport=sport, dport=80, flags='A', seq=response.seq, ack=response.seq + 1)
send(ip/ACK)

FIN=ip/TCP(sport=sport, dport=80, flags="FA", seq=SYNACK.ack, ack=SYNACK.seq + 1)
FINACK=sr1(FIN)
LASTACK=ip/TCP(sport=sport, dport=80, flags="A", seq=FINACK.ack, ack=FINACK.seq + 1)
send(LASTACK)

線鯊

我看到您從客戶端發送的帶有數據包 25 的確認號是錯誤的。 您只是增加第一個確認號,而實際上您應該發送 TCP_len + 1。確認收到 TCP_len 字節。

ACK=TCP(sport=sport, dport=80, flags='A', seq=response.seq, ack=response.seq + 1)

如果你修改這一行應該沒問題。 您談論的其他 2 個“錯誤”是預期的 TCP 行為。 由於您只使用 ACK 數據包確認收到 1 個字節,因此服務器將嘗試重新傳輸有效負載的 rest。 然后您將獲得失敗的重傳嘗試,因為客戶端已經通過設置 FIN ACK 關閉了連接。 並且亂序警告也來自發送錯誤的 ACK 號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM