Bisakah TCP menyediakan lebih dari 65535 port?


50

Apakah mungkin untuk mengatur sistem Linux sehingga menyediakan lebih dari 65.535 port? Maksudnya adalah agar lebih dari 65k daemon mendengarkan pada sistem yang diberikan.

Jelas ada port yang digunakan sehingga ini tidak mungkin karena alasan itu, jadi anggap ini sebagai latihan teoritis dalam mencoba memahami di mana TCP akan membatasi dalam melakukan sesuatu seperti ini.


11
Apa motivasi untuk pertanyaan ini? Mengapa Anda ingin agar banyak daemon mendengarkan?
Warren Young

1
Anda juga akan kesulitan memulai banyak proses. (Saya berasumsi maksud Anda satu proses per daemon.)
Warren Young

13
Meskipun tidak ada yang secara formal membatasi Anda untuk mengenakan 65 pasang celana sekaligus, itu akan menjadi kebodohan praktis untuk mencoba. Jika Anda dapat menunjukkan kepada saya sebuah mesin yang dapat memproses 10'000 port TCP berbuah secara bersamaan, maka ini mungkin pertanyaan abstrak yang menarik.
msw

13
Sifat Q ini sepenuhnya teoretis, tidak ada tujuan yang dimaksudkan selain untuk memahami keterbatasan TCP & # port.
slm

1
Masalahnya adalah, Anda telah mengutarakannya dengan cara yang mengikatnya dengan berbagai hal praktis yang melibatkan ruang RAM yang diperlukan oleh proses daemon 64k +. Mesin apa pun yang mungkin Anda miliki sekarang atau untuk dekade berikutnya atau lebih akan kehabisan RAM sebelum Anda mencapai batas pendengar. Jika Anda mengulangi pertanyaan untuk hanya berbicara tentang pendengar TCP , meninggalkan pembicaraan tentang daemon sepenuhnya, masalah itu hilang. Anda dapat mengamortisasi ruang stack dengan menetapkan seribu soket untuk setiap daemon yang digerakkan oleh single-threaded, misalnya.
Warren Young

Jawaban:


84

Melihat RFC untuk TCP: RFC 793 - Transmission Control Protocol , jawabannya tampaknya tidak karena fakta bahwa header TCP terbatas pada 16-bit untuk bidang port sumber / tujuan.

    ss # 1

Apakah IPv6 meningkatkan hal-hal?

Tidak. Meskipun IPv6 akan memberi kita ruang alamat IP yang jauh lebih besar, 32-bit vs 128-bit, itu tidak membuat upaya untuk meningkatkan batasan paket TCP 16-bit untuk nomor port. Menariknya RFC untuk IPv6: Protokol Internet, Versi 6 (IPv6) Spesifikasi , bidang IP perlu diperluas.

Ketika TCP berjalan melalui IPv6, metode yang digunakan untuk menghitung checksum berubah, sesuai RFC 2460 :

Setiap transport atau protokol lapisan atas lainnya yang menyertakan alamat dari header IP dalam perhitungan checksumnya harus dimodifikasi untuk digunakan melalui IPv6, untuk memasukkan alamat IPv6 128-bit sebagai ganti alamat IPv4 32-bit.

                 ss # 2

Jadi bagaimana Anda bisa mendapatkan lebih banyak port?

Salah satu pendekatan adalah menumpuk alamat IP tambahan menggunakan lebih banyak antarmuka. Jika sistem Anda memiliki beberapa NIC, ini lebih mudah, tetapi bahkan hanya dengan satu NIC, Anda dapat menggunakan antarmuka virtual (alias. Alias ) untuk mengalokasikan lebih banyak IP jika diperlukan.

CATATAN: Menggunakan alias telah digantikan dengan iproute2yang dapat Anda gunakan untuk menumpuk alamat IP pada satu antarmuka (yaitu eth0).

Contoh

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Sumber: iproute2: Kehidupan setelah ifconfig

Referensi


3
Tidak mungkin untuk memilih di antara 65.536+ daemon menggunakan port tujuan saja, tetapi jika seseorang memiliki memori dan bandwidth tidak terbatas, dapat memiliki lebih dari 32.000 koneksi dengan setiap alamat TCP yang berbeda pada setiap port yang masuk.
supercat

7

Apakah mungkin untuk mengatur sistem Linux sehingga menyediakan lebih dari 65.535 port?

Nggak.

Maksudnya adalah agar lebih dari 65k daemon mendengarkan pada sistem yang diberikan.

