Beberapa socket Linux dapat melakukan bind ke alamat lokal yang sama ketika setiap socket mengaktifkan SO_REUSEPORT sebelum bind(). Traffic masuk kemudian ditetapkan ke salah satu anggota reuseport group, bukan dikirim ke setiap socket. Alamat bersama tersebut menjadi batas seleksi oleh kernel, bukan endpoint broadcast.
Perilaku ini mendukung receive loop atau accept loop yang berdiri sendiri tanpa memaksa seluruh pekerjaan melewati satu listening descriptor. Konsekuensinya juga jelas: keanggotaan grup dan kebijakan seleksi menentukan socket yang menerima packet atau connection.
Keanggotaan grup dimulai pada bind bersama
Untuk AF_INET dan AF_INET6, SO_REUSEPORT mengizinkan beberapa socket melakukan bind ke alamat identik. Linux mensyaratkan opsi ini aktif pada setiap socket yang berpartisipasi, termasuk socket pertama, sebelum bind().
Linux juga mensyaratkan proses yang melakukan bind ke alamat yang sama dengan cara ini memiliki effective UID yang sama. Pembatasan tersebut mencegah proses yang tidak terkait bergabung ke endpoint reuseport yang sudah ada hanya dengan mengaktifkan opsi ini.
Opsi ini berbeda dari SO_REUSEADDR. SO_REUSEPORT secara eksplisit membentuk sekumpulan socket yang memenuhi syarat untuk dipilih pada alamat lokal yang sama; fungsinya bukan sekadar melonggarkan aturan penggunaan ulang alamat saat bind.
TCP mendistribusikan connection antar-listener
Pada TCP, beberapa listening socket terpisah dapat menempati alamat dan port yang sama. Setiap listener dapat dimiliki worker thread atau proses berbeda dan menjalankan accept() loop sendiri.
Kernel memilih satu listener untuk connection masuk. Setelah connection ditetapkan dan diterima, connected socket yang dihasilkan mengikuti semantik TCP biasa. Reuseport group berperan pada seleksi listener; grup ini tidak menjadikan established connection sebagai objek bersama untuk seluruh listener.
Susunan ini menghilangkan satu listening file descriptor bersama dari jalur dispatch pada tingkat aplikasi. Efek scheduling tetap ada: karakteristik connection yang tidak merata, beban worker, penempatan CPU, dan logika seleksi kernel dapat memengaruhi distribusi yang terlihat.
Seleksi UDP berlaku per datagram
Pada UDP, socket dalam reuseport group menjadi kandidat untuk datagram masuk yang ditujukan ke endpoint lokal bersama. Satu datagram dipilih untuk satu socket, bukan disalin ke seluruh anggota grup.
Sifat tersebut membedakan reuseport dari fan-out pada aplikasi. Jika beberapa consumer harus menerima payload yang sama, reuseport group tidak menyediakan semantik itu. Grup ini menyediakan distribusi di antara socket yang memenuhi syarat.
Flow affinity juga dapat membuat distribusi traffic berbeda dari round robin per packet. Algoritma seleksi kernel merupakan mekanisme distribusi, bukan kontrak jadwal fairness.
BPF dapat mengganti selector default
Linux menyediakan SO_ATTACH_REUSEPORT_CBPF dan SO_ATTACH_REUSEPORT_EBPF untuk reuseport group. Program classic BPF dapat mengembalikan indeks dari 0 hingga N-1, dengan N sebagai ukuran grup saat itu, untuk memilih socket penerima.
Extended BPF dapat memakai bentuk socket-filter dengan model indeks yang sama. Program BPF_PROG_TYPE_SK_REUSEPORT dapat memakai bpf_sk_select_reuseport() untuk memilih socket dari reuseport socket array.
Jika program berbasis indeks menghasilkan indeks yang tidak valid, Linux kembali ke mekanisme seleksi SO_REUSEPORT biasa. Program yang terpasang mengendalikan seleksi hanya dalam kontrak interface tersebut.
Socket baru yang ditambahkan mewarisi program BPF yang sudah terkait dengan grup. Mengganti program melalui salah satu socket dalam grup mengubah selector yang dipakai grup, bukan membuat kebijakan terpisah untuk satu socket.
Indeks numerik socket adalah posisi keanggotaan yang dapat berubah
Untuk interface BPF berbasis indeks, socket diberi nomor sesuai urutan masuk ke grup: urutan bind() untuk UDP dan urutan listen() untuk TCP.
Indeks tersebut bukan identitas socket yang permanen. Saat satu socket dikeluarkan, Linux memindahkan socket terakhir dalam grup ke posisi yang kosong. Selector yang menyimpan arti eksternal berdasarkan indeks numerik harus memperhitungkan pemadatan ini.
Detail ini memisahkan identitas aplikasi yang stabil dari posisi keanggotaan reuseport. Nomor worker, nomor CPU, atau shard identifier tidak otomatis setara dengan indeks reuseport saat ini setelah keanggotaan berubah.
Seleksi tidak menghapus backpressure
Reuseport mendistribusikan traffic masuk, tetapi setiap socket terpilih tetap memiliki queue dan consumer aplikasi sendiri. Worker yang lambat tetap dapat menumpuk tekanan pada traffic yang ditetapkan ke socket miliknya walaupun anggota lain memiliki kapasitas kosong.
Selector BPF khusus dapat memasukkan kebijakan di luar mekanisme default, tetapi selection hook bukan transaksi umum atas state seluruh worker. State yang dipakai untuk steering tetap memerlukan aturan konsistensi dan lifecycle sendiri.
Batas utamanya tetap sempit: SO_REUSEPORT membuat beberapa socket memenuhi syarat pada satu alamat lokal dan memindahkan seleksi receive awal ke kernel. Opsi ini tidak menggabungkan queue, tidak menjamin pembagian kerja yang sama, dan tidak membuat indeks grup menjadi permanen.