0 numaralı TCP bağlantı noktasına bağlanmak mümkün mü?


59

0 numaralı TCP bağlantı noktasını dinlemek, sistemde bana ücretsiz bir bağlantı noktası numarası tahsis eder.

Fakat 0 numaralı TCP bağlantı noktasına bağlanmayı denediğimde ne olur ? Açık cevap: "Çalışmıyor":

$ nc localhost 0                 
nc: port number too small: 0

Bu sistem neresinde kullanılır? İşletim sistemi çekirdeğinin TCP yığınında mı? 0 numaralı TCP bağlantı noktasına bağlanmanın çalışacağı Unix'ler var mı?


2
Teorik olarak, 0 portundan dinleyen ya da bağlanan özel bir TCP yığını oluşturabilirsiniz, bu da bu iki uygulamanın 0 portunda birbirleriyle konuşabileceği anlamına gelir.
Joshua

Yanıtlar:


60

Sadece aynı sayfada olduğumuzdan emin olmak için (sorunuz bu şekilde belirsizdir), TCP'yi 0 numaralı bağlantı noktasından bağlamak istemeniz, dinamik olarak kullanılmayan bir bağlantı noktası numarası oluşturma isteğini belirtir. Başka bir deyişle, bu istekden sonra gerçekten dinlediğiniz port numarası sıfır değildir. Bu açmayla ilgili bir açıklama var [linux kernel source]/net/ipv4/inet_connection_sock.cüzerinde inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

Bu standart bir unix konvansiyonudur. Bağlantı noktası 0'ın kullanımına gerçekten izin verecek sistemler olabilir, ancak bunun kötü bir uygulama olduğu düşünülür. Ancak bu davranış resmi olarak POSIX, IANA veya TCP protokolü tarafından belirtilmemiştir. 1 Bunu ilginç bulabilirsiniz .

Bu nedenle, sıfır numaralı bağlantı noktasına kesin bir TCP bağlantısı kuramazsınız. Muhtemelen ncbunun farkında ve duyusal olmayan bir talepte bulunduğunuzu bildirir. Bunu yerel kodda denerseniz:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

Kullanılamayan diğer bağlantı noktalarına bağlanmaya çalıştığınız aynı hatayı alıyorsunuz: ECONNREFUSED"Bağlantı reddedildi". Yani cevap olarak:

Bu sistem neresinde kullanılır? İşletim sistemi çekirdeğinin TCP yığınında mı?

Muhtemelen değil; özel işlem gerektirmez. Yani, 0 numaralı bağlantı noktasında bağlanma ve dinlemeye izin veren bir sistem bulabilirseniz, muhtemelen buna bağlanabilirsiniz.


1. Ama IANA yok "Saklıdır" (olarak bakın burada bakınız ). Anlamı, bu liman olmamalı çevrimiçi kullanılabilir. Bu, dinamik atama kongre (tamamiyle kullanılmayacağından) açısından tamamdır. Bunun özellikle bir amaç olarak IANA'nın kapsamının ötesinde olacağını; Aslında, işletim sistemleri, hiçbir şey dahil, istediklerini yapmakta serbesttirler.


İpv4'te 0.0.0.0 adresiyle aynı fikir gibi gözüküyor. Ayrılmış bir değer olup, işletim sistemi ve programlar tarafından özel bir amaç için kullanılır. Bir benzetme olarak, radyoda, hiç kimsenin iletim için kullanmadığı ancak dahili olarak ekipmanlarda kullanıldığı ayrılmış frekanslar vardır.
ctrl-alt-delor

1
@ richard no, 0.0.0.0'ın farklı bir anlamı vardır;) geçersiz, bilinmeyen veya uygulanabilir olmayan bir hedef veya "yayın" olarak belirtmek için kullanılır
AndreaCi

2
@AndreaCi 255.255.255.255 yayınlanmadı mı?
cırcır ucube

4
@ratchetfreak 255.255.255.255 yayınlandı. 0.0.0.0'ın içeriğe bağlı olarak iki anlamı vardır. Programlamada INADDR_ANY, w'nin ne demek istediği w / ile eşanlamlıdır (sistem bunu varsayılan olarak değiştirecektir). Fakat aslında bu adresi bir ağ üzerinde kullanmak, Andrea'nın ("yayın" olarak sayıldığı kadar açık olması dışında) bahsettiği gibi görünmektedir: en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

Bağlantı Noktası 0 kullanılması, bir sonraki uygun bağlantı noktasını aramak ve tahsis etmek için işletim sistemini tetikler. Bu, belirli bir bağlantı noktasını kodlamanız veya uygun bir bağlantı noktası aramanız gerekmez. Mint Linux sistemim geri dönüyor

nc: port range not valid

için

nc localhost 0 

2

nc -l 0İşletim Sisteminden 0 numaralı bağlantı noktasını dinlemesini isteyecektir. Ancak yukarıda belirtildiği gibi, çoğu işletim sistemi 0'ı görecek ve uygulamanız için pozitif numaralı bir bağlantı noktası seçmek için kendi geleneklerini ncisteyecektir.


çoğu işletim sistemi tamam mı?
bar'da barlop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.