Ini adalah pengoptimalan, jadi seperti pengoptimalan apa pun:
- Jangan gunakan itu
- Tunggu hingga kinerja menjadi masalah, lalu tentukan bahwa latensi soket pasti penyebabnya, dan pengujian membuktikan bahwa ini pasti akan memperbaikinya, DAN ini adalah cara termudah untuk memperbaikinya, lakukanlah.
Pada dasarnya tujuannya adalah untuk menghindari pengiriman beberapa frame di mana satu frame dapat digunakan, dengan sendfile() dan teman-temannya.
Jadi misalnya, di web server, Anda mengirim header diikuti dengan isi file, header tersebut akan dirangkai di dalam memori, kemudian file tersebut akan dikirim langsung oleh kernel. TCP_CORK memungkinkan Anda mengirim header dan awal file dalam satu bingkai, bahkan dengan TCP_NODELAY, yang jika tidak akan menyebabkan potongan pertama segera dikirim.
TCP_NODELAY
Digunakan untuk menonaktifkan algoritme Nagle untuk meningkatkan jaringan TCP/IP dan mengurangi jumlah paket dengan menunggu hingga pengakuan data yang dikirim sebelumnya diterima untuk mengirim paket yang terakumulasi.
//Dari manual tcp(7):
TCP_CORK
(atau TCP_NOPUSH
di FreeBSD)
Jika disetel, jangan kirimkan bingkai sebagian. Semua bingkai parsial yang antri dikirim saat opsi dihapus lagi. Ini berguna untuk mengawali header sebelum memanggil sendfile(2)
, atau untuk optimalisasi throughput. Seperti yang diterapkan saat ini, terdapat batas maksimal 200 milidetik pada saat keluaran ditutup oleh TCP_CORK
. Jika plafon ini tercapai, maka data antrean akan dikirim secara otomatis . Opsi ini dapat digabungkan dengan TCP_NODELAY
hanya sejak Linux 2.5.71. Opsi ini tidak boleh digunakan dalam kode yang ditujukan untuk portabel.
Pertama-tama, tidak keduanya menonaktifkan algoritme Nagle.
Algoritme Nagle adalah untuk mengurangi lebih banyak jumlah paket jaringan kecil dalam kabel. Algoritmanya adalah:jika data lebih kecil dari batas (biasanya MSS), tunggu hingga menerima ACK untuk paket yang dikirim sebelumnya dan sementara itu kumpulkan data dari pengguna. Kemudian kirim data yang terakumulasi.
if [ data > MSS ]
send(data)
else
wait until ACK for previously sent data and accumulate data in send buffer (data)
And after receiving the ACK send(data)
Ini akan membantu dalam aplikasi seperti telnet. Namun, menunggu ACK dapat meningkatkan latensi saat mengirim data streaming. Selain itu, jika penerima menerapkan 'kebijakan ACK tertunda', ini akan menyebabkan situasi kebuntuan sementara. Dalam kasus seperti itu, menonaktifkan algoritme Nagle adalah opsi yang lebih baik.
Jadi TCP_NODELAY digunakan untuk menonaktifkan algoritme Nagle.
TCP_CORK secara agresif mengumpulkan data. Jika TCP_CORK diaktifkan di soket, data tidak akan dikirim hingga buffer terisi hingga batas tetap. Mirip dengan algoritme Nagle, ini juga mengumpulkan data dari pengguna tetapi hingga buffer terisi hingga batas tetap, tidak hingga menerima ACK. Ini akan berguna saat mengirim banyak blok data. Namun Anda harus lebih berhati-hati saat menggunakan TCP_CORK.
Hingga kernel 2.6, kedua opsi ini saling eksklusif. Tapi di kernel selanjutnya, keduanya bisa eksis bersama. Dalam kasus tersebut, TCP_CORK akan diberikan lebih banyak preferensi.
Referensi:
- http://baus.net/on-tcp_cork/
- http://ccr.sigcomm.org/archive/2001/jan01/ccr-200101-mogul.pdf