我需要为学校作业与scapy实现http请求。一切正常,直到我需要确认http段并关闭连接。必须使用scapy并手动打开和关闭tcp连接。在wireshark中,我可以看到两个错误是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的clinet发送的ack号码是错误的。您只需增加第一个ack号码,实际上您应该发送TCP_len+1。确认接收到TCP_len字节
如果您修改这一行,应该可以。您提到的其他两个“错误”是预期的TCP行为。由于您仅通过ACK数据包确认收到1个字节,服务器将尝试重新传输剩余的有效负载。然后您将获得失败的重新传输尝试,因为客户端已经通过设置FIN ACK关闭了连接。而故障警告也来自发送错误的ACK号码
相关问题 更多 >
编程相关推荐