导语

在项目测试中需要发送指定内容的数据包到目标位置,并且需要发送的数量极大,真实环境无法满足测试需求,但是以Python为基础语言,结合Socket和Scrapy便可以支撑测试,其中Socket可以支持大量数据包由本机发送给目标机,scapy则可以模拟发生源IP发送数据包给目标及,但每秒发送的速率和大小不及Socket,两个模块各有长处相辅相成。

Socket和Scapy

涉及到网络服务就离不开Socket以及Socket编程,除此之外还有爬虫框架Scrapy,本文主要概述用以上两种方式进行数据包的传递,两者均可以按照TCP和UDP的方式传输,但TCP传输入使用字节流的方式,UDP是数据包,所以在使用两种传输方式时编码也有一些差异。

Socket

socket也称作“套接字”,套接字格式:socket(family,type[,protocal])用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。可以列举中国移动等。

Python 提供了两个基本的 socket 模块保存,第一个是 Socket,它提供了标准的 BSD Sockets API,第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发(TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁)。

使用Internet协议进行通信,请使用AF_INET:TCP或UDP.这是迄今为止最常见的选择,。如果要在Internet协议层下面的最基本级别发送和接收消息,请使用PF_PACKET,例如,因为您自己正在实施协议,您的进程必须以root用户身份(或使用特殊功能)运行才能使用PF_PACKET。

我们选择连接方式的时候也可以选择TCP的SOCK_STREAM,他比UDP要可靠,但是相对应着开销会大。

python tcp是否发送成功 python发送tcp数据包_UDP

Scapy

scapy涉及了pf_packet套结字编程,路由以及面向对象设计等诸技术,它本身使用python编写。一般情况下接收报文需要遵从某一些协议,这样双方可以通过特定的粘包解包操作处理数据,很多情况自定义协议都是比较简单,先接收报文头,获取消息长度,再获取消息体,但是有很多协议写起来很麻烦,于是就用到scapy这个库,就可以每次获取一个报文,一般报文头信息都是类似的,都带有源地址,目标地址,消息长度。
Scrapy的官网地址是: link

Domo案例

Socket举例

需要引入的模块:import socket

python tcp是否发送成功 python发送tcp数据包_python_02

Scapy举例

需要引入的模块:from scapy.layers.inet import IP, UDP 和 from scapy.all import *,这样数据包就可以按照我们预先设定好的IP来发送数据包了。

python tcp是否发送成功 python发送tcp数据包_python_03

数据包乱码问题(python3的用法)

引入模块import importlib importlib.reload(sys)
如果还是发送的数据包乱码,就需要检查是否是发送的编码格式有问题,尝试.encode(‘GBK’)与.encode(‘UTF-8’)。
若修改了编码格式没有收到,那么就需要检查是否是发送的数据包过长了,当前发送数据包过长的是发不出去的。