Gratulacje, właśnie zagłębiłeś się w koncepcję warstw sieciowych, zdając sobie sprawę, że porty i protokoły nie są ze sobą bezpośrednio połączone. Jak mówią inni, telnet może być używany do łączenia się z dowolnym portem TCP. Jednak, aby zrozumieć, dlaczego jest to możliwe, musisz trochę zrozumieć warstwy sieciowe. Jeśli kiedykolwiek słyszałeś o modelu warstwy OSI 7, to pozwala ci używać telnetu do łączenia się z innym portem. Chociaż w Internecie, dotyczą tylko 4 warstw i nazywa się Internet Protocol Suite. Bez warstw sieci każdy program musiałby nie tylko zrozumieć własny protokół, ale musiałby również zdefiniować własny schemat adresowania IP i system portów, co oznacza, że każdy router musiałby zrozumieć, w jaki sposób kierować tymi schematami, a różne protokoły byłyby dużo trudniej się uczyć i diagnozować. Krótko mówiąc, Internet nie działałby równie dobrze bez warstw.
Dotyczy to warstwy transportowej i warstwy aplikacji. W warstwie transportowej mamy protokoły internetowe, takie jak TCP i UDP, z numerami portów od 1 do 65535 na każdym. W warstwie aplikacji mamy protokoły takie jak HTTP, SMTP i DNS. Zwykle każdy dokument standardów internetowych definiujący protokół określa domyślny port TCP lub UDP, z którego protokół powinien korzystać domyślnie. Takich jak port TCP 80 dla HTTP, port TCP 25 dla SMTP, port UDP 53 dla DNS i port TCP 23 dla Telnet. Program telnet faktycznie mówi protokołem TELNET, który jest protokołem standardowym, ale przeważnie starożytny według obecnych standardów. Ponieważ sekwencje protokołów składają się z 8-bitowych znaków, rzadko widzi się sam protokół i jest on przeważnie przezroczysty w porównaniu z innymi bardziej nowoczesnymi protokołami, takimi jak HTTP i SMTP, które używają widocznych dla człowieka słów w ASCII, takich jak GET, POST, HELO, LOGIN, itp.
Ponieważ jego protokół nie jest ogólnie widoczny, telnet stworzył dobre narzędzie do łączenia się z innymi portami TCP i umożliwiające użytkownikowi ręczne wpisywanie protokołów. Niektórzy administratorzy sieci używają tej techniki do diagnozowania problemów z serwerami. Ponieważ jednak program Telnet nadal ma swój własny protokół i może czasami wysyłać dodatkowe bity danych, nadal możesz napotkać problemy z tą techniką. Podczas korzystania z usługi telnet naprawdę „nawiążesz połączenie” zarówno z warstwą aplikacji, jak i warstwą transportową. Zdarza się po prostu, że inne protokoły warstwy aplikacji mogą działać poprawnie przez większość diagnostyki i nie będą zakłócały protokołu telnet. Jest lepszy program do robienia tego poprzez nc (Net Cat. Nazwa pochodzi od wersji komendy cat).
$ nc www.stackexchange.com 80
Program nc nie zna żadnego protokołu warstwy aplikacji, a gdy nawiązujesz z nim połączenie, „nawiązujesz połączenie” tylko w warstwie internetowej (adres IP) i warstwie transportowej (TCP lub UDP). Oznacza to, że kontrolujesz, który protokół warstwy aplikacji jest używany. Prawie wszystko jest uczciwą grą, nawet binarne protokoły. Pozwala to również robić przydatne rzeczy, takie jak przesyłanie plików bez ich uszkodzenia i nasłuchiwać portów na przychodzącym ruchu:
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
Następnie film.mp4 jest przesyłany przez sieć w ogóle bez protokołu warstwy aplikacji (takiej jak FTP). Protokół aplikacji jest tak naprawdę Twoim przyjacielem, który informuje cię, że jest gotowy do uruchomienia polecenia.
nc może także obsługiwać pakiety UDP i gniazda domeny UNIX. Używanie go do słuchania może być również interesujące.
nc -l 12345
Teraz w przeglądarce internetowej odwiedź http: // localhost: 12345 /, a podczas sesji nc powinieneś zobaczyć GET / HTTP/1.1
żądanie przeglądarki . W tym momencie możesz wpisać coś i nacisnąć Ctrl-D
i powinno to pojawić się w przeglądarce jako zwykły tekst (jeśli chcesz, aby HTML się pojawił, musisz odesłać mu poprawną odpowiedź protokołu HTTP, a następnie kod HTML).
Czasami programy, które natywnie mówią jeden protokół, taki jak HTTP, mogą łączyć się z innymi portami przeznaczonymi dla innego protokołu. Zazwyczaj nie można tego zrobić w przeglądarce GUI, ponieważ ograniczyły one możliwość łączenia się z niektórymi portami, ale jeśli użyjesz programu takiego jak curl, aby połączyć się z portem 25 (SMTP do wysyłania poczty), prawdopodobnie zobaczysz kilka błędy dotyczące zerwania protokołu.
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
Dzieje się tak, ponieważ curl zwykle mówi protokołem HTTP, więc po ustanowieniu uzgadniania TCP zaczyna wysyłać dane w następujący sposób:
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
Ale serwer SMTP oczekuje SMTP, który jest bardziej podobny do tego:
HELO myhomecomputername.local
W którym momencie serwer odsyła linię identyfikacyjną:
250 yourispsmtpserverhost.com
Widzisz więc, że nic nie stoi na przeszkodzie, aby curl nawiązał połączenie warstwy transportowej z serwerem SMTP, po prostu nie może odczytać protokołu. Ale możesz mówić protokół samemu za pomocą programu takiego jak telnet lub bardziej korzystnie nc.
nc(1)
) jest znacznie bardziej elastyczne. Może łączyć się z usługami szyfrowanymi SSL / TLS, a także służyć jako serwer, a nawet przekazywać dane.