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

使用python原始套接字的TCP握手

TCP握手是建立TCP连接的过程,使用python原始套接字可以实现对TCP握手的控制和定制。

TCP握手是指在TCP协议中,客户端和服务器之间建立连接的过程。它包括三个步骤:建立连接、数据传输和连接释放。

  1. 建立连接:
    • 客户端发送一个SYN(同步)包给服务器,请求建立连接。
    • 服务器收到SYN包后,发送一个SYN-ACK(同步-确认)包给客户端,表示接受连接请求。
    • 客户端收到SYN-ACK包后,发送一个ACK(确认)包给服务器,表示连接建立成功。
  2. 数据传输:
    • 连接建立后,客户端和服务器可以通过TCP连接传输数据。
  3. 连接释放:
    • 客户端或服务器任意一方可以发送一个FIN(结束)包给对方,请求关闭连接。
    • 接收到FIN包的一方发送一个ACK包作为确认。
    • 最后,发送FIN包的一方发送一个ACK包作为最终确认,连接关闭。

使用python原始套接字可以通过以下步骤实现TCP握手:

  1. 创建套接字:import socket

创建原始套接字

sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

代码语言:txt
复制
  1. 构造TCP头部:# 构造TCP头部 source_ip = '192.168.0.1' dest_ip = '192.168.0.2' source_port = 12345 dest_port = 80 sequence_number = 0 ack_number = 0 tcp_flags = 2 # SYN标志位

tcp_header = struct.pack('!HHLLBBHHH', source_port, dest_port, sequence_number, ack_number, 5 << 4, tcp_flags, 8192, 0, 0)

代码语言:txt
复制
  1. 发送SYN包:# 发送SYN包 sock.sendto(tcp_header, (dest_ip, 0))
  2. 接收SYN-ACK包:# 接收SYN-ACK包 response = sock.recvfrom(65535)
  3. 解析SYN-ACK包:# 解析SYN-ACK包 tcp_header = response[0][20:40] tcp_fields = struct.unpack('!HHLLBBHHH', tcp_header)

获取ACK号

ack_number = tcp_fields3

代码语言:txt
复制
  1. 发送ACK包:# 构造ACK包 tcp_flags = 16 # ACK标志位 tcp_header = struct.pack('!HHLLBBHHH', source_port, dest_port, sequence_number, ack_number, 5 << 4, tcp_flags, 8192, 0, 0)

发送ACK包

sock.sendto(tcp_header, (dest_ip, 0))

代码语言:txt
复制

以上是使用python原始套接字实现TCP握手的基本步骤。在实际应用中,可以根据具体需求进行定制和扩展。

推荐的腾讯云相关产品:

  • 云服务器(CVM):提供弹性计算能力,可用于部署和运行TCP握手相关的应用。
  • 云网络(VPC):提供安全可靠的网络环境,用于连接云服务器和其他云服务。
  • 云安全中心(SSC):提供全面的安全服务,保护云服务器和网络的安全。
  • 云监控(Cloud Monitor):提供实时的监控和告警功能,帮助监控TCP握手的性能和状态。

更多腾讯云产品信息和介绍,请访问腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

golang使用原始套接构造UDP包

RAW SOCKET 介绍 TCP/IP协议中,最常见就是原始(SOCKET_RAW)、tcp(SOCKET_STREAM)、udp(SOCKET_DGRA)三种套接。...原始套接能够对底层传输进行控制,允许自行组装数据包,比如修改本地IP,发送Ping包,进行网络监听。这里不做详细介绍,要了解更多可以网上自己查询。...这里给出校验算法,IP头和UDP头中使用校验算法是一样。...udph[18], udph[19] = byte(check>>8&255), byte(check&255) 下面我们需要发送自己构造UDP包,可以使用net下ListenPacket。...结语 这里只给出了UDP实现,TCP实现比较复杂,以后也会给出TCP实现例子。 本文来自:Segmentfault 感谢作者:pinecone 查看原文:golang使用原始套接构造UDP包

3.3K50

基于TCP套接

