socket real examples example python sockets tcp udp

python - real - Punto de referencia de la latencia del socket TCP vs. UDP



socket python 3 example (1)

Implementé un pequeño punto de referencia para la comunicación de socket a través de TCP y UDP en Python. Sorprendentemente, TCP es casi exactamente el doble de rápido que UDP.

Para evitar los efectos de enrutamiento, el servidor y el cliente se ejecutan en la misma máquina Unix, pero en diferentes subprocesos.

Tal vez el código es útil. Aquí está el código del servidor:

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()

Entonces puede ejecutar start_TCP_server() o start_UDP_server() .

En el lado del cliente, el código es:

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()

Al igual que para el servidor, puede iniciar el benchmark mediante benchmark_TCP() o benchmark_UDP() .

Los resultados son alrededor de 25 μs para TCP , y alrededor de 54 μs para UDP en Unix e incluso peor para Windows (alrededor de 30 μs para TCP y más de 200 μs para UDP). ¿Por qué? Esperaría una ventaja mínima para UDP.


Su socket TCP está conectado pero su socket UDP no. Esto significa procesamiento adicional para cada envío / recepción en el socket UDP. Llamada de connect en cada lado para el socket UDP, al igual que llame a connect / accept en el socket TCP.

Programas como iperf hacen esto para medir con precisión.