Saya telah belajar bahwa koneksi TCP diidentifikasi oleh tuple (sumber IP, port sumber, ip tujuan, port tujuan). Secara teoritis, dengan demikian dimungkinkan untuk memiliki klien dari host1: port1 terhubung ke server1: port1 dan pada saat yang sama klien lain (berjalan pada host1) dari host1: port1 ke server2: port1.
Saya telah menguji sedikit di Jawa, dan sejauh ini tampaknya mungkin.
Namun, saya telah membaca beberapa kali bahwa port sumber harus unik untuk alamat host, yang pada dasarnya berarti bahwa ada batas keras maksimal 65.536 koneksi TCP keluar bersamaan. Benarkah itu?
Pembaruan: Ini adalah kode Java saya. Ini sepertinya berhasil, dan netstat -t jelas menunjukkan dua koneksi keluar aktif dari port 9990 (satu ke 9997, satu ke 9998). Setidaknya pada Linux modern, sepertinya itu mungkin?
Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);
Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);
Dan keluaran netstat -t (terpotong):
tcp6 0 0 localhost:9990 localhost:9998 CONNECTED
tcp6 0 0 localhost:9990 localhost:9999 CONNECTED
Jawaban:
Ini bukan persyaratan TCP. Sejauh menyangkut TCP, hanya kombinasi IP sumber, port sumber, IP tujuan, dan port tujuan yang perlu unik. Namun, dalam praktiknya sebagian besar API TCP tidak menyediakan cara apa pun untuk membuat lebih dari satu koneksi dengan port sumber yang sama, kecuali mereka memiliki alamat IP sumber yang berbeda.
sumber
Itu maksimum dalam praktik biasanya lebih rendah. Misalnya Linux menggunakan
net.ipv4.ip_local_port
parameter kernel untuk menentukan port yang digunakan untuk koneksi keluar. Ini biasanya sepertiAnda dapat meningkatkan jumlah yang tersedia misalnya dengan sysctl
atau Anda dapat mengedit /etc/sysctl.conf dengan informasi yang sama
Semua contoh yang saya temukan menunjukkan nilai minimum menjadi 1024 juga.
sumber
Selain jawaban Iain (di atas), bahwa mungkin hanya ada 10.000 port yang diizinkan untuk koneksi keluar oleh kernel Anda, secara teori Anda setidaknya terbatas pada satu set XX, XXX port per alamat IP pada adaptor. Karena 127.1 tidak tersedia untuk dunia luar, berada di jaringan lokal, maka untuk setiap alamat IP lainnya ( eksternal ) Anda memiliki satu set port keluar dalam kisaran port 65K Anda.
Jadi batas keluar benar-benar:
Untuk membuatnya bekerja, Anda perlu membaca jawaban untuk utas ini .
sumber
Iya. Ini benar.
Port untuk mengikat dan aplikasi dengan jaringan.
Anda tidak dapat memiliki lebih dari 65553 aplikasi yang terhubung oleh TCP dan 65535 terhubung dengan UDP pada host yang sama. Sistem Operasi secara tipikal mengatur port secara dinamis, menetapkan port satu untuk setiap aplikasi yang terhubung ke jaringan.
Jika Anda memiliki dua aplikasi yang terdaftar pada port yang sama ketika paket jaringan tiba, komputer tidak dapat mengetahui aplikasi apa yang akan mengirimkan data. Sebagai contoh jika Anda memiliki Messenger dan Skype di port yang sama diikat ke pesan yang sama pesan messenger Anda akan muncul dalam skype dan sebaliknya :)
sumber
Meskipun suatu sistem mungkin memiliki batas pada jumlah koneksi TCP terbuka, biasanya tidak ada batasan mengenai nomor port yang digunakan. Namun implementasi TCP yang baik harus mencegah untuk menggunakan sepasang soket yang sama dua kali. (soket = alamat IP + port). Namun port ditugaskan untuk proses mencegah pencurian koneksi, dan metode yang biasa adalah meminta port gratis untuk port mendengarkan atau untuk yang keluar. Ini mencegah soket keluar duplikat dan karenanya koneksi duplikat. Gagal menggunakan metode itu, aplikasi itu sendiri harus mencegah membuat koneksi duplikat.
sumber