tcp服务端 1 ss = socket() #创建服务器套接 2 ss.bind() #把地址绑定到套接 3 ss.listen() #监听链接 4 inf_loop:...9 ss.close() #关闭服务器套接(可选) tcp客户端 1 cs = socket() # 创建客户套接 2 cs.connect() # 尝试连接服务器 3...通信流程与打电话流程类似,我们就以打电话为例来实现一个low版套接通信 #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' import socket ip_port...这个是由于你服务端仍然存在四次挥手time_wait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量time_wait状态优化方法...允许将TIME-WAIT sockets重新用于新TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets快速回收

72510

TCP套接编程——Python语言描述

这需要使用函数connect。需要注意是在TCP通信中,客户端必须在服务器之后运行,否则connect会失败。(因为无法与服务器建立连接)。...listen函数来设置服务器最大能接受请求数量。一旦服务器捕捉到一个请求,那么将会接受该TCP连接建立。server_socket套接只是用来监听请求,不是真正数据传输套接。...在accept函数捕捉到TCP连接请求以后,建立一个新用于数据传输套接data_socket。客户端和服务器数据传输就是在该套接上进行。...借用《计算机网络——自顶向下方法》这本书里面的一幅图来形象描述TCP连接建立过程。 ? 三次握手过程是于欢迎套接之间进行,真正数据传输是在新套接上进行。...实质上,套接就是管道一个升级版本。只不过管道只能在本机进程之间进行数据传输,套接能在网络上主机中进行通信。

58420

Go中原始套接深度实践

介绍 原始套接(raw socket)是一种网络套接,允许直接发送/接收更底层数据包而不需要任何传输层协议格式。...平常我们使用较多套接(socket)都是基于传输层,发送/接收数据包都是不带TCP/UDP等协议头部。...当使用套接发送数据时,传输层在数据包前填充上面格式协议头部数据,然后整个发送到网络层,接收时去掉协议头部,把应用数据抛给上层。...如果想自己封装头部或定义协议的话,就需要使用原始套接,直接向网络层发送数据包。 为了便于后面理解,这里统一称应用数据为 payload,协议头部为 header,套接为socket。...其他 第二个参数 syscall.SOCK_RAW,表示使用原始套接,可以构建传输层协议头部,启用IP_HDRINCL的话,IP层协议头部也可以构造,就是上面区分传输层socket和网络层socket

2.9K20

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

在某些情况下,你可能会使用Wireshark(http://wireshark.org)监听流量,也可能会使用基于Python解决方案如Scapy。...在本文中,我们将使用原始套接来访问诸如IP 和ICMP 头等底层网络信息。在下面的例子中,我们只对IP 层和更高层感兴趣,因此我们不会去解码以太网头中信息。...Windows 和Linux 上包嗅探 在Windows 和Linux 上访问原始套接有些许不同,但我们更中意于在多平台部署同样嗅探器以实现更大灵活性。...我们将先创建套接对象,然后再判断程序在哪个平台上运行。在Windows 平台上,我们需要通过套接输入/输出控制(IOCTL)1设置一些额外标志,它允许在网络接口上启用混杂模式。...在第一个例子中,我们只需设置原始套接嗅探器,读取一个数据包,然后退出即可。 首先,我们通过构建套接对象对网络接口上数据包嗅探进行必要参数设置①。

1.3K20

基于TCP协议套接编程

) 1.服务器套接函数 方法 用途 s.bind() 绑定(主机,端口号)到套接 注:(127.0.0.1)表示本地ip s.listen() 开始TCP监听 s.accept() 被动接受TCP客户连接...,(阻塞式)等待连接到来 2.客户端套接函数 方法 用途 s.connect() 主动初始化TCP服务器连接 s.connect_ex() connect()函数扩展版本,出错时返回出错码,而不是抛出异常...数据 s.getpeername() 连接到当前套接远端地址 s.getsockname() 当前套接地址 s.getsockopt() 返回指定套接参数 s.setsockopt() 设置指定套接参数...s.close() 关闭套接 4.面向锁套接 方法 用途 s.setblocking() 设置套接阻塞与非阻塞模式 s.settimeout() 设置阻塞套接操作超时时间 s.gettimeout...() 得到阻塞套接操作超时时间 5.面向文件套接 方法 用途 s.fileno() 套接文件描述符 s.makefile() 创建一个与该套接相关文件 4.示例 1.服务端 import

