Panduan Praktis Memahami TCP Socket untuk Backend Engineer
AW
Axel W

Dipublikasikan 6 Juni 2026

Panduan Praktis Memahami TCP Socket untuk Backend Engineer

Jika kamu bekerja di backend, DevOps, atau platform engineering, memahami cara kerja TCP socket adalah fundamental yang tidak bisa dilewatkan. Banyak developer langsung menggunakan framework web seperti Flask, Express, atau Django tanpa memahami apa yang terjadi di lapisan bawah. Padahal, semua framework tersebut pada akhirnya berkomunikasi melalui socket yang sama. HTTP request yang kamu kirim dari browser melewati socket. Database connection yang dibuat oleh ORM juga melewati socket. Memahami abstraction ini akan membantu kamu memahami timeout, connection pooling, load balancing, dan berbagai masalah jaringan lainnya yang sering muncul di production.

Dalam tutorial ini, kita akan membangun TCP server dan client dari nol menggunakan Python. Tidak ada dependency eksternal, hanya modul socket bawaan. Tujuannya adalah memahami alur kerja socket: membuat, bind, listen, accept, mengirim data, dan menutup koneksi. Semua ini menggunakan API Berkeley Socket yang menjadi standar di hampir semua sistem operasi modern.

Sumber gambar: iximiuz Labs

Apa Itu TCP Socket?

Socket adalah abstraksi yang disediakan oleh sistem operasi untuk memungkinkan dua proses berkomunikasi. Socket bisa digunakan untuk komunikasi antar proses di mesin yang sama (IPC) atau antar mesin melalui jaringan. TCP socket secara spesifik menjamin aliran byte yang terurut, reliable, dan memiliki error checking. Protokol TCP bertanggung jawab untuk memastikan data sampai secara berurutan tanpa kehilangan atau duplikasi.

HTTP, gRPC, SSH, dan Redis protocol semua berjalan di atas TCP. Yang membedakan mereka adalah cara mereka memaknai byte yang lewat. TCP sendiri tidak peduli apakah yang dikirim adalah request HTTP atau query PostgreSQL. Tugas TCP hanya satu: menyediakan pipa byte yang andal antara dua endpoint. Makna dari byte-byte tersebut ditentukan oleh protokol level aplikasi yang lebih tinggi. Karena alasan inilah HTTP server, database server, cache server, dan echo server kecil memiliki bentuk yang sangat mirip di lapisan jaringan.

Persiapan Environment

Kamu hanya butuh Python 3 yang sudah terinstall. Tidak ada library tambahan. Pastikan kamu bisa menjalankan script Python di terminal atau command prompt. Untuk testing, kita akan menjalankan server dan client di mesin yang sama menggunakan loopback interface 127.0.0.1. Jika ingin menguji antar mesin, ganti alamat IP dengan IP mesin server di jaringan lokal.

Langkah 1: Membuat Server Socket

Pertama, buat file server.py dan tulis kode berikut untuk membuat server socket:

import socket

serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=0)
serv_sock.bind(('0.0.0.0', 6543))
serv_sock.listen(10)

socket.AF_INET menunjukkan penggunaan IPv4. SOCK_STREAM berarti kita menggunakan TCP. bind() mengikat socket ke alamat IP dan port tertentu. Di sini kita menggunakan 0.0.0.0 agar server menerima koneksi dari semua interface jaringan yang tersedia. listen(10) mengubah socket menjadi mode listening dengan backlog 10, artinya OS bisa mengantrikan hingga 10 koneksi yang belum di-accept.

Parameter backlog ini sering diabaikan. Fungsinya adalah menentukan ukuran antrian koneksi yang sudah diestablis oleh OS tetapi belum diambil oleh aplikasi. Jika antrian penuh, koneksi baru akan ditolak atau diabaikan tergantung konfigurasi OS. Ini adalah mekanisme penting untuk menghadapi burst traffic tanpa langsung menolak client.

Langkah 2: Menerima Koneksi Client

Setelah server siap, tambahkan loop untuk menerima koneksi masuk:

while True:
    client_sock, client_addr = serv_sock.accept()
    print('New connection from', client_addr)
    chunks = []
    while True:
        data = client_sock.recv(2048)
        if not data:
            break
        chunks.append(data)
    client_sock.sendall(b''.join(chunks))
    client_sock.close()

