TCP dan UDP
Memahami TCP: Tulang Punggung Komunikasi Internet yang Andal
Di dunia jaringan komputer, Transmission Control Protocol (TCP) adalah salah-satu protokol inti yang menjadi fondasi utama cara data dikirim dan diterima melalui internet. Anggaplah TCP sebagai layanan pos yang sangat teliti dan andal. Ia tidak hanya mengirimkan paket data, tetapi juga memastikan setiap paket tiba di tujuan dengan selamat, dalam urutan yang benar, dan tanpa kerusakan.
TCP bersifat connection-oriented, yang berarti sebelum data apa pun dikirim, sebuah "sesi" atau koneksi yang stabil harus dibuat terlebih dahulu antara pengirim dan penerima. Proses pembentukan koneksi ini dikenal sebagai Three-Way Handshake.
Fitur Utama TCP
Handal (Reliable): TCP menggunakan mekanisme seperti nomor urut (sequence number) dan acknowledgment (ACK). Setiap kali sebuah segmen data dikirim, ia diberi nomor. Penerima akan mengirimkan ACK untuk memberitahu pengirim bahwa data telah diterima. Jika pengirim tidak menerima ACK dalam rentang waktu tertentu, ia akan mengirim ulang data tersebut. Inilah yang menjamin pengiriman data.
Koneksi Terurut (Ordered): Karena setiap segmen data memiliki nomor urut, penerima dapat menyusun kembali data sesuai urutan yang benar, bahkan jika paket-paket data tersebut tiba di tujuan secara acak.
Kontrol Aliran (Flow Control): TCP memastikan pengirim tidak "membanjiri" penerima dengan data. Penerima secara berkala memberitahu pengirim berapa banyak data (disebut window size) yang sanggup ia terima pada satu waktu. Ini mencegah data hilang karena buffer penerima penuh.
Pemeriksaan Kesalahan (Error Checking): Setiap segmen TCP menyertakan nilai checksum. Penerima akan menghitung checksum dari data yang diterima dan membandingkannya dengan checksum yang dikirim. Jika nilainya tidak cocok, data dianggap rusak dan akan diabaikan (dan akan dikirim ulang oleh pengirim karena tidak menerima ACK).
Proses Three-Way Handshake
Proses ini adalah "jabat tangan" digital untuk memulai koneksi TCP yang andal:
SYN (Synchronize): Klien (pengirim) mengirimkan segmen dengan flag SYN ke server (penerima) untuk memulai koneksi dan menyinkronkan nomor urut.
SYN-ACK (Synchronize-Acknowledge): Server merespons dengan segmen yang memiliki flag SYN dan ACK. Ini menandakan bahwa server setuju untuk berkomunikasi dan mengakui permintaan dari klien.
ACK (Acknowledge): Klien mengirimkan segmen ACK kembali ke server. Setelah ini diterima, koneksi pun terbentuk dan stabil, siap untuk transfer data.
Praktik: Membuat TCP Listener Manual
Sekarang, mari kita lihat bagaimana cara membuat server sederhana yang "mendengarkan" (listen) koneksi TCP yang masuk menggunakan Bash dan Go. Server ini tidak akan menjadi server web HTTP, melainkan listener TCP murni pada level yang lebih rendah.
1. TCP Listener dengan Bash
Di lingkungan Linux atau macOS, Bash dapat memanfaatkan fitur internal atau utilitas umum seperti nc (netcat) untuk membuat listener TCP dengan cepat. Ini sangat berguna untuk debugging atau tugas sederhana.
Menggunakan /dev/tcp
Bash memiliki fitur virtual device yang memungkinkan kita membuka koneksi TCP seolah-olah itu adalah sebuah file.
Kode:
Cara Menjalankannya:
Simpan kode di atas ke dalam file, misalnya
listener.sh.Berikan izin eksekusi:
chmod +x listener.sh.Jalankan skrip:
./listener.sh.Buka terminal lain dan hubungkan ke listener tersebut menggunakan
netcatatautelnet:Atau:
Setelah terhubung, server Bash akan mengirimkan balasan "Hello from Bash TCP Listener!" dan koneksi akan ditutup. Skrip akan siap menerima koneksi berikutnya.
2. TCP Listener dengan Go (Golang)
Go, dengan pustaka standarnya (net), sangat cocok untuk membangun aplikasi jaringan berperforma tinggi. Membuat listener TCP manual sangatlah mudah dan transparan.
Kode:
Cara Menjalankannya:
Simpan kode di atas ke dalam file
main.go.Jalankan dari terminal:
go run main.go.Buka terminal lain dan hubungkan menggunakan
netcat:Sekarang, ketikkan pesan apa pun di terminal
ncdan tekan Enter. Pesan tersebut akan muncul di konsol server, dan server akan mengirimkan balasan "Pesanmu diterima!" kembali kenc.
Perbedaan utama dalam contoh Go adalah kemampuannya menangani banyak koneksi secara bersamaan (konkuren) berkat penggunaan goroutine (go handleConnection(conn)). Ini adalah pendekatan yang jauh lebih skalabel dan kuat dibandingkan skrip Bash sederhana.
Melanjutkan pembahasan dari TCP, sekarang mari kita selami UDP, "saudaranya" yang lebih cepat dan simpel, beserta contoh praktis dan sebuah studi kasus lengkap menggunakan Go.
Memahami UDP: Protokol Cepat untuk Dunia Real-Time
Jika TCP adalah layanan pos terdaftar yang teliti, maka User Datagram Protocol (UDP) adalah seperti mengirim kartu pos. Anda menulis pesan, menempelkan alamat, dan mengirimkannya. Prosesnya sangat cepat dan efisien, tetapi tidak ada jaminan bahwa kartu pos itu akan sampai, tidak ada pemberitahuan pengiriman, dan jika Anda mengirim beberapa kartu pos, mereka bisa saja tiba tidak berurutan.
UDP bersifat connectionless. Artinya, tidak ada "jabat tangan" (handshake) yang diperlukan sebelum data dikirim. Pengirim langsung menembakkan datagram (paket) ke penerima, dengan harapan paket tersebut akan sampai. Inilah yang membuatnya mendapat julukan protokol "fire-and-forget".
Fitur Utama UDP
Connectionless (Tanpa Koneksi): Tidak ada proses handshake. Aplikasi dapat langsung mengirim data, mengurangi latensi awal secara signifikan.
Tidak Andal (Unreliable): UDP tidak memiliki mekanisme acknowledgment (ACK) atau pengiriman ulang. Jika sebuah paket hilang di tengah jalan, UDP tidak akan mengetahuinya dan tidak akan mengirimnya kembali.
Tidak Terurut (Unordered): Tidak ada nomor urut. Jika paket A dikirim sebelum paket B, tidak ada jaminan paket A akan tiba lebih dulu.
Ringan (Lightweight): Karena tidak ada mekanisme untuk keandalan dan urutan, header UDP jauh lebih kecil dan sederhana dibandingkan TCP. Ini berarti overhead (data tambahan selain data inti) lebih sedikit, membuat transmisi lebih efisien.
Sangat Cepat: Kombinasi dari semua fitur di atas membuat UDP memiliki latensi yang sangat rendah, ideal untuk aplikasi yang sensitif terhadap waktu.
Kapan Sebaiknya Menggunakan UDP?
Meskipun terdengar "buruk" karena tidak andal, fitur-fitur ini justru menjadi kekuatan UDP dalam skenario yang tepat. UDP unggul ketika kecepatan lebih penting daripada keandalan 100%.
Streaming Video dan Audio: Kehilangan beberapa frame video atau milidetik audio (yang sering tidak disadari pengguna) jauh lebih baik daripada menghentikan seluruh stream untuk menunggu paket yang hilang (buffering).
Game Online: Dalam game multipemain yang cepat, data posisi pemain terbaru jauh lebih berharga daripada data posisi yang lama tapi terjamin. Menunggu paket lama yang hilang hanya akan menyebabkan lag.
DNS (Domain Name System): Proses query DNS sangat sederhana (tanya nama, dapatkan alamat IP). Jika permintaan gagal, jauh lebih efisien bagi aplikasi untuk mengirim ulang permintaan daripada membangun koneksi TCP yang berat.
Monitoring dan Metrik: Mengirim data telemetri atau log dari ribuan perangkat. Jika beberapa paket metrik hilang, biasanya tidak menjadi masalah besar dalam gambaran keseluruhan.
Praktik: Server dan Klien UDP dengan Go
Go menyediakan dukungan kelas satu untuk jaringan UDP melalui package net. Berbeda dengan TCP yang menggunakan net.Listener dan net.Conn, UDP biasanya menggunakan net.PacketConn.
1. Server/Listener UDP Sederhana
Server UDP tidak "menerima koneksi" seperti TCP. Ia hanya mengikat (bind) dirinya ke sebuah port dan mendengarkan datagram apa pun yang masuk ke port tersebut dari alamat mana pun.
Kode (server.go):
2. Klien/Pengirim UDP Sederhana
Klien UDP hanya perlu mengetahui alamat server tujuan untuk mengirim datagram.
Kode (client.go):
Cara Menjalankannya:
Buka terminal pertama, jalankan server:
go run server.goBuka terminal kedua, jalankan klien:
go run client.goAnda akan melihat server mencatat pesan dari klien, dan klien mencatat balasan dari server. Anda juga bisa menggunakan
netcatuntuk berinteraksi dengan server:nc -u localhost 8080.
Studi Kasus Lengkap: Sistem Pengumpul Metrik Sederhana
Mari kita buat kasus penggunaan yang lebih realistis untuk UDP: sebuah layanan pengumpul metrik. Bayangkan Anda memiliki banyak server atau perangkat (agent) yang perlu mengirim metrik (misalnya, penggunaan CPU, memori) secara berkala ke satu server pusat (collector).
UDP sangat cocok di sini karena:
Mengirim metrik harus cepat dan ber-overhead rendah.
Kehilangan satu atau dua data metrik biasanya tidak masalah.
Tidak perlu membangun dan memelihara koneksi TCP yang mahal dari setiap agent.
Kode Collector (collector.go)
collector.go)Server ini hanya akan mendengarkan metrik yang masuk dan mencetaknya ke konsol.
Kode Agent (agent.go)
agent.go)Agent ini akan secara berkala mengirim metrik palsu (sebagai simulasi) ke collector.
Cara Menjalankan Studi Kasus:
Terminal 1 (Collector):
Terminal 2 (Agent):
Kembali ke Terminal 1:
Anda akan melihat output dari collector yang menerima metrik dari agent.
Studi kasus ini secara sempurna mendemonstrasikan kekuatan UDP: komunikasi yang efisien, ber-overhead rendah, dan stateless untuk kasus di mana keandalan absolut bukanlah prioritas utama.
Last updated