79710

Python实现TCP协议套接多路复用

如果有同学已完成但老师还没问到他,就在座位上等着,老师仍按原来顺序逐个询问和检查,直到到达该同学时再检查他作业。容易得知,这样方式效率很低,并且资源极度浪费。...这样方式,每个同学作业可以立刻得到检查,但是每个分身功力都会比本体弱一点,并且每创建一个分身就会带走本体一部分能量值,这会对老师身体健康造成一定影响,如果创建太多分身会导致本体资源(CPU、...如果检查作业耗时较长,为避免学生等待时间过长,可以考虑创建几个分身,几个分身同时端坐于讲台之上,根据学生完成情况在机房内瞬移、穿梭。...================= Python标准库selector和selectors支持套接多路复用,使得可以在同一个线程中监听多个套接IO请求。...其中selector相对来说较为底层,一般建议直接使用selectors。 模拟场景: 服务器同时接收和处理多个客户端发来数据,输出收到数据并向客户端发送确认信息。 服务端代码: ?

1K40

PythonPython 网络编程 ( Socket 套接简介 | Socket 套接使用步骤 | Socket 套接服务端与客户端开发 )

一、Socket 套接简介 1、Socket 套接概念 Socket 套接 是一种 进程之间 通信机制 , 通过套接可以在 不同进程之间 进行数据交换 ; 在 网络编程 中 , Socket...套接 主要用于 客户端 与 服务器 之间 通信 , 大部分 网络相关应用程序 , 都使用到了 Socket 套接技术 ; 2、Socket 套接类型 套接有两种类型 : 流套接 : 提供了一个可靠...在 TCP/IP 协议中,流套接使用 TCP 协议进行数据传输。 数据报套接 : 提供了一种无连接、不可靠通信机制 , 数据 以独立数据包形式传输。...在 TCP/IP 协议中,数据报套接使用 UDP 协议进行数据传输。...3、Socket 套接使用步骤 Socket 套接使用步骤 : 创建套接 : 使用 套接 API 创建一个套接对象 , 一般由 编程语言 官方提供 标准 API ; 绑定 IP 地址和端口号

42920

完美解决Python套接编程时TCP断包与粘包问题

首先,来看一个代码,使用TCP协议,发送端发送一句话,接收端接收并显示,运行完全正常。 ? 接下来,把客户端代码稍微修改一下,连续发送多个数据, ?...在使用TCP协议进行传输时,会在有效数据前面增加大量头部信息来保证可靠传输,如果发送有效数据非常短,增加头部带来额外开销就非常大。...如果到网上(甚至一些书上)搜索资料,会说禁用Nagle算法就可以了,也就是设置套接属性启用TCP_NODELAY,非常简单。既然如此,那就赶紧用起来吧。...在Python中,标准库socket封装了套接编程需要功能,创建套接之后可以使用setsockopt来设置当前套接各种属性,其中就包括禁用断包和粘包延迟从而禁用Nagle算法。 ?...现在问题就是如何确保把数据长度有效传递给对方了,可以使用Python标准库struct把整数序列化为字节串发送给对方,而这个字节串长度固定为4,这样的话,接收端使用recv(4)接收到这个字节串再反序列化为整数就可以了

1.9K41

Socket编程基础-套接创建和使用

套接使用需要两个端点:一个是服务器端,另一个是客户端。服务器端是负责提供服务主机,客户端是向服务器发出请求主机。...创建套接创建套接基本步骤如下:导入socket模块在Python中,需要先导入socket模块才能使用套接。...# 创建一个IPv4套接sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)绑定套接如果要在服务器端使用套接,则需要将套接绑定到一个地址和端口上...# 将套接设置为监听状态,最大连接数为5sock.listen(5)使用套接使用套接可以实现不同主机之间或同一主机内进程之间通信。下面将介绍如何使用套接进行通信。...客户端客户端使用套接与服务器端建立连接,向服务器端发送请求,并接收服务器端响应。建立连接使用socket.connect()函数可以与服务器端建立连接。

68650

Windows套接CAsyncSocket类使用「建议收藏」

大家好,又见面了,我是你们朋友全栈君。...TCP编程服务器端一般步骤是: 1、创建一个CAsyncSocket或CSocket类或其子类对象A,用于监听客户端连接,然后通过Create函数设定端口号和协议类型为 SOCK_STREAM。...2、开启监听,用函数Listen(); 3、接收客户端上来连接,用函数Accept(&B);并且把连接连接对象存到B中,以便通信使用。...6、关闭网络连接B.Close; 8、关闭监听A.Close; TCP编程客户端一般步骤是: 1、创建一个CAsyncSocket或CSocket类或其子类对象C,用Create函数设定端口号和协议类型为...: UDP编程服务器端与客户端过程一样,因为不需要建立监听和连接,所以一般步骤都是: 1、创建一个CAsyncSocket或CSocket类或其子类对象A,用于监听客户端连接,然后通过Create

53820

Python 技术篇-socket套接实现两个窗口间消息传递,TCP实现

本篇介绍用 TCP 来实现。 socket实现客户端服务器消息传递有 TCP 和 UDP 两种方式。 TCP 可以实现客户端和服务器相互传递消息,UDP 只能由服务器向客户端传递消息。...创建一个 TCP 连接 socket 对象: socket(),没有参数就代表 TCP 连接。...下面这段是等待客户端连接,连接成功后返回新连接 conn,这就是与客户端连接,后续相互发消息用就是这个。客户端用 Socket_TCP.connect(addr) 与服务器连接。...= socket() # 创建套接 Socket_TCP.bind(addr) # 服务器用bind绑定本地,也算是服务器标识 print("Waitting...")...Socket_TCP.close() # 关闭套接 客户端代码: from socket import * host = "127.0.0.1" # 服务器地址,因为服务器也在本地,所以填本地地址了

75260

掌握Python网络编程:套接编程入门

它可以用于在计算机之间进行通信,无论是在同一台计算机上不同进程之间,还是在不同计算机之间。Python套接编程使用socket模块来实现。...下面是套接编程基本步骤:创建套接使用socket.socket()函数创建一个套接对象。绑定地址和端口:使用bind()方法将套接绑定到特定地址和端口。...发送和接收数据:使用套接send()和recv()方法进行数据发送和接收。2. TCP套接编程TCP(传输控制协议)是一种可靠面向连接协议,广泛用于互联网通信。...下面是使用TCP套接进行编程基本示例:import socket# 创建套接对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM...高级套接编程Python套接编程还支持一些高级功能,如使用select模块进行多路复用I/O、设置套接选项、使用线程或协程实现并发等。这些功能可以提升网络编程性能和灵活性。

19821

Python 技术篇-socket套接实现两个窗口间消息传递实例演示,TCP实现

上一篇:Python 技术篇-socket 套接实现服务器客户端消息传递,UDP 实现 本篇介绍用 TCP 来实现。 socket 实现客户端服务器消息传递有 TCP 和 UDP 两种方式。...TCP 可以实现客户端和服务器相互传递消息,UDP 只能由服务器向客户端传递消息。 创建一个 TCP 连接 socket 对象: socket(),没有参数就代表 TCP 连接。...下面这段是等待客户端连接,连接成功后返回新连接 conn,这就是与客户端连接,后续相互发消息用就是这个。客户端用 Socket_TCP.connect(addr) 与服务器连接。...= socket() # 创建套接 Socket_TCP.bind(addr) # 服务器用bind绑定本地,也算是服务器标识 print("Waitting...")...Socket_TCP.close() # 关闭套接 客户端代码: from socket import * host = "127.0.0.1" # 服务器地址,因为服务器也在本地,所以填本地地址了

3300

Python网络编程中套接名和DNS解析

这一次要讲的是套接名和DNS,并且还会涉及到网络数据发送接受和网络错误发生和处理。下面说套接名,在创建和部署每个套接对象时总共需要做5个主要决定,主机名和IP地址是其中最后两个。...第2个参数就是套接类型,然后我们解释一下套接类型,尽管TCP和UDP是AFINET协议族特有的,但是套接接口设计者决定基于数据报套接这一宏观概念创建一些更通用名字,这就是SOCKDGRAM...而下面要说getaddrinfo()这个工具,这个工具除了一些特定工作,否则这个函数将是我们用来将用户指定主机名和端口号转换为可供套接方法使用地址时所需唯一方法。...至于更详细一些东西,可以看相关文档。 下面这段代码是把上面内容结合起来,设计了一个简单例子。下面是使用getaddrinfo()创建并连接套接。...解析邮箱域名是多数Python程序中对原始DNS查询一个应用。 下面拿邮箱域名解析规则RFC5321来说,如果存在MX记录,则必须尝试与SMTP来进行通信。

3.4K70

浅谈原始套接 SOCK_RAW 内幕及其应用(port scan, packet sniffer, syn flood, icmp flood)

buffer,对一般套接,如SOCK_STREAM, SOCK_DGRAM 来说,此时缓冲区只有user data,其他各层头部已经被去除,而对于SOCK_RAW 来说是IP head + IP...0 , &saddr , &saddr_size);     //Now process the packet     ProcessPacket(buffer , data_size); } 即创建原始套接...Error message : %s \n" , errno , strerror(errno));         exit(0);     } } 创建一个原始套接s,开启IP_HDRINCL 选项...另开一个线程创建另一个原始套接,仿照packet sniffer 进行数据包接收,分解tcp 头部看是否syn == 1 && ack == 1 && dest_addr == src_addr,...如果不追求效率,很简单做法是直接用普通套接,循环端口去connect,成功就表明端口是打开,只是三次握手完整了一回。

