Setiap antarmuka jaringan Linux memiliki apa yang disebut qdisc (disiplin antrian) yang melekat padanya. Dan jawaban atas pertanyaan Anda tergantung pada qdisc yang digunakan. Beberapa disiplin antrian seperti pfifo dan bfifo, tidak memiliki konsep prioritas. Jadi jika digunakan, jawabannya sederhana - tidak akan ada prioritas
Namun, dengan memprioritaskan qdisc seperti pfifo_fast (yang biasanya merupakan qdisc default di Linux), prioritas soket dapat berpengaruh.
Gambar ini menjelaskan apa yang terjadi di pfifo_fast qdisc:
Kami melihat bahwa paket ditempatkan dalam antrian tergantung pada prioritasnya. Ketika saatnya tiba antarmuka untuk mengirim paket berikutnya (frame sebenarnya, tapi jangan membahasnya), itu akan selalu memilih untuk mengirim paket dengan prioritas tertinggi. Artinya jika beberapa paket menunggu, paket dengan prioritas tertinggi akan dikirim terlebih dahulu . Perhatikan bahwa ini mengharuskan antarmuka menjadi padat - jika antarmuka tidak padat dan paket dikirim segera setelah tiba dari OS, maka tidak ada antrean dan karenanya tidak ada prioritas.
Qdisc lain memiliki struktur dan kebijakan yang berbeda. Misalnya qdisc SFQ:
Dengan mengingat hal itu, mari kita kembali ke pertanyaan Anda:
-
Tergantung pada qdisc, ya, paket dari
socket_11
dapat dikirim sebelum paket dari soket lain. Jikapfifo_fast
digunakan, dan ifsocket_11
mengirimkan lalu lintas yang cukup untuk menjenuhkan antarmuka jaringan keluar, maka paket dari soket lain bahkan mungkin tidak dikirim sama sekali. Dalam praktiknya, hal ini tidak mungkin karena biasanya sulit untuk menjenuhkan antarmuka jaringan sebelum memenuhi beberapa sumber daya lain, kecuali antarmuka nirkabel. -
Jalur yang diambil paket dari antarmuka jaringan mesin ke soket jauh lebih cepat daripada jaringan itu sendiri. Dan, seperti yang Anda ingat, agar prioritas memiliki efek, harus ada kemacetan. Dalam skenario tipikal, paket yang mencapai sejauh antarmuka jaringan Anda telah melewati hambatan perjalanannya di seluruh jaringan, sehingga kemacetan tidak mungkin terjadi.
Anda tentu saja dapat menggunakan qdisc masuk atau mekanisme lain untuk membuat kemacetan secara artifisial, dan memprioritaskan lalu lintas masuk. Tapi mengapa Anda? Itu hanya masuk akal jika Anda membangun pembentuk lalu lintas atau perangkat jaringan serupa. Plus, karena qdisc ini adalah mekanisme tingkat rendah yang terjadi jauh di bawah soket tingkat yang lebih tinggi (bahkan sebelum menjembatani atau merutekan), saya ragu bahwa prioritas soket dapat berpengaruh pada masuk.
-
Bukan itu yang saya sadari, tapi saya akan senang belajar. Modul kernel ini mendekati, tetapi tampaknya tidak dapat menampilkan bendera prioritas, hanya opsi soket biasa.
Jawaban atas pertanyaan Anda:
- Ya secara default, penjelasan ada di bawah
- Tidak ada prioritas yang berfungsi hanya saat mengirim, penjelasan juga ada di bawah
- Saya rasa tidak karena opsi ini tidak terlihat bahkan melalui antarmuka /proc
Detail tentang 1
Beberapa kata tentang prioritas, antrian jaringan, dan disiplin perangkat. Semua hal ini terkait dengan kualitas layanan dan khususnya Layanan Diferensiasi (DiffServ).
Ketika paket dikirim kemudian dimasukkan ke interface "antrian" yang diproses oleh perangkat jaringan. Secara default, antrian bukanlah antrian nyata tetapi tiga fifo nyata yang sangat diprioritaskan. Jika ada paket di fifo0 daripada paket di fifo1 menunggu. Prioritas soket dipetakan ke fifo ini dengan mengikuti pemetaan:
- 0 (Upaya Terbaik) adalah fifo1
- 1-3 (Pengisian, Massal, ...) adalah fifo2
- 4 adalah fifo1
- 5 adalah fifo2
- 6-7 (Interaktif, Kontrol) adalah fifo0
- 8-15 adalah fifo1
Jadi prioritas 1 akan dikirim setelah prioritas 0.
Untuk mengubah perilaku default, utilitas "kontrol lalu lintas" (tc) digunakan. Dengannya Anda dapat mengonfigurasi antrean prioritas pada antarmuka jaringan. Inilah yang disebut "disiplin antrian perangkat". Anda dapat menentukan bagaimana prioritas dilayani oleh perangkat jaringan tertentu (jawaban Malt memiliki penjelasan yang bagus tentang ini).
Detail tentang 2
Socket memiliki status "siap untuk dibaca"/"tidak siap untuk dibaca" dan ini adalah bool. Jika ada data yang masuk ke soket tidak siap, statusnya berubah dari "tidak siap" menjadi "siap" dan ini terlihat oleh fungsi seperti pilih/jajak pendapat atau dengan kembali dari panggilan recv yang diblokir. Utas apa yang akan dibangunkan tidak bergantung pada prioritas soket tetapi pada prioritas utas.
Jadi jika Anda ingin memprioritaskan soket yang Anda butuhkan
- meletakkannya di utas yang diprioritaskan
- atau prioritaskan berdasarkan kode setelah pemilihan/polling