Gdy połączę się z https://www.google.co.uk, zmienia się to na 216.58.198.228:443. Następnie połączenie ze mną otwiera się na [Mój adres IP]: 63998.
Moje pytanie brzmi: w jaki sposób wybierany jest port 63998 i czy istnieje sposób na zmuszenie go do 63999.
networking
port
tcp
TheGathron
źródło
źródło
Odpowiedzi:
W jaki sposób określane są porty lokalne
Numer portu jest wybierany przez oprogramowanie implementujące TCP z zakresu numerów portów zwanych portami efemerycznymi .
Dokładny mechanizm wyboru numeru portu i zakresu, który należy zastosować, zależy od systemu operacyjnego.
Czy istnieje sposób na zmuszenie go do 63999.
Można to zrobić, zmieniając konfigurację oprogramowania implementacyjnego TCP.
Instrukcje dotyczące konfigurowania zakresu portów efemerycznych dla różnych systemów operacyjnych można znaleźć w części Zmiana zakresu portów efemerycznych .
Ograniczenie zasięgu do jednego portu nie jest jednak na przykład dobrym pomysłem
63999
.W systemie Windows nie jest to możliwe, ponieważ:
Zakres portów efemerycznych
Źródło Zakres przejściowy portów
Zmiana zakresu portów efemerycznych
Linux:
Windows Vista / Windows Server 2008 i nowsze:
Źródło Zmiana zakresu portów efemerycznych
Źródło artykułu 929851 Microsoft Knowledgebase :
Windows XP i starszy:
Źródło Zmiana zakresu portów efemerycznych
źródło
bind
systemowe przed wywołaniemconnect
. Niektóre aplikacje mają taką opcję, inne nie.Odpowiedź Davida Postilla jest całkowicie słuszna. Chciałbym tylko dodać do tego, podkreślając, że zmiana efemerycznego zakresu portów w Linuksie jest tak prosta, że OP ma twierdzącą odpowiedź.
Zmieniasz EPR w następujący sposób:
i możesz wybrać port 50000 (jako przykład) za pomocą następującego skryptu:
Jedno zastrzeżenie tutaj: ponieważ w zasięgu znajduje się jeden port, inna aplikacja może go oderwać od wykonania trzeciej i czwartej linii powyżej; również, nawet jeśli nie ma warunków wyścigu, sparaliżujesz wszystkie inne aplikacje, dopóki nie przywrócisz dużego EPR, dlatego przywróciłem pierwotny zakres tak szybko, jak to możliwe.
Tak więc, jeśli systemem operacyjnym PO byłby Linux, odpowiedzią byłoby, że można to łatwo zrobić.
O dziwo, nie jest to takie proste w przypadku BSD, z których niektóre nie mają nawet ustawień jądra środowiska uruchomieniowego dla EPR. MacOS X, FreeBSD i OpenBSD wymagają modyfikacji pliku /etc/sysctl.conf , ale mają różne opcje dla EPR.
Niezależnie od powyższego i systemu operacyjnego fakt, że coś można zrobić, nie oznacza, że należy to zrobić: dlaczego, u licha, potrzebujesz tego? Nie mogę wymyślić jednego przypadku użycia.
źródło
BIND_PORT
opcjonalne, aby kod mógł być nadal używany dokładnie tak samo jak oryginał. Myślę,htons(bind_port_env ? atoi(bind_port_env) : 0)
że postąpiłby właściwie.Warto dodać, że jądro Linuksa również ma
net.ipv4.ip_local_reserved_ports
pokrętło działa nieco przeciwnie, ale mimo to może być bardzo przydatne, ponieważ w ten sposób można „wykopać dziurę” w przypadku usług, które otwierają określone porty w efemerycznym zakresie portów.
Krótki fragment dokumentacji :
źródło