首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试在python中通过TCP创建原始发送/接收

在Python中,可以使用socket模块来创建原始的TCP套接字,以实现原始发送和接收数据的功能。

TCP(传输控制协议)是一种面向连接的协议,提供可靠的、有序的、基于字节流的数据传输。原始发送/接收是指在网络层面上直接发送和接收数据,不经过操作系统的网络协议栈处理。

以下是在Python中通过TCP创建原始发送/接收的示例代码:

代码语言:txt
复制
import socket

# 创建原始套接字
raw_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

# 设置IP头部选项,允许构造自定义IP头部
raw_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# 构造TCP头部
source_ip = '192.168.0.1'  # 源IP地址
destination_ip = '192.168.0.2'  # 目标IP地址
source_port = 12345  # 源端口号
destination_port = 80  # 目标端口号
sequence_number = 123456789  # 序列号
acknowledgment_number = 0  # 确认号
tcp_flags = 0x02  # TCP标志位,这里为SYN标志位
window_size = socket.htons(5840)  # 窗口大小
tcp_checksum = 0  # 校验和,先设置为0
urgent_pointer = 0  # 紧急指针

tcp_header = struct.pack('!HHLLBBHHH', source_port, destination_port, sequence_number, acknowledgment_number, (5 << 4), tcp_flags, window_size, tcp_checksum, urgent_pointer)

# 构造IP头部
ip_version = 4  # IP版本
ip_header_length = 5  # IP头部长度
ip_tos = 0  # 服务类型
ip_total_length = 0  # IP数据包总长度,先设置为0
ip_id = 54321  # 标识符
ip_frag_offset = 0  # 分片偏移
ip_ttl = 255  # 存活时间
ip_protocol = socket.IPPROTO_TCP  # 上层协议,这里为TCP
ip_checksum = 0  # 校验和,先设置为0
source_address = socket.inet_aton(source_ip)  # 源IP地址
destination_address = socket.inet_aton(destination_ip)  # 目标IP地址

ip_header = struct.pack('!BBHHHBBH4s4s', (ip_version << 4) + ip_header_length, ip_tos, ip_total_length, ip_id, ip_frag_offset, ip_ttl, ip_protocol, ip_checksum, source_address, destination_address)

# 计算IP头部校验和
ip_checksum = calculate_checksum(ip_header)

# 将计算得到的IP头部校验和填入IP头部
ip_header = struct.pack('!BBHHHBBH4s4s', (ip_version << 4) + ip_header_length, ip_tos, ip_total_length, ip_id, ip_frag_offset, ip_ttl, ip_protocol, ip_checksum, source_address, destination_address)

# 发送IP头部和TCP头部
raw_socket.sendto(ip_header + tcp_header, (destination_ip, 0))

# 接收数据
data, address = raw_socket.recvfrom(65535)

# 关闭原始套接字
raw_socket.close()

上述代码中,首先创建了一个原始套接字,然后设置了IP头部选项,允许构造自定义IP头部。接下来,构造了TCP头部和IP头部的各个字段,并使用struct模块将它们打包成字节流。然后,计算了IP头部的校验和,并将校验和填入IP头部。最后,通过原始套接字发送构造好的IP头部和TCP头部,并接收数据。

需要注意的是,使用原始套接字进行原始发送/接收需要具有管理员权限,因为这种操作可以绕过操作系统的网络协议栈。此外,原始发送/接收需要构造正确的IP头部和TCP头部,以确保数据能够正确地发送和接收。

在腾讯云中,与TCP相关的产品和服务包括云服务器(ECS)、负载均衡(CLB)、弹性公网IP(EIP)等。您可以根据具体需求选择适合的产品和服务。更多详细信息和产品介绍,请访问腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python socket编程详细介绍

