Prioritas ACK dengan pf

by : wishnu ( godril@indofreebsd.or.id )
 
Di kantor saya, saya memiliki dua link menuju kantor pusat, di mana link pertama menggunakan sambungan terrestrial hingga ke level internasional, sedangkan link yang satunya lagi menggunakan satelit di level internasionalnya (keduanya menggunakan terrestrial untuk ke IIX). Untuk yang link terrestrial tidak ada masalah sama sekali. Yang jadi masalah adalah pada saat saya menggunakan link satelit untuk melakukan download. Link satelit saya adalah 768 agregat (256 Kbps up, dan 512 Kbps down). 
Pada saat saya memulai download, saya akan mendapatkan throughput yang cukup lumayan pada awalnya (sekitar 40 - 55Kbps), tetapi akan langsung anjlok (sampai 20kbps an) setelah beberapa saat saya melakukan browsing sambil download tetap berjalan. Teman-teman mungkin pernah mengalami seperti ini. Yang terjadi adalah begini: pada saat terjadi koneksi satu arah (misal download melalui ftp), maka dibutuhkan trasmit ACK dari sisi yang berlawanan (misal saya mendownload file lewat protokol ftp dari sebuah server di luar, maka host saya harus secara konstan mengirimkan ACK), untuk menjaga koneksi agar server ftp tersebut tidak menganggap packet yang ditransmit loss di tengah jalan, sehingga akan mentransmit ulang packet yang dianggap hilang. Nah pada saat uplink saya juga mengalami saturasi (misal untuk upload, request, kirim email, dan lain sebagainya), maka TCP ACK saya yang harusnya saya kirim ke server ftp tersebut juga terhalang yang lalu menyebabkan delay transmit ACK, yang berlanjut menurunnya throughput download.
Sebenarnya outgoing ACK ini sangat kecil, hal seperti itu tidak perlu terjadi. Jadi sekarang bagaimana kita bisa meloloskan packet ACK ini sehingga download kita tidak terganggu oleh aktivitas upload kita dengan menggunakan pf dan ALTQ. Kira-kira rule nya adalah seperti ini:
extif="rl1"
altq on $extif priq bandwidth 32Kb queue { qprior, qdflt }
queue qprior priority 7
queue qdflt priority 1 priq(default)

pass out on $extif proto tcp from $extif to any flags S/SA \
keep state queue (qdflt, qprior)
pass in on $extif proto tcp from any to $extif flags S/SA \
keep state queue (qdflt, qprior)

Baris pertama adalah definisi makro untuk interface yang menghadap ke luar. Hal ini untuk memudahkan re-setting rule kalau-kalau ganti interface. Yang kedua adalah mengaktifkan altq di interface tersebut, yang kemudian mendefinisikan speed rate uplink pada interface tersebut. Di sini juga kita definisikan dua queue yang kita beri nama qprior dan qdflt (penamaan ini bebas). Queue dengan prioritas kecil kita jadikan sebagai default (priority 1).
Berikutnya kita aplikasikan definisi tersebut ke dalam rule, dimana semua packet TCP akan diperlakukan secara default dengan rule qdflt, sedangkan untuk packet dengan ToS flag yang diset sebagai "low delay" seperti ssh dan packet-packet ACK yang tanpa payload, akan diatur dengan rule qprior. Semua packet yang masuk dan keluar akan melewati rule ini, membuat state pada table keep-state, dan semua packet yang menggunakan flag ToS "low delay" akan didahulukan sehingga download kita akan menjadi lancar. Nah, selamat mencoba.

NB: Untuk teman-teman yang masih menggunakan link PPPoE, uplinknya harus diperhitungkan juga dengan overhead packet PPPoE. Jadi jika uplink nya 64Kbps, kemungkinan tidak akan full 64Kbps, karena enkapsulasi PPPoE juga membutuhkan overhead dari speed rate tersebut.

NB: Gunakan plugin pf seperti pfsysinfo atau hatchet untuk mengetahui perbedaan throughput yang dihasilkan dengan rule di atas, dan lakukan beberapa experimen untuk mendapatkan hasil yang pas.

Related

Application Support 2606661978136629808

Posting Komentar

emo-but-icon

Follow Us

Hot in week

Recent

Comments

Side Ads

Text Widget

Connect Us

item