写端口-tcp udp不同方式发包和接包

最近一直在学习网络编程,今天把 socket部分做一个总结。

Python 的socket库可以实现不同协议不同地址的发包和收包,无奈资料很少,官方例子有限,大神博客很少提及, 经过一番尝试后,总结以下几点用法以便大家以后使用。

client端
import socket
import time
import random
import string

# 定义一些常量,变量名可以变。自己好记就行
buffer = 1024  # 发送缓冲区大小,这里是1KB
data_size = 128  # 每个UDP数据包的大小
bandwidth = 1  # 目标带宽,1 Mbps
PACKETS_PER_SECOND = bandwidth * 1024 * 1024 / (8 * data_size)  # 计算每秒需要发送的数据包数量

# 目标服务器的IP和端口
SERVER_IP = '127.0.0.1'  # 请替换为实际服务器IP
SERVER_PORT = 1245 # 请替换为实际端口

def generate_random_data(size):
    """生成随机数据,生成往UDP包中放的随机值"""
    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(size)).encode()

def udp_main():
    # 创建UDP套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print(f"Starting UDP bandwidth test to {SERVER_IP}:{SERVER_PORT} aiming for {bandwidth} Mbps...")
    start_time = time.time()
    packets_sent = 0

    try:
        while True:
            # 生成随机数据
            data = generate_random_data(data_size)
            # 发送数据包
            client_socket.sendto(data, (SERVER_IP, SERVER_PORT))
            #包计数
            packets_sent += 1
            # 控制发送速率以达到目标带宽
            elapsed_time = time.time() - start_time
            if elapsed_time >= 1:
                #实际带宽,怎么算需要记一下
                actual_bandwidth = (packets_sent * data_size * 8) / (elapsed_time * 1024 * 1024)
                print(f"Actual bandwidth: {actual_bandwidth:.2f} Mbps")
                #重新计算包
                packets_sent = 0
                start_time = time.time()
            time.sleep(1 / PACKETS_PER_SECOND)  # 等待,控制发送频率
    except KeyboardInterrupt:
        print("\nBandwidth test interrupted by user.")
    finally:
        client_socket.close()

def tcp_main():
    client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client_socket.connect((SERVER_IP, SERVER_PORT))
    start_time = time.time()
    packets_sent = 0
    try:
        while True:
            data = generate_random_data(data_size)
            client_socket.send(data)
            packets_sent += 1
            elapsed_time = time.time() - start_time
            if elapsed_time >= 1:
                client_socket.send("q".encode())
                packets_sent = 0
                start_time = time.time()
                acutalwidth = (packets_sent * data_size * 8) / (elapsed_time * 1024 * 1024)
                print(f"Actual bandwidth: {acutalwidth:.2f} Mbps")
            time.sleep(1/PACKETS_PER_SECOND)
    except KeyboardInterrupt:
        print("\nBandwidth test interrupted by user.")
    finally:
        client_socket.close()


