Seperti yang telah kita bahas di tulisan tentang
TCP & UDP, kita tahu TCP (Transmission Control Protocol) adalah
connection-oriented protocol yang berarti bahwa TCP melacak berapa banyak data yang telah dikirimkan. Pengirim akan mengirimkan beberapa data dan penerima harus membalas dengan
Acknowledgement. Ketika pengirim tidak menerima
Acknowledgement dari penerima maka pengirim akan mengirim ulang data tersebut.
TCP menggunakan "
windowing" yang berarti bahwa pengirim akan mengirim satu atau lebih segment data dan penerima akan membalas dengan
Acknowledgement untuk satu atau semua segment. Saat kita memulai koneksi TCP, host akan menggunakan
receive buffer untuk menyimpan data secara sementara sebelum aplikasi dapat memprosesnya.
Ketika penerima mengirim
Acknowledgement, ia akan memberi tahu pengirim berapa banyak data yang dapat ditransmisikan sebelum penerima akan mengirim
Acknowledgement. Itu disebut
window size. Pada dasarnya,
window size menunjukkan besarnya
receive buffer.
Biasanya koneksi TCP akan dimulai dengan
window size kecil dan setiap kali ada
Acknowledgement yang berhasil,
window size akan meningkat.
Mari kita lihat sebuah contoh:
Di contoh tsb, PC1 mengirim satu segment dan PC2 membalas dengan mengirim
Acknowledgement. Karena
Acknowledgement berhasil, maka
window size akan meningkat:
Kini PC1 mengirim dua segment sekaligus dan PC2 akan membalas dengan satu
Acknowledgement. Semuanya berjalan dengan lancar sehingga
window size akan meningkat lagi:
Kini PC1 mengirim empat segment sekaligus dan PC2 merespons dengan satu
Acknowledgement.
Pada contoh di atas,
window size terus meningkat selama penerima mengirimkan
Acknowledgement untuk semua segment dari pengirim atau ketika
window size mencapai batas maksimum tertentu. Ketika penerima tidak mengirim
Acknowledgement dalam periode waktu tertentu (disebut
round trip time) maka
window size akan berkurang.
Ketika sebuah interface mengalami
congestion (kemacetan) maka ada kemungkinan paket IP akan di-drop. Untuk mengatasinya, TCP memiliki algoritma yang berhubungan dengan
congestion control. Salah satunya disebut TCP
slow start.
Congestion bisa terjadi ketika sebuah interface harus mengirimkan lebih banyak data daripada yang bisa ditangani.
Queue (antrian) akan mencapai batasnya dan paket akan di-drop.
Dengan TCP
slow start,
window size awalnya akan bertambah secara eksponensial (
window size menjadi dua kali lipat) tetapi ketika paket yang di-drop,
window size akan dikurangi menjadi satu segment. Kemudian akan bertambah lagi secara eksponensial sampai
window size menjadi setengah dari ukuran
window size ketika
congestion terjadi. Setelah itu,
window size akan bertambah secara linear, bukan secara eksponensial.
Ketika sebuah interface mengalami
congestion, mungkin semua koneksi TCP Anda akan mengalami TCP
slow start. Paket akan di-drop dan kemudian semua koneksi TCP akan memiliki ukuran
window size yang kecil. Ini disebut TCP
global synchronization. Begini tampilannya:
Garis
merah,
kuning dan
biru adalah tiga koneksi TCP yang berbeda. Koneksi TCP ini dimulai pada waktu yang berbeda dan setelah beberapa saat, interface mengalami
congestion dan semua segment di koneksi-koneksi TCP tersebut di-drop. Kemudian yang terjadi adalah
window size semua koneksi TCP ini akan turun ke satu dan setelah
congestion pada interface reda, maka
window size semua koneksi TCP akan meningkat lagi.
Jika interface kemudian menjadi padat lagi, ukuran
window size turun kembali ke satu dan kejadian di atas berulang kembali. Hasil dari ini adalah kita tidak bisa menggunakan semua bandwidth yang tersedia pada interface. Anda dapat melihat garis putus-putus di atas, yang menunjukkan bahwa rata-rata utilisasi bandwidth pada interface tidak terlalu tinggi.
Untuk mencegah
congestion yang berimbas pada TCP
global synchronization, kita dapat menggunakan RED (Random Early Detection) yang merupakan salah satu mekanisme pada QoS (Quality of Service). Ini adalah fitur yang melakukan drop paket "secara acak" dari TCP
stream berdasarkan jumlah paket dalam
Queue (antrian) dan tanda ToS (Type of Service) yang ada pada IP header. Ketika paket di-drop sebelum
Queue (antrian) penuh, kita dapat menghindari TCP
global synchronization.
Hasil akhirnya akan terlihat seperti ini:
Dapat disimpulkan, ketika kita menggunakan RED (random early detection), pemanfaatan rata-rata utilisasi interface akan meningkat.
Kesimpulan
Anda sekarang telah melihat bagaimana TCP menggunakan
window size untuk memberi tahu pengirim berapa banyak data yang bisa dikirim sebelum menerima
Acknowledgement. Saya juga telah menunjukkan kepada Anda sebuah contoh bagaimana
window size digunakan ketika penerima tidak dapat memproses receive buffer-nya tepat waktu.
Tidak seperti TCP, UDP adalah protokol
connectionless dan hanya akan terus mengirim segment data tanpa menunggu
Acknowledgement dan tanpa
window size. Karena alasan ini, Anda mungkin ingin membatasi traffic UDP Anda atau bakal ada kemungkinan terjadi TCP
starvation ketika terjadi
congestion.
Semoga tulisan ini dapat memudahkan dalam memahami TCP
window size. Jika ada pertanyaan, jangan ragu untuk bertanya di kolom komentar di bawah ya.
Selamat belajar dan tetap semangat di tengah pandemi ini :)
~AHa
#NetworkFundamentals
#StayAtHome
#StaySafe
#StayHealthy