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
| Penyebab | Indikasi | Solusi Teknis |
|---|---|---|
| Server Crash | Koneksi putus tiba-tiba | Implementasi retry logic & monitoring |
| Firewall/NAT | Timeout setelah idle | Gunakan TCP Keepalive |
| Data Mismatch | Protokol tidak sesuai | Validasi header & format payload |
| Graceful Shutdown | Peer menutup socket | Tangani 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
- Cek Status Server: Pastikan aplikasi server tidak mengalami segmentation fault atau kehabisan memori.
- Gunakan TCP Keepalive: Aktifkan
SO_KEEPALIVEpada socket untuk mencegah firewall memutus koneksi yang dianggap idle. - Analisis Paket dengan Wireshark: Jalankan
sudo tcpdump -i any port [PORT]untuk melihat apakah paketRSTdikirim oleh server atau oleh perantara (firewall/load balancer). - 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.