TCP 与 UDP 套接字延迟基准
TCP vs. UDP socket latency benchmark
我在 Python 中实现了一个通过 TCP 和 UDP 进行套接字通信的小型基准测试。令人惊讶的是,TCP 的速度几乎是 UDP 的两倍。
为了避免路由影响,服务器和客户端运行在同一台 Unix 机器上,但在不同的线程上。
也许代码有用。这是服务器代码:
import socket
import sys
host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
def start_UDP_server():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(server_address)
print("UDP server is running...")
while True:
data, from_address = socket_UDP.recvfrom(buffersize)
if not data: break
socket_UDP.sendto(data, from_address)
socket_UDP.close()
def start_TCP_server():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.bind(server_address)
socket_TCP.listen(1)
print("TCP server is running...")
while True:
client, client_address = socket_TCP.accept()
while True:
data = client.recv(buffersize)
if not data: break
client.sendall(data)
client.close()
因此您可以 运行 start_TCP_server()
或 start_UDP_server()
。
客户端代码为:
import socket
import sys
import time
host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
client_address = (host, port+1)
N = 1000000
def benchmark_UDP():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(client_address)
print("Benchmark UDP...")
duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_UDP.sendto(b, server_address)
data, from_address = socket_UDP.recvfrom(buffersize)
duration += time.time() - start
if data != b:
print("Error: Sent and received data are bot the same")
print(duration*pow(10, 6)/N, "µs for UDP")
def benchmark_TCP():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.connect(server_address)
print("Benchmark TCP...")
duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_TCP.sendall(b)
data = socket_TCP.recv(buffersize)
duration += time.time() - start
if data != b:
print("Error: Sent and received data are bot the same")
print(duration*pow(10, 6)/N, "µs for TCP")
socket_TCP.close()
与服务器一样,您可以通过 benchmark_TCP()
或 benchmark_UDP()
开始基准测试。
TCP 的结果约为 25 µs,Unix 上的 UDP 约为 54 µs,[=35= 更糟](TCP 大约 30 µs,UDP 超过 200 µs)。为什么?我希望 UDP 的优势很小。
您的 TCP 套接字已连接,但 UDP 套接字未连接。这意味着对 UDP 套接字上的每个 send/receive 进行额外处理。在 each side 上为 UDP 套接字调用 connect
,就像在 TCP 套接字上调用 connect
/accept
一样。
类似 iperf
的程序会执行此操作以准确测量。
我在 Python 中实现了一个通过 TCP 和 UDP 进行套接字通信的小型基准测试。令人惊讶的是,TCP 的速度几乎是 UDP 的两倍。
为了避免路由影响,服务器和客户端运行在同一台 Unix 机器上,但在不同的线程上。
也许代码有用。这是服务器代码:
import socket
import sys
host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
def start_UDP_server():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(server_address)
print("UDP server is running...")
while True:
data, from_address = socket_UDP.recvfrom(buffersize)
if not data: break
socket_UDP.sendto(data, from_address)
socket_UDP.close()
def start_TCP_server():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.bind(server_address)
socket_TCP.listen(1)
print("TCP server is running...")
while True:
client, client_address = socket_TCP.accept()
while True:
data = client.recv(buffersize)
if not data: break
client.sendall(data)
client.close()
因此您可以 运行 start_TCP_server()
或 start_UDP_server()
。
客户端代码为:
import socket
import sys
import time
host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
client_address = (host, port+1)
N = 1000000
def benchmark_UDP():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(client_address)
print("Benchmark UDP...")
duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_UDP.sendto(b, server_address)
data, from_address = socket_UDP.recvfrom(buffersize)
duration += time.time() - start
if data != b:
print("Error: Sent and received data are bot the same")
print(duration*pow(10, 6)/N, "µs for UDP")
def benchmark_TCP():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.connect(server_address)
print("Benchmark TCP...")
duration = 0.0
for i in range(0, N):
b = bytes("a"*buffersize, "utf-8")
start = time.time()
socket_TCP.sendall(b)
data = socket_TCP.recv(buffersize)
duration += time.time() - start
if data != b:
print("Error: Sent and received data are bot the same")
print(duration*pow(10, 6)/N, "µs for TCP")
socket_TCP.close()
与服务器一样,您可以通过 benchmark_TCP()
或 benchmark_UDP()
开始基准测试。
TCP 的结果约为 25 µs,Unix 上的 UDP 约为 54 µs,[=35= 更糟](TCP 大约 30 µs,UDP 超过 200 µs)。为什么?我希望 UDP 的优势很小。
您的 TCP 套接字已连接,但 UDP 套接字未连接。这意味着对 UDP 套接字上的每个 send/receive 进行额外处理。在 each side 上为 UDP 套接字调用 connect
,就像在 TCP 套接字上调用 connect
/accept
一样。
类似 iperf
的程序会执行此操作以准确测量。