Tenaga Inti Internet, TCP
(cefboud.com)- TCP (Transmission Control Protocol) adalah protokol inti internet yang memungkinkan transmisi data yang andal dan berurutan bahkan di lingkungan jaringan yang tidak stabil
- Sementara IP hanya bertugas mengirimkan data antar host, TCP menangani komunikasi antarproses berbasis port serta pemulihan kesalahan, retransmisi, dan pengendalian urutan
- Melalui flow control dan congestion control, TCP menyesuaikan pengiriman agar tidak melampaui batas buffer penerima atau bandwidth jaringan
- Dengan contoh server TCP sederhana dan server HTTP yang diimplementasikan dalam bahasa C, dijelaskan secara konkret proses pembuatan socket, bind, listen, penerimaan koneksi, serta kirim-terima data
- Struktur internal TCP seperti nomor sequence·ACK, window, checksum, dan flag (SYN/ACK/FIN/RST) merupakan fondasi utama yang memungkinkan internet modern bekerja secara stabil
Kebutuhan dan Peran TCP
- IP hanya menangani pengiriman paket antar host, sedangkan untuk komunikasi antarproses dibutuhkan lapisan transport seperti TCP/UDP
- Alamat IP diibaratkan sebagai ‘gedung’, dan port sebagai ‘apartemen’, sehingga tiap aplikasi berkomunikasi dengan melakukan bind ke port
- TCP menyembunyikan ketidakstabilan jaringan seperti kehilangan paket, duplikasi, dan perubahan urutan, lalu menjamin keandalan dengan retransmisi dan checksum
- Router tetap sederhana, dan keandalan diproses di kedua ujung komunikasi, sehingga kompleksitas infrastruktur jaringan dapat dikurangi
- Berkat struktur ini, layanan internet utama seperti HTTP, SMTP, dan SSH dapat berjalan dengan stabil
Flow Control dan Congestion Control
- Pihak penerima menyimpan data sementara melalui receive buffer di kernel, dan ukuran buffer diatur dengan
net.ipv4.tcp_rmem - Pihak pengirim menerima informasi jumlah data yang dapat diterima pihak penerima melalui field window, lalu menyesuaikan volume pengiriman
- Untuk mencegah congestion akibat perbedaan bandwidth di seluruh jaringan, TCP mengadopsi algoritme congestion control
- Mekanisme back-off ditambahkan setelah insiden congestion collapse pada tahun 1986
Contoh Server TCP dan Server HTTP
- Server echo TCP dasar yang ditulis dalam bahasa C menerima input dari klien lalu mengirimkannya kembali dengan tambahan “you sent:”
- Menggunakan Berkeley sockets API seperti
socket(),bind(),listen(),accept(),send(), danrecv() - Saat server berada dalam
sleep(), data dari klien menunggu di receive buffer dan kemudian diproses secara berurutan
- Menggunakan Berkeley sockets API seperti
- Dalam contoh server HTTP/1.1 sederhana, server menerima permintaan melalui koneksi TCP lalu mengirim header
HTTP/1.1 200 OKbeserta isi respons- Jumlah permintaan dihitung dengan
i, dan saat menjalankancurl localhost:8080, respons ditampilkan dalam bentuk “[1] Yo, I am a legit web server”
- Jumlah permintaan dihitung dengan
Struktur Segmen TCP dan Field Inti
- Segmen TCP terdiri dari port sumber·tujuan, nomor sequence, nomor ACK, ukuran window, checksum, dan flag
- Port dialokasikan masing-masing 16 bit sehingga dapat menggunakan hingga 64K port
- Koneksi diidentifikasi dengan 5-tuple
(protokol, IP sumber, port sumber, IP tujuan, port tujuan)
- Nomor sequence menunjukkan rentang byte yang dikirim, sedangkan nomor ACK menunjukkan byte yang telah diterima
- Jika ada data yang hilang, ACK akan berhenti pada titik tersebut lalu diperbarui menjadi cumulative ACK setelah retransmisi
- Bit flag mengendalikan status koneksi
SYN/ACKmembentuk koneksi melalui 3-way handshakeFINmengakhiri koneksi melalui 4-way handshakeRSTlangsung memutus koneksi saat terjadi penghentian abnormal atau kesalahan
- Field window menunjukkan jumlah data yang dapat diterima, dan status buffer seperti
rb131072,tb16384dapat diperiksa dengan perintahss - Checksum melakukan deteksi kesalahan dengan penjumlahan per unit 16 bit di dalam segmen
Kesimpulan
- TCP menjamin keandalan, urutan, dan integritas, serta membantu aplikasi tetap berjalan normal bahkan di lingkungan internet yang tidak stabil
- Beberapa dekade lalu mengirim beberapa KB saja sulit, tetapi kini streaming 4K sudah menjadi hal biasa
- Ketelitian desain dan implementasi TCP yang memungkinkan komunikasi stabil inilah yang menjadi dasar pertumbuhan internet yang berkelanjutan
1 komentar
Opini Hacker News
Jika mencoba membangun aliran data yang andal di atas lapisan datagram yang tidak andal, hasilnya pada akhirnya akan sangat mirip dengan TCP
Keterbatasan awal TCP adalah ukuran window yang kecil, penanganan paket hilang yang kurang baik, dan fakta bahwa ia hanya mengelola satu aliran saja
Untuk mengatasi masalah ini, muncullah SCTP dan QUIC
Algoritma kontrol kemacetan bukan bagian dari protokol, melainkan kode yang berjalan di kedua sisi setiap koneksi
Algoritma awal seperti Reno dan Vegas sederhana, tetapi cukup efektif, dan setelah itu riset terus berlanjut untuk menangani buffer besar, RTT panjang, fairness, dan sebagainya
Dulu saya pernah membuat pustaka JavaScript yang bisa mengendalikan prioritas dan fitur pembatalan untuk beberapa unduhan dalam satu aliran
Dengan skrip GreaseMonkey, saya membuat situs kencan memuat thumbnail lebih dulu di latar belakang, lalu melakukan preload sesuai posisi scroll
Hasilnya, beban server berkurang sambil meningkatkan pengalaman pengguna
Menariknya, saya membagikan skrip itu kepada salah satu match, dan kami masih bersama sampai sekarang — bisa dibilang itu hampir seperti Tinder sebelum Tinder
TCP adalah struktur yang menyediakan sirkuit virtual di atas jaringan packet switching, dan konsep mewujudkan keandalan lewat retransmisi berasal dari jaringan Cylades di Prancis
Penyerang dapat menyuntikkan (inject) data dari mana saja di jaringan atau memutus koneksi dengan paket RST
Memblokir RST dengan firewall memang meningkatkan stabilitas, tetapi serangan desinkronisasi akibat nomor urut palsu tetap mungkin terjadi
Karena itu, semua aplikasi harus mengimplementasikan fitur resume lewat koneksi terpisah, sekaligus ikut menanggung masalah slow start milik TCP
Selain itu, saya juga menganggap konsep pemisahan alamat dan port itu sendiri tidak efisien
Misalnya pada DNS over TLS(DoT), beberapa kueri dapat dikirim sekaligus melalui satu koneksi TCP dan respons diterima tanpa bergantung urutan
Ini lebih efisien dan lebih sopan daripada membuka banyak koneksi
Saya tidak tahu apakah QUIC akan lebih cepat, tetapi dukungan servernya masih terbatas
HTTP/1.1 pipelining juga melakukan hal serupa, tetapi respons datang secara berurutan
Namun banyak kuliah universitas tidak menekankan hal ini, sehingga sering muncul kesalahpahaman bahwa TCP hanya punya satu algoritma tunggal
Ingin bertanya apakah ada yang punya rasa cinta terhadap SCTP
SCTP adalah protokol yang menggabungkan sifat message-oriented milik UDP dengan keandalan TCP, serta mendukung multistreaming dan multihoming
Beberapa aliran independen dapat dikirim secara paralel, sehingga teks dan gambar halaman web bisa dikirim bersamaan
Untuk detailnya, lihat Wikipedia: Stream Control Transmission Protocol
Pada akhirnya, jawaban terbaik adalah lapisan keandalan di atas UDP, yaitu QUIC
Saya penasaran apakah mungkin mengirim paket langsung hanya dengan IP
Sepertinya router di tengah akan menolak paket yang bukan TCP atau UDP
Untuk IPv4, cukup tentukan salah satu nomor 0–255 dari daftar nomor protokol IANA
Router inti tidak memeriksa field ini, tetapi perangkat NAT atau peralatan ISP bisa saja memeriksanya
Antara dua server Linux, komunikasi bahkan bisa dilakukan dengan nomor eksperimen (253, 254)
Protokol seperti IPsec, GRE, dan L2TP juga bukan TCP/UDP
Di lingkungan firewall perusahaan atau NAT, protokol arbitrer bisa diblokir
NAT merusak prinsip end-to-end, dan pada akhirnya orang mulai menumpangkan semuanya di atas TCP atau UDP, atau bahkan di atas HTTP
Paling hanya ada dampak berupa berkurangnya entropi pada hash ECMP
Pada akhirnya yang penting adalah apakah pihak lawan memahami protokol tersebut
Nomor port hanyalah pengenal layanan di dalam node
RUDP(Plan9) adalah kompromi yang sangat baik antara TCP dan UDP
Lihat Reliable User Datagram Protocol
Karena TCP menjadi default, ia dipakai begitu saja bahkan saat keandalan atau jaminan urutan sebenarnya tidak diperlukan
Sekarang, dengan penyebaran HTTP/3(berbasis QUIC), situasinya mungkin bisa membaik
Namun QUIC jauh lebih kompleks, dan kekuatannya hanya berguna bagi sebagian orang
UDP + lapisan enkripsi sederhana ala WireGuard bisa menjadi alternatif yang lebih baik
TCP adalah salah satu penemuan besar umat manusia, tetapi ia tidak pernah mengantisipasi dominasi jaringan semi-terhubung(berbasis NAT)
para insinyur saat itu kemungkinan akan bertanya mengapa harus membuat semuanya serumit itu
Pada akhirnya, struktur link asimetris dan pemisahan klien–server saat ini berasal dari gagasan semacam itu
Algoritma kontrol kemacetan TCP memiliki efek menarik yang tidak banyak dipahami pengembang
Saat mengirim data lewat koneksi baru, transmisi awal lambat, dan kenaikan kecepatannya ditentukan oleh latensi
Di data center, hanya dengan mengurangi RTT beberapa mikrodetik saja, peningkatan kecepatan bisa sangat besar
Sebagian besar stack TCP menghitung kenaikan laju berdasarkan unit segmen, bukan byte, sehingga dengan jumbo frame laju bisa naik 6 kali lebih cepat
Karena alasan inilah AWS banyak berinvestasi pada latensi switching rendah dan dukungan jumbo frame
Para ahli melakukan tuning seperti ini, tetapi kebanyakan orang hanya heran mengapa link 10Gbps tidak benar-benar menghasilkan 10Gbps
Membuat protokol sendiri di atas IP dulu adalah hal yang sangat mudah
Bahkan 15 tahun lalu, orang bisa bereksperimen dengan Python sambil merakit paket secara langsung