Apakah port sumber TCP harus unik per host?


10

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 

"Jika Anda bertanya tentang batas atas sistem yang dirancang dengan baik, Anda hampir pasti Melakukannya Salah ™ "
Chris S

Jawaban:


16

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.


2
Terima kasih, itu menjawab bagian teoretis dari pertanyaan saya sepenuhnya! Saya hanya harus mencoba untuk setiap implementasi TCP, saya kira.
lxgr

5

Itu maksimum dalam praktik biasanya lebih rendah. Misalnya Linux menggunakan net.ipv4.ip_local_portparameter kernel untuk menentukan port yang digunakan untuk koneksi keluar. Ini biasanya seperti

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Anda dapat meningkatkan jumlah yang tersedia misalnya dengan sysctl

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

atau Anda dapat mengedit /etc/sysctl.conf dengan informasi yang sama

net.ipv4.ip_local_port_range = 10000 65535

Semua contoh yang saya temukan menunjukkan nilai minimum menjadi 1024 juga.


1

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:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Untuk membuatnya bekerja, Anda perlu membaca jawaban untuk utas ini .


0

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 :)


Saya pikir pertanyaannya bukan tentang batas atas jumlah aplikasi mendengarkan - yang, seperti yang Anda tunjukkan, dibatasi oleh jumlah nomor port unik - tetapi tentang jumlah soket yang beroperasi pada suatu waktu. Server web sering memiliki lusinan soket yang semuanya ditujukan ke port tunggal 80 atau 443. Jika banyak server pada host melakukan itu, maka tidak ada alasan bahwa jumlah soket yang terbuka tidak boleh melebihi 2 ^ 32.
Brandon Rhodes

0

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.


3
Bagaimana ini menambahkan sesuatu yang baru yang sudah diposting di Pertanyaan lama ini?
Chris S
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.