Maka Anda membutuhkan:

  • sebuah iptableskonfigurasi yang pengalihan pada konten lalu lintas atau

  • "layanan broker layanan" atau "layanan multiplexor" yang akan menerima koneksi masuk pada satu port dan mengarahkannya ke daemon yang sesuai "di belakangnya". Jika Anda ingin protokol standar untuk lulus tanpa dimodifikasi Anda mungkin harus menerapkan sniffing protokol / pengenalan dalam layanan multiplexor ini, dengan cara bahwa firewall IDS atau layer-7 akan di-anaylze; Sepenuhnya mungkin dengan sebagian besar protokol.

Per item kedua, Anda dapat merancang layanan ini untuk menangani lebih dari 2 ^ 16 "port" jika Anda benar-benar menginginkannya. Saya yakin dampak kinerja akan minimal dibandingkan dengan beban 2 ^ 16 + pendengar berjalan.

Daemon di Linux dapat mendengarkan pada soket unix yang ada di sistem file, sehingga "layanan multipleksor" Anda dapat mempertahankan pemetaan internal port eksternal <-> soket unix internal. Anda kemungkinan akan mengalami batas proses kernel (proses 32Kbyte?) Sebelum kehabisan inode pada sistem file modern apa pun.


Saya downvoted ini karena Anda mengatakan itu tidak mungkin, kemudian lanjutkan menjelaskan bagaimana melakukannya menggunakan beberapa IP dan load balancing, meskipun dengan cara bundaran yang sangat membingungkan.
suprjami

2
Lebih dari 64 ribu port pada satu sistem tidak mungkin. Lebih dari 64K pendengar mungkin dimungkinkan, tetapi Anda harus memiliki pendengar proksi atau frontend yang akan "membagi" koneksi masuk ke pendengar "backend" nyata yang tepat. Anda bisa melakukan sesuatu yang gila seperti NAT internal ke beberapa alamat IP internal, misalnya.
LawrenceC

2
Salah. Orang-orang telah berhasil mendapatkan setengah juta koneksi bersamaan pada satu sistem. Ya, banyak IP dan load balancers (tidak harus pada sistem yang sama) diperlukan, tetapi satu sistem dapat membuka lebih dari 64k port dan bahkan lebih dari 64k pendengar jika dilakukan dengan benar.
suprjami

2

Hanya karena tidak ada jawaban yang baik saya ingin berpadu.

Salah satu cara untuk melakukan ini adalah dengan menambahkan opsi IP yang menentukan ekstensi port. Opsi harus dirancang agar sesuai dengan bagian opsional dari header IP dan akan dilewati oleh hop yang tidak dikenal.

Anda akan menggunakan opsi ini dan informasi informasinya untuk memperluas sumber, tujuan, atau kedua nomor port.

Keterbatasan tidak akan bekerja secara otomatis dalam perangkat lunak yang ada hanya dengan menambahkan opsi, mereka harus ditulis ulang untuk mengambil keuntungan dari opsi tidak peduli bagaimana itu diterapkan, perangkat lunak yang ada dan firewall akan mengabaikan paket atau memprosesnya seperti biasa menggunakan nilai di bidang port sumber dan tujuan.

Singkatnya itu tidak mudah dilakukan dan akan lebih baik dilakukan dengan menggunakan pendengar tunggal yang dapat digunakan kembali dan data yang terkandung dalam muatan paket.

Anda juga dapat lebih mudah mengizinkan penggunaan kembali port dalam perangkat lunak, yang dapat membantu mengatasi batasan ini dengan menggunakan kembali port server untuk beberapa koneksi klien.

Rtsp misalnya dapat menggunakan tajuk SessionId bersama dengan berbagai tajuk lainnya dalam muatan paket IP untuk menentukan koneksi apa yang diminta oleh permintaan dan bertindak sesuai misalnya, jika soket dari mana pesan dikirim tidak sama dengan soket. alamat jarak jauh yang sesuai dengan sesi kemudian maka seseorang dapat memperbolehkan sesi diperbarui dengan soket baru untuk diproses, menolak pesan atau berbagai tindakan lain tergantung pada aplikasi.

Server Http juga dapat melakukan ini atau jenis server lainnya.

Hal utama yang perlu diingat ketika mengizinkan penggunaan kembali port adalah bahwa Anda juga harus memperhitungkan alamat IP sumber.


-2

Ya kamu bisa !

Ini telah dilakukan sebelumnya, misalnya server enkripsi Edgehill, yang memiliki> 25.000.000 deamons berjalan secara online.


9
Pertimbangkan memperluas jawaban Anda untuk memasukkan beberapa panduan tentang bagaimana OP dapat menyelesaikan ini, dokumentasi yang mendukung jawaban Anda atau penjelasan terkait.
HalosGhost

Bisakah Anda memberikan referensi untuk pernyataan ini? Pencarian cepat membuat saya percaya apa pun ini didistribusikan di banyak mesin.
Thomas Guyot-Sionnest
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.