Solusi Error Python Socket Reset By Peer (Connection Reset)

Penyebab Utama ConnectionResetError

Error ConnectionResetError: [Errno 104] Connection reset by peer pada Python terjadi ketika sisi lawan (remote peer) menutup koneksi secara paksa saat proses pengiriman atau penerimaan data sedang berlangsung. Ini bukan sekadar bug kode, melainkan sinyal bahwa protokol TCP telah menerima paket RST (Reset) dari server atau client di ujung lain.

Penyebab paling umum meliputi: server mengalami crash, firewall memutus koneksi idle, timeout pada load balancer, atau data yang dikirim tidak sesuai dengan ekspektasi protokol aplikasi lawan.

Tabel Analisis Penyebab & Solusi

PenyebabIndikasiSolusi Teknis
Server CrashKoneksi putus tiba-tibaImplementasi retry logic & monitoring
Firewall/NATTimeout setelah idleGunakan TCP Keepalive
Data MismatchProtokol tidak sesuaiValidasi header & format payload
Graceful ShutdownPeer menutup socketTangani exception dengan try-except

Implementasi Penanganan Error

Untuk menangani error ini secara elegan, Anda wajib menggunakan blok try-except dan memastikan socket ditutup dengan benar. Berikut adalah contoh implementasi yang benar:

import socket

def send_data(data):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    try:
        client.connect(('example.com', 80))
        client.sendall(data.encode())
    except ConnectionResetError:
        print("Koneksi direset oleh peer. Melakukan rekoneksi...")
        # Tambahkan logika retry di sini
    finally:
        client.close()

Langkah Troubleshooting Lapangan

  1. Cek Status Server: Pastikan aplikasi server tidak mengalami segmentation fault atau kehabisan memori.
  2. Gunakan TCP Keepalive: Aktifkan SO_KEEPALIVE pada socket untuk mencegah firewall memutus koneksi yang dianggap idle.
  3. Analisis Paket dengan Wireshark: Jalankan sudo tcpdump -i any port [PORT] untuk melihat apakah paket RST dikirim oleh server atau oleh perantara (firewall/load balancer).
  4. Validasi Payload: Pastikan ukuran data yang dikirim tidak melebihi buffer yang diizinkan oleh server tujuan.

Pentingnya Graceful Shutdown

Seringkali, error ini muncul karena client mencoba membaca data dari socket yang sudah ditutup oleh server. Pastikan server Anda mengirimkan sinyal penutupan yang benar (FIN packet) sebelum memutus koneksi. Jika Anda mengontrol kedua sisi (client dan server), pastikan urutan penutupan socket dilakukan secara sinkron untuk menghindari race condition yang memicu RST.