Perhatikan bahwa accept() mengembalikan dua objek: client_sock (socket baru untuk berkomunikasi dengan client) dan client_addr (alamat client). Socket serv_sock tetap berada di mode listening untuk menerima client berikutnya. Ini adalah konsep kunci: satu socket untuk listen, socket lain untuk setiap koneksi yang aktif.

Socket client pada sisi server memiliki pasangan peer endpoint di sisi client. Keduanya memiliki jenis yang sama. Data bisa ditulis dan dibaca dari kedua sisi. Menutup salah satu socket tidak mempengaruhi socket listening, sehingga server bisa terus menerima koneksi baru.

Langkah 3: Membuat Client Socket

Buat file client.py di mesin lain atau di mesin yang sama dengan server:

import socket

client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(('127.0.0.1', 6543))
client_sock.sendall(b'Hello, world')
client_sock.shutdown(socket.SHUT_WR)

chunks = []
while True:
    data = client_sock.recv(2048)
    if not data:
        break
    chunks.append(data)
print('Received', repr(b''.join(chunks)))
client_sock.close()

connect() melakukan TCP handshake dengan server. Handshake adalah pertukaran paket kontrol yang menegosiasikan parameter koneksi. Setelah berhasil, data bisnis bisa mulai mengalir. shutdown(SHUT_WR) memberi tahu server bahwa client sudah selesai mengirim data. Tanpa ini, server bisa saja menunggu data terus-menerus karena tidak tahu client sudah selesai.

Perlu diperhatikan bahwa setiap socket bisa diidentifikasi dengan dua pasang angka: IP lokal dan port lokal, serta IP remote dan port remote. Untuk melihat alamat peer, gunakan getpeername(). Untuk alamat lokal, gunakan getsockname(). Port di sisi client biasanya adalah ephemeral port yang ditentukan oleh OS client secara otomatis.

Langkah 4: Memahami Buffer dan Partial Read

Salah satu kesalahpahaman umum adalah menganggap recv() selalu mengembalikan semua data sekaligus. Faktanya, recv() mengembalikan data segera setelah ada byte yang tersedia di buffer penerima. Jika client mengirim 1800 byte, recv() bisa saja mengembalikan 1500 byte di panggilan pertama dan 300 byte di panggilan berikutnya. Hal ini terjadi karena TCP mengirim data dalam segment yang ukurannya bergantung pada network conditions dan Maximum Segment Size (MSS).

Untuk itu, gunakan loop untuk mengumpulkan semua chunk hingga menerima tanda akhir koneksi. Alternatifnya, gunakan protokol level aplikasi yang mendefinisikan panjang pesan atau delimiter tertentu. Python menyediakan sendall() yang menangani loop pengiriman di bawah hood, tetapi untuk penerimaan tetap harus dihandle manual atau menggunakan framework yang lebih tinggi.

Langkah 5: Testing dan Troubleshooting

Jalankan server terlebih dahulu di satu terminal:

python3 server.py

Kemudian di terminal lain, jalankan client:

python3 client.py

Jika output client menampilkan Received b'Hello, world', maka server echo kamu sudah berfungsi dengan baik. Jika gagal, periksa beberapa hal berikut: apakah port 6543 sudah terbuka di firewall? Apakah port tersebut tidak digunakan oleh proses lain? Gunakan netstat -tlnp atau lsof -i :6543 untuk memeriksa. Jika testing antar mesin, pastikan keduanya terhubung dalam jaringan yang sama dan IP address yang digunakan sudah benar.

Kesimpulan

Memahami TCP socket bukanlah sekadar nostalgia teknis. Ini adalah fondasi yang menjelaskan mengapa framework web berperilaku seperti mereka, mengapa connection timeout terjadi, dan bagaimana load balancer bekerja. Setiap backend engineer yang serius harus melalui latihan ini minimal sekali. Pengetahuan ini juga membantu saat mendebug masalah koneksi database, memahami cara kerja reverse proxy, dan mengoptimalkan network performance di aplikasi production.

Untuk belajar lebih lanjut, kunjungi tutorial asli dari iximiuz Labs. Referensi tambahan yang sangat direkomendasikan: Beej's Guide to Network Programming dan Python Socket Programming HOWTO.