Anda memiliki dua pertanyaan utama di sini:
1.
Sebenarnya IPv4 berbicara, apakah port exhaustion benar-benar mungkin?
Ya. Ambil, misalnya, router penyeimbang beban yang mengirim semua koneksi ke alamat IP NAT. Hal ini mungkin terjadi jika Anda memiliki banyak SRC IP
s terhubung ke hambatan dari satu DST IP
.
Artinya, server web Anda dapat memiliki banyak koneksi seperti:
[email protected]:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 173.200.1.18:80 10.100.1.100:49923 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.200.1.200:10155 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:14400 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:50652 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.20.1.20:57554 ESTABLISHED 13939/nginx: worker
dan itu baik-baik saja. Namun, jika semua 'Alamat Asing' sama, ini dapat menyebabkan masalah (mis. 'router besar yang menjalankan NAT <---> server dengan satu alamat IP').
Jika saya harus mendalilkan mengapa kehabisan port sementara bukan masalah umum, saya sarankan itu karena setiap port memerlukan layanan mendengarkan dan sumber daya yang cukup untuk merespons - sumber daya lain (memori, cpu) biasanya merupakan hambatan pertama.
Namun, saya pribadi menemukan beberapa masalah kehabisan port saat bekerja di perusahaan penyeimbangan beban.
2. Mengapa port bekas dapat menimbulkan masalah untuk layanan mendengarkan?
"Yang memungkinkan penggunaan port efemeral dari 1024-65535, bahwa jika saya memiliki layanan yang mengikat port 3306 (mySQL, misalnya), terkadang layanan tersebut gagal dimulai karena port sedang digunakan."
Server mySQL tidak dapat mengikat ke port itu jika sedang digunakan - katakanlah oleh localhost:3306 atau di semua antarmuka. Misalnya, lihat baris 0.0.0.0:80 di netstat
berikut keluaran?
[email protected]:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 964/php-fpm.conf)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1660/mysqld
tcp 0 0 0.0.0.0:842 0.0.0.0:* LISTEN 1317/inetd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13938/nginx
Artinya, port 80 mendengarkan semua antarmuka lokal ke server. Jika proses lain menyimpan port 80 sebelum nginx
saya server dimulai, nginx
tidak akan dapat mengontrol port tersebut dan kemungkinan akan gagal dalam prosedur memulainya.
Biasanya, port 3306 baik-baik saja karena layanan mendengarkan memiliki port (atau rentang) yang telah ditentukan sebelumnya yang diminta dari mesin host - mis. porta 80 dan 443 untuk server web.