tcp三次握手python实现和结果

下载抓包工具

安装
使用1
使用2

结果

tcp三次握手python实现和结果_第1张图片

tcp三次握手python实现和结果_第2张图片
红色笔为想要发送的数据。

代码

from scapy.all import *
import logging

logging.getLogger('scapy.runtime').setLevel(logging.ERROR)

target_ip = '172.20.211.4'
target_port = 80
data = 'GET / HTTP/1.0 \r\n\r\n'


def start_tcp(target_ip, target_port):
    try:
        global sport, s_seq, d_seq  # 主要是用于TCP3此握手建立连接后继续发送数据
        sport, s_seq, d_seq = 0, 0, 0  # 初始化全局变量
        # 第一次握手,发送SYN包
        ans = sr1(IP(dst=target_ip) / TCP(dport=target_port, sport=RandShort(), seq=RandInt(), flags='S'), verbose=False)
        sport = ans[TCP].dport  # 源随机端口
        s_seq = ans[TCP].ack  # 源序列号(其实初始值已经被服务端加1)
        d_seq = ans[TCP].seq + 1  # 确认号,需要把服务端的序列号加1
        # 第三次握手,发送ACK确认包
        send(IP(dst=target_ip) / TCP(dport=target_port, sport=sport, ack=d_seq, seq=s_seq, flags='A'), verbose=False)
    except Exception as e:
        print("[-]有错误,请注意检查!")
        print(e)

def trans_data(target_ip, target_port, data):
    # 先建立TCP连接
    start_tcp(target_ip=target_ip, target_port=target_port)
    # 发起GET请求
    ans = sr1(IP(dst=target_ip) / TCP(dport=target_port, sport=sport, seq=s_seq, ack=d_seq, flags='PA') / data,verbose=False)
    # 显示接收到的数据包的详细信息
    ans.show()
    #读取服务端发来的数据
    # rcv = ans[Raw]
    # print(rcv)
if __name__ == '__main__':
    # start_tcp(target_ip,target_port)
    trans_data(target_ip, target_port, data)
    print("恭喜你 运行完整个程序")

你可能感兴趣的:(1,tcp/ip,python,网络)