if __name__ == "__main__":
    tcp_main(

server端

import socket

def Server_Socket():
    serverip = "0.0.0.0"
    serverport = 8080

    #1、2 创建UDP的socket
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server_socket.bind((serverip,serverport))

    print(f"udp server {serverip}:{serverport}")

    try:
        while True:
            #3、接收客户端发来的值
            data,addr = server_socket.recvfrom(1024)

            print(f"recv from {addr}:{data.decode('utf-8')}") #print的内容不用背
    except KeyboardInterrupt:
        print("^C received, shutting down the server") #无所谓不用背具体详情
    finally:
        server_socket.close()

def TCP_socket():
    serverip = "127.0.0.1"
    serverport = 1245
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_socket.bind((serverip,serverport))
    print(f"start listening:")
    server_socket.listen(1024)
    print(f"tcp socket: {serverip}:{serverport}")
    try:
        dataconn,addr = server_socket.accept()
        print(f"client{dataconn}:{addr}")
        while True:
            data = dataconn.recv(1024)
            print(f"recv from {addr},recv data:{data.decode('utf-8')}")
            if data.decode('utf-8') == "q":
                break
            dataconn.send("已送达".encode('utf-8'))
    except KeyboardInterrupt:
        print("^C received, shutting down the server")
    finally:
        server_socket.close()

if __name__ == "__main__":
    TCP_socket()
### 回答1: TCPUDP是网络传输层的两个主要协议,它们的特点和适用场景也不同TCP是一种面向连接的可靠协议,适用于需要可靠传输的数据,比如网络文件传输,邮件发送等。而UDP则是一种非面向连接的不可靠协议,适用于实时应用场景,比如视频、音频流传输。 发包工具是测试、验证网络协议、设备性能、网络性能等的必备工具。针对TCPUDP,市面上有许多流行的发包工具,如TCPing、Packet Sender、Hping、Tcpreplay、Iperf等等。 TCPing是一款用于测试TCP服务是否正常工作的发包工具,它通过向TCP服务发送请求并等待响应来测试TCP服务的响应时间和服务是否正常工作。 Packet Sender是一款轻量级的UDPTCP协议测试工具,可以发送文本和二进制数据包,并且可以方便地设置相关参数,如端口和协议类型等。 Hping是一款常用的命令行式网络发包工具,支持TCPUDP、ICMP协议等,可以用于测试网络的带宽和延迟等参数。 Tcpreplay是一款能够重新发送已经捕获的TCPUDP流量包的工具,常用于网络和应用性能测试和改进,它可以模拟各种网络流量、提高应用性能、验证网络设备功能和安全性等功能。 Iperf是一种网络性能测试工具,支持TCPUDP协议,允许在网络中不同的节点之间进行数据传输测试,可测量网络带宽、延迟、吞吐量等。 总之,TCPUDP发包工具是网络工程师必备的工具之一,它们可以帮助我们更好地了解网络的质量和性能,从而更好地维护和优化网络。 ### 回答2: TCPUDP是互联网协议中最常用的两种传输层协议,其中TCP是面向连接的可靠协议,UDP则是不可靠协议。发包工具可以模拟客户端或服务端向对方发送TCPUDP数据包,以测试网络通信的稳定性和性能。 常见的TCPUDP发包工具包括: 1. TCPing:TCPing是一款基于TCP协议的发包工具,它可以模拟TCP客户端向服务端发送数据包,并计算出数据包来回时间和丢包率等信息。通过TCPing可以快速检测TCP连接是否正常,也可以用于TCP网络性能压力测试。 2. iPerf:iPerf是一款流量测试工具,它可以对TCPUDP传输进行测试。iPerf通过发送大量数据包来测试网络的吞吐量、延迟和丢包率等性能指标。iPerf可以模拟多个并发连接测试,也可以对不同带宽和MTU的连接进行测试。 3. Hping:Hping是一款命令行发包工具,可以模拟TCPUDP、ICMP等不同协议的数据包发送。它可以进行各种网络安全测试,如端口扫描、DDoS攻击等。 4. Netcat:Netcat是一款多功能的命令行网络工具,可以实现TCP/UDP端口扫描、数据传输、端口转发等功能。Netcat可以通过手动编数据包,模拟客户端或服务端发送数据包进行测试。 通过TCPUDP发包工具,我们可以模拟真实场景下的网络通信情况,对网络性能和稳定性进行测试分析,及时发现和解决问题,提高网络的可靠性和效率。 ### 回答3: TCPUDP网络协议中常用的两种传输层协议。在进行网络通信时,往往需要使用相应的发包工具对TCPUDP进行测试和调试。 对于TCP协议,主要使用的发包工具为TCPProbe、tcptraceroute等。TCPProbe可以对TCP协议进行各种测试,包括测试连接效率、延迟、缓存大小等。tcptraceroute可以对TCP连接进行路径追踪,便于排查网络问题。 对于UDP协议,常用的发包工具有hping、nmap等。hping可以用于对UDP端口进行探测、DOS攻击模拟、流量控制等测试,而nmap则可用于扫描UDP端口。 此外,Wireshark是一款强大的网络协议分析软件,可用于对TCPUDP协议的数据包进行捕获和分析。使用Wireshark能够深入了解网络协议的通信过程,帮助用户精确分析网络问题。 总之,针对不同TCPUDP协议测试需求,我们可以选择不同发包工具进行调试、分析和优化,确保网络通信的高效、稳定和安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值