,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP...s.accept()接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收发送数据。address是连接客户端的地址。...s.send(string[,flag])发送TCP数据。将string的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...s.sendall(string[,flag])完整发送TCP数据。将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...不想把代码写的太复杂,简单的说下解决方案: 问题1.客户端上判断输入为空,要求重新输入。 问题2.客户端上循环接收,直到接收完。但有没有完客户端是不知道的,需要服务端发一个结束符。

85510

socket编程介绍

,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。...s.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收发送数据。address是连接客户端的地址。...s.send(string[,flag]) 发送TCP数据。将string的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...s.sendall(string[,flag]) 完整发送TCP数据。将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...,并发送给对方数据         #s.recv() , s.sendall() 5 传输完毕后,关闭套接字                     #s.close() TCP客户端: 1 创建套接字

93810
  • Python3快速入门(十)——Pyth

    二、socket模块接口 1、socket类型 Python ,用使用socket函数来创建套接字,语法格式如下: sock = socket.socket([family[, type]]) family...IPv4报文;利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。...socket.send(buf):发送TCP数据,将buf的数据发送到连接的套接字。返回要发送的字节数量,可能小于buf的字节大小。 socket.sendall(buf):发送TCP数据。...将buf的数据发送到连接的套接字,但在返回前会尝试发送所有数据。成功返回None,失败则抛出异常。...Python中用TCP协议进行Socket编程十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。

    1.1K20

    socket 编程初探

    ,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。...socket.send(string[,flag]) 发送TCP数据。将string的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...socket.sendall(string[,flag]) 完整发送TCP数据。将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...5 处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。服务器调用send方法以字符串形式向客户发送数据,也可以使用recv方法从客户接收信息。...调用recv时, 服务器必须设置接收的最大数据量。recv方法接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。

    1K40

    ☀️苏州程序大白用万字解析Python网络编程与Web编程☀️《❤️记得收藏❤️》

    TCP网络开发 socket类 Python ,我们用 socket()函数来创建套接字,语法格式如下: ​ import socket socket.socket([family[, type[..._socket.sendall(string[,flag]) 将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...A:不是,要想发数据,必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送的数据先写入到发送缓冲区(内存的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡...A:不是,应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区(内存的一片空间),应用程序再从接收缓存区获取客户端发送的数据。...如何搭建Python自带的静态Web服务器 Python3的模块,官方加入了http模块,我们可以直接调用运行它,让他作为提供静态Web的服务。

    82920

    Python基础:网络编程socket基

    Python里socket工作过程:(图片来自网络) ? socketPython实际上是一个模块,实现发送接收数据的功能。...SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。...s.send(string[,flag])发送TCP数据。将string的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...s.sendall(string[,flag])完整发送TCP数据。将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...有时候服务器运行程序时间长,没有到接收语句,而客户端发送数据太快,导致出错 客户端加个sleep... logging使用filehandler中文乱码 创建filehandler时,写入encode

    71610

    python学习----------so

    #从服务端接收消息 serve_data = obj_client.recv(1024) print serve_data obj_client.close() 具体的解释代码已经给出,可以操作体会...可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。   ...SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。   ...其中data是包含接收数据的字符串,address是发送数据的套接字地址。 sk.send(string[,flag])   将string的数据发送到连接的套接字。...sk.sendall(string[,flag])   将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    1K10

    解决问题BrokenPipeError: 管道已结束

    当我们尝试通过套接字或管道向另一端发送数据时,如果接收数据的一端中断连接或关闭,则发送端可能会触发BrokenPipeError。...send_data(data_to_send)在上述示例代码,我们使用Python的socket模块创建了一个客户端套接字对象,并尝试连接到指定的服务器主机和端口。...然后,我们调用send_data函数来发送数据给服务器。 send_data函数,我们首先创建了一个套接字对象,并通过connect方法连接到指定的服务器。...它提供了一种可靠、面向连接的通信方式,发送接收数据时,可以保证数据的有序性、完整性和可靠性。 TCP连接是通过建立双方的通信端点之间的虚拟连接而进行的。...TCP连接,数据的传输是基于字节流的,发送方将数据分割成小的数据包进行传输,接收方根据序号将数据包重组成完整的数据。

    1.1K10

    SeedLab——TCPIP Attack Lab

    TCP的特性和工作原理如下: 三次握手:进行数据传输之前,发送方和接收方需要建立一个TCP连接。...发送方将数据划分为称为TCP段的小块,并为每个段分配一个序列号。接收接收到数据段后,发送确认消息来确认已接收到的数据段,并请求重传未收到的数据段。...流量控制:TCP使用流量控制机制来调节发送方的发送速率,以适应接收方的处理能力。接收方可以通过发送窗口大小来告知发送方自己的可接收数据量,从而控制数据的流动。...TCP三次握手过程,客户端向服务器发送一个SYN(同步)包,服务器接收到后会返回一个SYN-ACK(同步-确认)包给客户端,然后等待客户端的确认(ACK)。...然后使用sendto函数将我们自己构造的SYN数据包通过创建原始套接字发往目标地址。

    51410

    Python Socket 编程详细介绍(转)

    可以;其次SOCK_RAW也可以处理特殊的IPV4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头 socket.SOCK_SEQPACKET 可靠的连续数据包服务...) 接受TCP链接并返回(conn, address),其中conn是新的套接字对象,可以用来接收发送数据,address是链接客户端的地址。...套接字的数据,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息,通常可以忽略 s.send(string[, flag]) 发送TCP数据,将字符串的数据发送到链接的套接字...,返回值是要发送的字节数量,该数量可能小于string的字节大小 s.sendall(string[, flag]) 完整发送TCP数据,将字符串的数据发送到链接的套接字,但在返回之前尝试发送所有数据...,并且发送给对方发送数据 s.recv() s.sendall() 5、传输完毕后,关闭套接字 s.close() TCP 客户端 1、创建套接字并链接至远端地址 s = socket.socket(socket.AF_INET

    3.8K20

    Python socket 模块的使用

    : import socket #指定server端的ip地址和端口号 ip_port = ('127.0.0.1',9999) #创建socket实例,参数不填的话就采用ipv4协议通过tcp传输...SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。   ...其中data是包含接收数据的字符串,address是发送数据的套接字地址。 sk.send(string[,flag])   将string的数据发送到连接的套接字。...返回值是要发送的字节数量,该数量可能小于string的字节大小。 sk.sendall(string[,flag])   将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。...这时候就需要python提供的另外一个模块SocketServer,用它创建的server端程序可以同时实现多客户端同时接入。

    1.2K20

    SeedLab——Packet Sniffing and Spoofing Lab

    (iface='br-0d32c54e0d4e', filter="tcp port 23", prn=print_pkt) 然后docker容器尝试远程登陆另一台主机10.9.0.6 观察嗅探程序的结果...TCP三次握手过程,客户端向服务器发送一个SYN(同步)包,服务器接收到后会返回一个SYN-ACK(同步-确认)包给客户端,然后等待客户端的确认(ACK)。...通过调用socket函数创建一个原始套接字。...然后使用sendto函数将我们自己构造的SYN数据包通过创建原始套接字发往目标地址。...当使用原始套接字发送IP数据包时,操作系统会负责处理IP头部的构建和校验和计算。我们只需要构造IP数据包的内容,将其传递给操作系统,并通过原始套接字发送即可。

    58710

    Python黑帽子》:原始套接字和流量嗅探

    通过网络嗅探,我们可以捕获目标机器接收发送的数据包。因此,流量嗅探渗透攻击之前或之后的各个阶段都有许多实际用途。...通过TCP 和UDP 发送接收数据包,按理说,这应该是我们与绝大部分网络服务进行交互的方式,但在这些高层协议之下,网络数据包的发送接收还涉及一些底层的知识。...我们将先创建套接字对象,然后再判断程序在哪个平台上运行。Windows 平台上,我们需要通过套接字输入/输出控制(IOCTL)1设置一些额外的标志,它允许在网络接口上启用混杂模式。...第一个例子,我们只需设置原始套接字嗅探器,读取一个数据包,然后退出即可。 首先,我们通过构建套接字对象对网络接口上的数据包嗅探进行必要的参数设置①。...然后,我们通过设置套接字选项②设置捕获的数据包包含IP 头。下一步③,我们判断程序是否运行在Windows 上,如果是,那么我们发送IOCTL 信号到网卡驱动上以启用混杂模式。

    1.3K20

    Scapy的介绍(一)「建议收藏」

    Scapy主要做两件事:发送数据包和接收答案。您定义一组数据包,它发送它们,接收答案,匹配带有答案的请求,并返回数据包对(请求,应答)列表和不匹配数据包列表。...探测网络时,会发送许多刺激,而只有少数刺激被回答。如果选择了正确的刺激,则可以通过响应或缺乏响应来获得所需信息。与许多工具不同,Scapy提供所有信息,即发送的所有刺激和收到的所有响应。...Scapy解码,它不解释 网络探测工具的一个常见问题是它们试图解释所接收的答案,而不是仅解码和给出事实。报告 端口80上的“接收TCP重置”之类的内容不受解释错误的影响。...快速演示 通过scapy命令进入交互式界面 首先,我们播放一下并一次创建四个IP数据包。让我们看看它是如何工作的。我们首先实例化IP类。...使用Python习语,我们一组显式数据包开发此隐式数据包。然后,我们退出了翻译。当我们提供会话文件时,我们正在处理的变量被保存,然后重新加载: # .

    2.3K20

    讲解TypeError: a bytes-like object is required, not str

    错误的原因这个错误通常是由于尝试将字符串传递给一个期望字节型对象的函数或方法引起的。 Python 3 ,字符串和字节型对象是两种不同的数据类型。...我们创建了一个 TCP/IP 套接字,并绑定了一个 IP 地址和端口号。...然后,通过监听连接,等待客户端的连接请求。当客户端成功连接后,我们通过 connection.recv() 方法接收客户端传来的数据,并使用 decode() 方法将接收到的字节型对象解码为字符串。...Python,字符串默认采用的是Unicode编码,可以通过调用字符串对象的encode()方法将其转换为字节型,例如:pythonCopy codes = "Hello"b = s.encode(...总结在 Python 编程,遇到TypeError: a bytes-like object is required, not 'str'错误时,意味着代码尝试将字符串传递给需要字节型对象的函数或方法

    67010

    一道腾讯面试题目:没有listen,能否建立TCP连接

    所以对于这个题目,最直接的想法就是由应用层自己负责TCP的连接。为了能够收到TCP的握手数据包,可以尝试使用原始套接字来接收IP报文,这样就可以应用层替代内核做TCP的三次握手了。...内核ip_local_deliver_finish先将报文复制一份给原始套接字,然后会继续后面的处理,进入tcp接收函数tcp_v4_rcv。在这个函数,要进行套接字的查找。 ?...虽然当时我没有继续实验尝试,但理论上,通过这个IPtables的NFQUEUE+NFSTOLEN的方案,是可以实现“没有listen,建立TCP连接”的。...可惜,与那位同学的讨论,腾讯面试题目的本意不是这个意思,而是对于普通的TCP套接字来说,如果没有listen调用,是否可以创建连接。即使限定了条件,答案依然是肯定的。...只不过限定了条件之后,我们需要确定2个事情: 与前面类似,如何避免内核发送RST。不能使用iptable的前提下,这意味着tcp_v4_rcv,要能够找到对应的套接字。

    2K30

    Python3 网络编程

    ---- socket()函数 Python ,我们用 socket() 函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]]) 参数 family...s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常公共用途的套接字函数s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量...s.send()发送TCP数据,将string的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。s.sendall()完整发送TCP数据,完整发送TCP数据。...将string的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...s.recvfrom()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

    89980
    领券