telnet
인터넷 검색 후에 웹 서버를 http 포트에 연결하고 이를 사용하여 GET
html 페이지를 검색 할 수 있다는 것을 발견했습니다 .
예를 들어:
$ telnet web-server-name 80
하지만 이것이 어떻게 가능한지 이해할 수 없습니까?
포트 80이 http 서버에 사용된다면 포트 80은 http
요청만 수신할 것입니다. 그런데 항구 telnet
까지 어떻게 가나 요?HTTP
telnet
두 가지 HTTP
다른 프로토콜 이 아닌가요 ?
답변1
축하합니다. 포트와 프로토콜이 서로 직접 연결되어 있지 않다는 점을 인식하여 네트워크 계층의 개념을 자세히 살펴보았습니다. 다른 사람들이 말했듯이 텔넷을 사용하여 모든 TCP 포트에 연결할 수 있습니다. 그러나 이것이 가능한 이유를 이해하려면 네트워크 계층에 대해 알아야 합니다. 당신이 들어 본 적이 있다면OSI 7레이어 모델이를 통해 텔넷을 사용하여 다른 포트에 연결할 수 있습니다. 인터넷에서는 레이어 4에만 관심이 있지만 이를 레이어라고 합니다.인터넷 프로토콜 제품군. 네트워크 계층이 없으면 각 프로그램은 자체 프로토콜을 알아야 할 뿐만 아니라 자체 IP 주소 지정 체계와 포트 시스템을 정의해야 합니다. 즉, 모든 라우터는 해당 체계와 다양한 프로토콜을 라우팅하는 방법을 알아야 합니다. 많은 문제를 일으킬 것입니다. 배우고 진단하기가 더 어렵습니다. 간단히 말해서, 레이어링이 없으면 인터넷이 제대로 작동하지 않습니다.
당신이 관심을 갖는 것은 전송 계층과 애플리케이션 계층입니다. 전송 계층에는 TCP 및 UDP와 같은 인터넷 프로토콜이 있으며 각 프로토콜의 포트 번호는 1부터 65535까지입니다. 애플리케이션 계층에는 HTTP, SMTP, DNS와 같은 프로토콜이 있습니다. 일반적으로 프로토콜을 정의하는 각 인터넷 표준 문서는 해당 프로토콜이 기본적으로 사용하는 기본 TCP 또는 UDP 포트를 지정합니다. 예를 들어 HTTP의 경우 TCP 포트 80, SMTP의 경우 TCP 포트 25, DNS의 경우 UDP 포트 53, Telnet의 경우 TCP 포트 23입니다. 텔넷 프로그램은 실제로 TELNET 프로토콜에 대해 이야기합니다.표준 프로토콜, 그러나 대부분은 현재 기준으로 볼 때 고대입니다. 프로토콜 시퀀스는 8비트 문자로 구성되어 있기 때문에 프로토콜 자체를 거의 볼 수 없으며 GET, POST, HELO와 같이 사람이 볼 수 있는 ASCII 단어를 사용하는 HTTP 및 SMTP와 같은 다른 최신 프로토콜에 비해 대체로 투명합니다. , 로그인 등
해당 프로토콜은 일반적으로 보이지 않기 때문에 텔넷은 다른 TCP 포트에 연결하고 사용자가 프로토콜을 수동으로 입력할 수 있도록 하는 훌륭한 도구를 만듭니다. 일부 네트워크 관리자는 이 기술을 사용하여 서버 문제를 진단합니다. 그러나 텔넷 프로그램에는 여전히 자체 프로토콜이 있고 때로는 추가 데이터 비트를 보낼 수 있으므로 이 기술을 사용하면 여전히 문제가 발생합니다. 텔넷을 사용하면 실제로 애플리케이션 계층과 전송 계층에서 "연결을 만드는" 것입니다. 다른 응용 프로그램 계층 프로토콜은 대부분의 진단에 대해 잘 작동하며 텔넷 프로토콜을 방해하지 않습니다. 이를 수행하는 더 나은 프로그램은 nc(Net Cat. cat 명령의 네트워크 기반 버전 이름을 따서 명명되었습니다)입니다.
$ nc www.stackexchange.com 80
nc 프로그램은 응용 프로그램 계층 프로토콜을 사용하지 않습니다. 연결을 설정할 때 인터넷 계층(IP 주소)과 전송 계층(TCP 또는 UDP)에서만 "연결을 설정"합니다. 이는 어떤 애플리케이션 계층 프로토콜이 사용되는지 제어할 수 있음을 의미합니다. 바이너리 프로토콜을 포함한 거의 모든 것이 공정한 게임입니다. 또한 이를 통해 파일을 손상시키지 않고 전송하고 포트에서 들어오는 트래픽을 수신하는 등의 유용한 작업을 수행할 수 있습니다.
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
그런 다음 movie.mp4는 애플리케이션 계층 프로토콜(예: FTP)을 전혀 사용하지 않고 네트워크를 통해 전송됩니다. 응용 프로그램 프로토콜은 기본적으로 명령을 실행할 준비가 되었음을 알려주는 친구입니다.
nc는 UDP 패킷과 UNIX 도메인 소켓도 처리할 수 있습니다. 듣는 것도 재미있습니다.
nc -l 12345
GET / HTTP/1.1
이제 웹 브라우저에서 http://localhost:12345/로 이동하면 nc 세션에 브라우저 요청이 표시됩니다 . 이 시점에서 무언가를 입력하고 누르면 Ctrl-D
브라우저에 일반 텍스트로 표시됩니다(HTML을 표시하려면 올바른 HTTP 프로토콜 응답과 HTML 코드를 다시 보내야 합니다).
때때로 하나의 프로토콜(예: HTTP)을 기본적으로 사용하는 프로그램이 다른 프로토콜에 대해 다른 포트에 연결할 수 있습니다. 일반적으로 GUI 브라우저에서는 특정 포트에 대한 연결을 제한하기 때문에 더 이상 이 작업을 수행할 수 없습니다. 그러나 컬과 같은 프로그램을 사용하여 포트 25(메일 전송을 위한 SMTP)에 연결하면 프로토콜을 깨는 몇 가지 버그가 나타날 수 있습니다.
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
이는 컬이 일반적으로 HTTP 프로토콜을 사용하기 때문에 발생하므로 TCP 핸드셰이크를 설정한 후 다음과 같이 데이터 전송을 시작합니다.
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
그러나 SMTP 서버는 다음과 같은 SMTP를 기대합니다.
HELO myhomecomputername.local
이 시점에서 서버는 식별 라인을 다시 보냅니다.
250 yourispsmtpserverhost.com
따라서 컬이 SMTP 서버와 전송 계층 연결을 설정하는 것을 막을 수 있는 방법은 없으며 프로토콜을 사용할 수 없습니다. 그러나 telnet이나 더 나은 nc와 같은 프로그램을 사용하여 프로토콜을 직접 말할 수 있습니다.
답변2
telnet
모든 TCP 포트에 연결할 수 있는 도구입니다.
기본적으로 Telnet 포트(23)에 연결되지만 http 포트(80)나 smtp 포트(25) 또는 다른 포트에 연결하도록 지시할 수 있습니다.
그러나 원격 서버가 해당 포트에서 수신 대기 중인 프로토콜을 "알리는" 방법을 알아야 합니다.
예를 들어, 웹사이트 제목을 얻으려는 경우(유죄인을 보호하기 위해 도메인 이름 등 변경):
$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Connection closed by foreign host.
그 HEAD
줄은 내가 연결에 넣은 것입니다. http 프로토콜에서는 HEAD나 GET 또는 요청의 끝을 나타내기 위해 빈 줄을 보내야 한다는 점에 유의하세요. 이는 HEAD 요청 바로 다음에 나오는 빈 줄입니다.
답변3
두 프로토콜의 초기 협상에서는 텍스트 명령을 사용하므로 연결하고 명령 입력을 시작할 수 있습니다. 다른 사람들도 마찬가지야오래된SMTP, 텔넷 등과 같은 프로토콜은 오랫동안 문제 해결을 위해 사용되어 왔습니다.연결하다적절한 서비스로 이동합니다.
예를 들어
이러한 프로토콜은 통신하는 포트와 독립적입니다. 거의 모든 구현은 모든 포트에서 수신 대기하도록 구성할 수 있습니다.
HTTPS와 같은 일부 프로토콜은 협상에 텍스트 명령을 사용하지 않습니다. 그러나 (보통) 다음에 연결할 수 있습니다.포트서버는 듣기는 하지만 유용한 것은 없습니다.
답변4
당신의 이해 중 일부는 정확하고 일부는 그렇지 않습니다. 포트 80은 일반적으로 HTTP용으로 예약되어 있지만 이는 단지 관례일 뿐입니다. 모든 프로그램은 시스템의 열려 있는 모든 포트를 수신할 수 있습니다. 연결 중인 시스템에 포트 80에서 수신 대기 중인 웹 서버가 있는 경우 HTTP를 사용하여 통신해야 합니다.
telnet
전혀 프로토콜이 아니며, 모든 포트의 모든 호스트에 원시 텍스트를 보낼 수 있는 프로그램입니다. 원격 호스트는 어떤 프로그램이 연결되어 있는지 전혀 모릅니다. 볼 수 있는 것은 전송된 패킷뿐입니다. 원격 호스트가 예상하는 프로토콜을 준수하는 패킷을 보내는 모든 프로그램이 작동하므로 이를 사용하여 telnet
텍스트 기반 프로토콜을 통해 통신할 수 있습니다.
이와 같은 내용을 보냈는데 GET /path/to/a/file HTTP/1.1
이는 유효합니다.HTTP 1.1 명령웹 브라우저가 보내는 요청과 동일한 것으로 보이므로 정상적으로 작동합니다.