Pengaturcaraan rangkaian Dalam aplikasi tcp, pelayan mencuri dengar pada port tetap terlebih dahulu, pelanggan secara aktif memulakan sambungan, dan sambungan tcp diwujudkan selepas berjabat tangan tiga hala. Apakah bilangan maksimum sambungan TCP serentak untuk satu mesin?
Cara menandakan sambungan TCP Sebelum menentukan bilangan maksimum sambungan, mari kita lihat dahulu cara sistem menanda sambungan TCP. Sistem menggunakan 4-tuple untuk mengenal pasti sambungan TCP secara unik: {localip, localport, remoteip, remoteport}.
Bilangan maksimum sambungan TCP untuk pelanggan Setiap kali pelanggan memulakan permintaan sambungan TCP, melainkan port terikat, sistem secara amnya akan memilih port tempatan melahu (port tempatan ini adalah eksklusif dan tidak boleh dikongsi dengan TCP lain). sambungan. Jenis data port TCP adalah unsignedshort, jadi bilangan maksimum port tempatan hanya 65536 pada sistem pelayan Linux Port 0 mempunyai makna yang istimewa dan tidak boleh digunakan oleh itu, paling banyak port yang tersedia. apabila semua digunakan sebagai pelanggan, bilangan maksimum sambungan TCP ialah 65535. , sambungan ini boleh disambungkan ke serverip yang berbeza.
Bilangan maksimum sambungan tcp untuk pelayan Pelayan biasanya ditetapkan pada port tempatan dan mendengar, menunggu permintaan sambungan pelanggan. Tanpa mengambil kira penggunaan semula alamat (pilihan SO_REUSEADDR Unix), walaupun terdapat berbilang IP pada bahagian pelayan, port penyadapan tempatan juga eksklusif Oleh itu, hanya terdapat remoteip (iaitu, clientip) dan remoteport (klien) dalam 4 -tuple sambungan tcp bahagian pelayan) adalah berubah-ubah, jadi sambungan TCP maksimum ialah bilangan IP klien × bilangan port klien Untuk IPV4, tanpa mengira faktor seperti klasifikasi alamat IP dan perisian Linux, maksimum bilangan sambungan TCP adalah lebih kurang 2 hingga kuasa ke-32 (bilangan IP) ×2 hingga kuasa ke-16 (bilangan port) Had sambungan tcp Linux , iaitu, bilangan maksimum sambungan tcp pada sebelah pelayan tunggal adalah lebih kurang 2 kepada kuasa ke-48.
Berapa banyak sambungan TCP serentak boleh ada pada pelayan tunggal sedemikian
Apa yang diberikan di atas ialah bilangan sambungan maksimum teori untuk satu mesin Dalam persekitaran sebenar, ia dihadkan oleh sumber mesin, sistem pengendalian, dsb., terutamanya pada bahagian pelayan, dan bilangan maksimum sambungan TCP serentak adalah jauh. daripada mencapai had atas teori. Sebab utama untuk mengehadkan bilangan sambungan di bawah Unix/Linux ialah memori video dan bilangan deskriptor fail yang dibenarkan (setiap sambungan TCP menduduki jumlah memori video tertentu, dan setiap soket ialah deskriptor fail. Selain itu, port di bawah 1024). biasanya dikhaskan. Di bawah konfigurasi kernel 2.6 lalai, selepas ujian, setiap soket menduduki antara 15 dan 20k. Parameter yang mempengaruhi memori yang diduduki oleh soket termasuk: rmem_maxwmem_maxtcp_rmemtcp_wmemtcp_memgrepskbuff/proc/slabinfo Di bahagian pelayan, dengan mengurangkan memori video dan mengubah suai bilangan maksimum deskriptor fail dan parameter lain, tidak ada masalah untuk bilangan maksimum serentak. Sambungan TCP pada mesin tunggal melebihi 100,000 Syarikat UrbanAirship Dalam persekitaran pengeluaran, 500,000 pengguna serentak telah dicapai. Dalam aplikasi praktikal, untuk aplikasi rangkaian berskala besar, isu C10K juga perlu dipertimbangkan.
Mari terangkan dua pengertian sekatan pemegang fail dan sekatan port
Akal budi 1: Sekatan pemegang fail
Rakan sekerja yang menulis program pelayan rangkaian di bawah Linux mesti tahu bahawa setiap sambungan TCP menduduki deskriptor fail Setelah deskriptor fail ini digunakan, ralat kembali kepada kami apabila sambungan baharu dibuat ialah "Socket/File:Can 'topensemanyfiles'.
Pada masa ini, anda perlu memahami had sistem pengendalian pada bilangan maksimum fail yang boleh dibuka.
Had Proses
Melaksanakan ulimit-n output 1024, menunjukkan bahawa proses hanya boleh membuka sehingga 1024 fail, jadi jika anda menggunakan konfigurasi lalai ini, anda boleh menjalankan beribu-ribu sambungan TCP secara serentak.
Perubahan sementara: ulimit-n1000000, dan perubahan sementara ini hanya sah untuk persekitaran penggunaan semasa pengguna yang sedang log masuk, dan akan menjadi tidak sah selepas sistem dimulakan semula atau pengguna log keluar.
Perubahan yang menjadi tidak sah selepas dimulakan semula (tetapi saya mengujinya di bawah CentOS6.5 dan mendapati tiada ketidaksahihan selepas dimulakan semula): Edit fail /etc/security/limits.conf, dan kandungan yang diubah ialah
*softnofile1000000
*hardnofile1000000
Perubahan kekal: Edit /etc/rc.local dan tambah kandungan berikut selepasnya
ulimit-SHn1000000
Sekatan global
Melaksanakan output cat/proc/sys/fs/file-nr 93440592026, iaitu: 1. Bilangan pemegang fail yang diperuntukkan, 2. Bilangan pemegang fail yang diperuntukkan tetapi tidak digunakan, 3. Bilangan maksimum pemegang fail. Tetapi dalam versi kernel2.6, nilai item kedua sentiasa 0. Ini bukan ralat Ini sebenarnya bermakna semua deskriptor fail yang diperuntukkan telah digunakan tanpa sebarang pembaziran.
Kita boleh menukar nilai ini kepada nilai yang lebih besar dan menukar fail /etc/sysctl.conf dengan keistimewaan root:
fs.file-maks=1000000
net.ipv4.ip_conntrack_max=1000000
filter.ip_conntrack_max=1000000
Akal budi 2: Adakah julat nombor port terhad?
Sepanduk bahagian bawah sistem pengendalian di bawah 1024 dikhaskan oleh sistem dan 1024-65535 digunakan oleh pengguna. Oleh kerana setiap sambungan TCP menduduki nombor port, kami boleh mempunyai sehingga lebih daripada 60,000 sambungan serentak. Rasanya ramai pelajar yang salah idea ni kan? (Saya selalu rasa begini dulu)
Mari kita analisanya
Cara untuk menandakan sambungan TCP: Sistem menggunakan 4-tuple untuk menandakan sambungan TCP secara unik: {localip, localport, remoteip, remoteport}. Baiklah, mari kita ambil penjelasan penerimaan dalam Bab 4 "Pengaturcaraan Rangkaian UNIX: Jilid 1" untuk melihat perkara konseptual Parameter kedua cliaddr mewakili alamat IP dan nombor port pelanggan. Sebagai pelayan, kami sebenarnya hanya menggunakan port ini semasa bind, yang menunjukkan bahawa nombor port 65535 bukanlah had pada jumlah concurrency.
Bilangan maksimum sambungan TCP ke pelayan: Pelayan biasanya ditetapkan pada port tempatan dan mendengar, menunggu permintaan sambungan pelanggan. Tanpa mengambil kira penggunaan semula alamat (pilihan SO_REUSEADDR Unix), walaupun terdapat berbilang IP pada bahagian pelayan, port penyadapan tempatan juga eksklusif Oleh itu, hanya terdapat remoteip (iaitu, clientip) dan remoteport (klien) dalam 4 -tuple bagi sambungan tcp bahagian pelayan) adalah berubah-ubah, jadi sambungan tcp maksimum ialah bilangan ip klien × bilangan port klien Untuk IPV4, tanpa mengira insentif seperti klasifikasi alamat IPHad nombor sambungan tcp Linux. , bilangan maksimum sambungan tcp ialah kira-kira 2 kali 32 kali Kuasa (bilangan IP) × 2 dinaikkan kepada kuasa ke-16 (bilangan port), iaitu bilangan maksimum sambungan TCP pada mesin tunggal di bahagian pelayan adalah kira-kira 2 dinaikkan kepada kuasa ke-48.
Atas ialah kandungan terperinci Analisis bilangan maksimum sambungan TCP serentak dan kaedah pengenalan untuk mesin tunggal dalam pengaturcaraan rangkaian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!