Berapa jumlah maksimum teoritis koneksi TCP terbuka yang dapat dimiliki oleh kotak Linux modern
236
Dengan asumsi kinerja tak terbatas dari perangkat keras, dapatkah kotak Linux mendukung> 65536 koneksi TCP terbuka?
Saya mengerti bahwa jumlah porta fana (<65536) membatasi jumlah koneksi dari satu IP lokal ke satu porta pada satu IP jarak jauh.
Tuple (ip lokal, port lokal, ip jarak jauh, port jarak jauh) adalah apa yang secara unik mendefinisikan koneksi TCP; apakah ini menyiratkan bahwa lebih dari 65 ribu koneksi dapat didukung jika lebih dari satu parameter ini gratis. mis. koneksi ke nomor port tunggal pada beberapa host jarak jauh dari beberapa IP lokal.
Apakah ada batas 16 bit dalam sistem? Jumlah deskriptor file mungkin?
Satu port mendengarkan dapat menerima lebih dari satu koneksi secara bersamaan.
Ada batas '64K' yang sering dikutip, tetapi itu adalah per klien per port server , dan perlu diklarifikasi.
Setiap paket TCP / IP pada dasarnya memiliki empat bidang untuk pengalamatan; ini adalah:
source_ip source_port destination_ip destination_port
< client > < server >
Di dalam tumpukan TCP, keempat bidang ini digunakan sebagai kunci majemuk untuk mencocokkan paket dengan koneksi (mis. Deskriptor file).
Jika klien memiliki banyak koneksi ke port yang sama pada tujuan yang sama, maka tiga bidang tersebut akan sama - hanya source_portbervariasi untuk membedakan koneksi yang berbeda. Port adalah angka 16-bit, oleh karena itu jumlah koneksi maksimum yang dapat dimiliki setiap klien ke port host tertentu adalah 64K.
Namun, beberapa klien masing-masing dapat memiliki koneksi 64K ke beberapa port server, dan jika server memiliki beberapa port atau keduanya multi-homed maka Anda dapat melipatgandakannya lebih lanjut.
Jadi batas sebenarnya adalah deskriptor file. Setiap koneksi soket individu diberikan deskriptor file, sehingga batas sebenarnya adalah jumlah deskriptor file yang telah dikonfigurasikan oleh sistem untuk memungkinkan dan sumber daya untuk ditangani. Batas maksimum biasanya di atas 300K, tetapi dapat dikonfigurasi misalnya dengan sysctl .
Batas realistis yang dibanggakan untuk kotak normal adalah sekitar 80 ribu misalnya server pesan tunggal berulir Jabber.
Secara teoritis Anda dapat memiliki lebih dari 64K koneksi keluar jika Anda (a) menggunakan SO_REUSEADDR dan (b) menargetkan alamat IP tujuan yang berbeda. Tetapi batas memori kernel mungkin akan menghentikan Anda terlebih dahulu.
Darron
4
Batas sysctl adalah untuk seluruh sistem, bukan? Ada juga batas yang dapat dikonfigurasi dengan ulimit, yang membatasi jumlah maksimum file deskriptor untuk suatu proses. Itu secara default jauh kurang dari 300K, biasanya 1024.
pacoverflow
1
Sedikit teknis: Mesin klien juga dapat memiliki beberapa alamat IP yang ditetapkan dari router. Ini semua dapat ditugaskan ke satu MAC, atau mesin itu dapat memiliki beberapa antarmuka jaringan fisik untuk alamat IP tambahan. OP menentukan 1 IP, tetapi penting bagi orang lain untuk tidak mengesampingkan lebih banyak alamat IP.
Todd
2
@Will Indah menjelaskan !! Sangat membantu ... Ingin memberi +100 upvotes ... terima kasih :-)
Tom Taylor
1
Ketahuilah bahwa tcp_fin_timeout memblokir soket yang sama (sumber, target, kombinasi port) selama 60 detik secara default, yang sangat mengurangi jumlah koneksi tcp yang sebenarnya tersedia antara dua sistem, jika koneksi terputus dan sering dihubungkan kembali. Masalah ini dapat diminimalkan dengan memungkinkan untuk menggunakan kembali (tcp_tw_reuse = 1) soket dalam keadaan TIME_WAIT (tidak selalu didukung) atau dengan melanggar standar TCP / IP dalam mengurangi batas waktu ini ke nilai yang lebih rendah (biasanya berfungsi dengan baik).
fgwaller
17
Jika Anda berpikir untuk menjalankan server dan mencoba memutuskan berapa banyak koneksi yang dapat dilayani dari satu mesin, Anda mungkin ingin membaca tentang masalah C10k dan potensi masalah yang terlibat dalam melayani banyak klien secara bersamaan.
@MikkoRantalainen - ya. Saya pikir ada tolok ukur yang lebih baik tersedia sekarang. Orang-orang Phoenix telah mendorongnya ke 2 juta koneksi simultan.
Beberapa tahun yang lalu: Intel Atom D2700, 2GB RAM, 1.2M koneksi bersamaan. Satu-satunya masalah yang saya miliki adalah dengan kotak Windows dalam pekerjaan pengujian; ini secara teratur naik ketika mencoba untuk melakukan Intel kotak Intel ...
Klaws
12
Jika Anda menggunakan socket mentah ( SOCK_RAW) dan mengimplementasikan kembali TCP di userland, saya pikir jawabannya terbatas dalam hal ini hanya dengan jumlah (local address, source port, destination address, destination port)tupel (~ 2 ^ 64 per alamat lokal).
Tentu saja akan membutuhkan banyak memori untuk menjaga keadaan semua koneksi tersebut, dan saya pikir Anda harus mengatur beberapa aturan iptables untuk menjaga agar tumpukan TCP kernel tidak menjadi kesal & / atau merespons atas nama Anda.
Jika Anda berpikir untuk menjalankan server dan mencoba memutuskan berapa banyak koneksi yang dapat dilayani dari satu mesin, Anda mungkin ingin membaca tentang masalah C10k dan potensi masalah yang terlibat dalam melayani banyak klien secara bersamaan.
sumber
Jika Anda menggunakan socket mentah (
SOCK_RAW
) dan mengimplementasikan kembali TCP di userland, saya pikir jawabannya terbatas dalam hal ini hanya dengan jumlah(local address, source port, destination address, destination port)
tupel (~ 2 ^ 64 per alamat lokal).Tentu saja akan membutuhkan banyak memori untuk menjaga keadaan semua koneksi tersebut, dan saya pikir Anda harus mengatur beberapa aturan iptables untuk menjaga agar tumpukan TCP kernel tidak menjadi kesal & / atau merespons atas nama Anda.
sumber