3.5K00

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

所以对于这个题目,最直接想法就是由应用层自己负责TCP连接。为了能够收到TCP握手数据包,可以尝试使用原始套接来接收IP报文,这样就可以在应用层替代内核做TCP三次握手了。...当没有对于TCP 套接处于listen状态时,使用raw socket处理握手报文时,即使收到了syn报文并给对端发送了syn+ack报文,也无法完成连接。因为内核一般会提前发送RST中断该连接。...内核在ip_local_deliver_finish先将报文复制一份给原始套接,然后会继续后面的处理,进入tcp接收函数tcp_v4_rcv。在这个函数中,要进行套接查找。 ?...在不能使用iptable前提下,这意味着在tcp_v4_rcv中,要能够找到对应套接。 没有listen状态套接,内核是否能够完成TCP三次握手呢?...只需要对三次握手深入思考一下,就可以得到答案。在正常三次握手中,当服务端回复syn+ack时,客户端实际上也没有处于listen状态套接,但却可以完成三次握手

1.9K30

Python 套接详解:与网络通信温柔邂逅

Python 世界里,有一个神奇工具,它就像是一座桥梁,将不同计算机连接起来,实现数据传输和通信,它就是套接(Socket)。...套接,就像是网络通信使者,它使得不同计算机能够在网络上相互传递信息,进行数据交流和共享。在 Python 中,我们可以通过 socket 模块来使用套接,轻松地实现网络通信功能。...下面是一个简单示例,展示了如何使用 Python 创建一个服务器和一个客户端,进行简单通信。...套接类型 在 Python 中,套接可以分为不同类型,常见包括流式套接(socket.SOCK_STREAM)和数据报套接(socket.SOCK_DGRAM)。...结语:套接,连接心与心桥梁 通过本文介绍,相信你已经对 Python套接基本概念和用法有了一定了解。

10010

SeedLab——TCPIP Attack Lab

C 实现 SYN Flood 使用原始套接来实现伪造IP报文实现一个SYN-Flood攻击程序。 定义TCP报头结构和伪报头结构。...AF_INET参数指定了使用IPv4协议,SOCK_RAW参数指定了套接类型为原始套接,IPPROTO_TCP参数指定了传输层协议为TCP。如果socket函数返回值为-1,表示创建套接失败。...通过setsockopt函数设置套接选项。setsockopt函数用于设置套接各种选项,这里使用IP_HDRINCL选项来告诉操作系统在发送数据时不自动添加IP头部。...// 创建原始套接 int make_raw_socket() { int fd; int on = 1; // 创建一个原始套接 fd = socket(AF_INET...然后使用sendto函数将我们自己构造SYN数据包通过创建原始套接发往目标地址。

42910
领券