Bagaimana layanan lalu lintas tinggi melayani lebih dari 65535 koneksi TCP?

29

Jika ada batasan jumlah port yang dimiliki satu mesin dan satu soket hanya dapat mengikat ke nomor port yang tidak digunakan, bagaimana server mengalami jumlah yang sangat tinggi (lebih dari jumlah port maksimal) dari permintaan yang menangani ini? Apakah itu hanya dilakukan dengan membuat sistem terdistribusi, yaitu, banyak server di banyak mesin?

alh
sumber

Jawaban:

55

Anda salah memahami nomor port dengan cukup parah: server hanya mendengarkan pada satu port dan dapat memiliki banyak soket terbuka dari klien yang terhubung ke satu port tersebut.

Pada level TCP, tuple (sumber ip, port sumber, ip tujuan, port tujuan) harus unik untuk setiap koneksi simultan. Itu berarti satu klien tidak dapat membuka lebih dari 65535 koneksi simultan ke server. Tetapi server dapat (secara teoritis) server 65535 koneksi simultan per klien .

Jadi dalam prakteknya server hanya dibatasi oleh berapa banyak daya CPU, memori dll. Ia harus melayani permintaan, bukan oleh jumlah koneksi TCP ke server.

Dennis Kaarsemaker
sumber
Saya bertanya-tanya bagaimana tingkat pembawa NAT akan mempengaruhi ini
TheLQ
@TheLQ Tanpa CGN, setiap klien tidak dapat membuka lebih dari 65535 koneksi ke server yang sama, tidak ada klien yang membutuhkan hampir banyak koneksi ke server yang sama. Dengan CGN, masing-masing CGN tidak dapat membuka lebih dari 65535 koneksi ke server yang sama, yang harus dibagikan di antara semua klien yang menggunakan CGN itu. Apakah CGN dapat secara bersamaan membuka 65535 koneksi ke satu server dan 65535 koneksi ke server lain adalah detail implementasi, yang dapat bervariasi antara implementasi CGN yang berbeda.
kasperd
Batas dapat ditingkatkan dengan menambahkan lebih banyak alamat IP ke CGN atau dengan menyebarkan lebih banyak CGN. Tapi Anda juga bisa menggunakan dual stack. Kemudian koneksi ke server dengan dukungan IPv6 tidak akan melalui CGN, sehingga mereka tidak akan mengkonsumsi nomor port yang berharga.
kasperd
14

Anda salah - keunikan soket ditentukan oleh empat faktor:

  1. alamat IP lokal
  2. nomor port lokal
  3. alamat IP jarak jauh
  4. nomor port jarak jauh

Saat menawarkan layanan jaringan, 1. dan 2. biasanya statis (mis. IP 10.0.0.1, port 80) tetapi kecuali jika Anda mengharapkan ribuan koneksi dari satu klien (atau satu gateway NAT), Anda tidak akan mendorong batas untuk kemungkinan kombinasi 3. dan 4. sebelum Anda kehabisan sumber daya lokal.

Jadi, meskipun secara praktis klien tidak akan menggunakan port yang sudah digunakan untuk koneksi untuk membuka koneksi ke alamat IP tujuan yang berbeda, penipisan nomor port akan menjadi masalah terkecil Anda untuk hampir semua aplikasi - baik itu di server atau sisi klien.

Masalahnya adalah masalah yang sangat nyata dengan gateway NAT (router) yang melayani klien dengan koneksi outbound terbuka yang tinggi (mis. Torrents) - di sana Anda akan melihat penipisan nomor port setelah pool port yang tersedia untuk NAT telah dikosongkan. Dalam hal ini gateway NAT tidak dapat membuat asosiasi tambahan, sehingga secara efektif memotong klien dari internet.

the-wabbit
sumber
2

Pertanyaannya adalah bagaimana menangani jumlah koneksi yang besar (> 64k). Dua metode yang paling umum adalah:

  • Menambahkan lebih banyak server, yang meningkatkan jumlah alamat src / dst dan nomor port tuple. Ada beberapa cara untuk berbagi beban di beberapa server; DNS round robin adalah satu; ada yang lain

  • Menyebarkan "carrier-grade NAT" (yang menurut hemat saya seorang teman dalam pandangan saya disebut sebagai "NAT yang lebih jelek"). Ini pada dasarnya adalah NAT dari NAT. Ini memiliki implikasi yang sangat buruk untuk aplikasi, tetapi itulah yang dilakukan oleh beberapa penyedia besar ketika mereka kehabisan ruang IPv4 dan / atau nomor port, dan / atau mereka tidak ingin pindah ke IPv6.

pengguna8162
sumber
2
Jika Anda membaca lebih dari judulnya, Anda akan melihat bahwa pertanyaan ini tentang kelelahan port dan OP salah tentang cara kerjanya. Bagaimana tepatnya jawaban ini menambahkan sesuatu yang baru dari nilai itu?
MDMarra
2
OP bertanya secara eksplisit (dan bukan hanya dalam tajuk utama) "bagaimana server mengalami jumlah permintaan yang sangat tinggi ...". Mengesampingkan kebingungan tentang cara kerja soket, itu pertanyaan yang valid.
user8162
1
Pekerjaan yang sangat baik untuk memotong pertanyaan di tengah kalimat. Sisa kalimat yang mengatakan: (more than the max port number).
MDMarra
2
Mungkin Anda melewatkan bagian di mana saya menetapkan OP tidak mengerti mekanisme soket. Saya berpendapat bahwa cara untuk melampaui port 64k adalah topik yang valid untuk diskusi; Maaf jika Anda tidak setuju, tetapi itu adalah pertanyaan dan itu adalah apa yang saya berikan beberapa jawaban. Anda bertanya bagaimana ini responsif; begitulah caranya.
user8162
3
Itu setengah pertanyaan. Pertanyaan gambaran besar - seperti yang didukung oleh kalimat terakhir OP - adalah bagaimana memecahkan penghalang 64k.
user8162