"포트"는 통신 끝점입니까(전송 계층에서)?
"포트 번호"는 포트에 할당된 주소입니까?
네트워크 인터페이스에 할당된 IP 주소를 변경할 수 있는 것처럼 포트가 주어지면 할당된 포트 번호를 변경할 수 있습니까?
~에서https://en.wikipedia.org/wiki/Network_socket
TCP 포트 53과 UDP 포트 53 소켓은 다른 소켓입니다.
무슨 뜻이에요? 구체적으로,
두 개의 전송 프로토콜(예: TCP 및 UDP)에서 동시에 포트를 사용할 수 있습니까? (내가 이해한 바는 포트가 전송 프로토콜의 일부이며 다른 시간에도 다른 프로토콜에 속할 수 없다는 것입니다.)
참조는 포트 번호 53이 TCP의 포트와 UDP의 포트에 서로 다른 시간(동시에 할당될 수는 없음)에 할당될 수 있음을 의미합니까?
답변1
TCP와 UDP는 IP 위에 있는 두 가지 다른 프로토콜입니다. TCP 포트 번호는 TCP 프로토콜의 일부이고 UDP 포트 번호는 UDP 프로토콜의 일부입니다. 그렇습니다. TCP와 UDP는 서로 다른 프로토콜 번호를 가진 두 개의 서로 다른 프로토콜이므로 둘 다 동시에 사용할 수 있습니다(참고자료 참조 /etc/protocols
).
UDP는 더 빠르고 일상적인 요청에 대한 오버헤드가 적기 때문에 DNS 서버는 UDP/53과 TCP/53을 모두 수신할 수 있으며 UDP 패킷 크기 제한으로 인해 특히 대규모 DNS 요청에는 TCP가 필요할 수 있습니다. 오래 전에 시작되었습니다. 예를 들어, 다음은 named
두 가지를 모두 듣고 있습니다.
$ sudo lsof -i -nP | fgrep \*:53
named 1267 named 20u IPv6 9691 0t0 TCP *:53 (LISTEN)
named 1267 named 512u IPv6 9690 0t0 UDP *:53
$
이는 named
위에 나열된 두 개의 서로 다른 포트를 통해 수백 또는 수천 개의 UDP 및 TCP 클라이언트 요청을 동시에 처리할 수 있습니다.
TCP와 UDP는 전송 계층의 두 가지 서로 다른 구현이며 각 TCP 또는 UDP 패킷의 소스 및 대상 포트를 지정하는 두 개의 16비트 필드를 가지고 있습니다. 이름 매핑에 대한 포트 번호는 파일을 조정하여 수정할 수 있습니다 /etc/services
(아마도 매우 나쁜 생각일 수 있음). 또는 클라이언트 시스템이 모두 제대로 작동하도록 재구성되었다는 가정 하에 서버가 기본이 아닌 일부 포트 번호를 수신하도록 지시할 수 있습니다. 기본이 아닌 포트 번호(예: sshd -p 1234
a) 에 연결한 server
다음 ssh -p 1234 server
일반적인 포트 대신 기본이 아닌 TCP 포트 1234에 연결합니다 tcp/22
. 또는 DNS 서버가 UDP 포트 8475에서 실행되도록 설정할 수 있지만 dig -p 8475 @server ...
운영 체제는 일반적으로 UDP/53 또는 TCP/에서만 작동하므로 해당 사용자 정의 UDP 포트를 쿼리하는 등의 사용자 정의 클라이언트 프로그램이 필요합니다. 모든 이름 서버 IP에 대해 53입니다.
답변2
컴퓨터에는 하나 이상의 IP 주소가 있을 수 있습니다.
ICMP와 같은 일부 IP 프로토콜은 통신을 위해 IP 주소만 필요합니다. UDP 및 TCP와 같은 다른 프로토콜에서는 포트 및 IP 주소로 패킷을 보내야 합니다. 일반적으로 서비스 리스너를 구현하는 프로그램이 있습니다.유명한 항구다른 시스템이 연락하는 방법을 알 수 있도록 합니다. ssh
예를 들어, 서버는 포트 22/tcp에서 수신 대기합니다.
$ netstat -a -t
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:ssh *:* LISTEN
$ netstat -a -t -n
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
프로그램 netstat
은 포트 번호를 검색하여 기호 이름을 제공 /etc/services
하고 다음과 같은 프로그램이 sshd
호출합니다.getservbyname("ssh","tcp")이름을 포트 번호로 변환합니다.
IP 주소를 수신한다는 것은 0.0.0.0
시스템의 모든 IP 주소를 수신한다는 의미이며 이것이 netstat에서 인쇄하는 내용입니다 *
.
서버 ssh
에는 없습니다가지다포트 22에서 수신 대기합니다. 포트 8022에서 수신 대기하도록 구성 파일을 변경할 수 있습니다. 원격 사용자가 포트 번호를 알고 있고 개입하는 방화벽이 포트 8022에 대한 트래픽을 허용하는 한 작동합니다.
전 세계 수백 가지 서비스에 대해 잘 알려진 포트 번호가 다음 위치에 유지됩니다.서비스 이름 및 전송 프로토콜 포트 번호 레지스트리. 이는 로컬 시스템의 상위 집합입니다 /etc/services
.
소켓은 통신 끝점입니다. 사용하기 전에 먼저 해야 할 일경계IP 주소, 포트 번호 및 프로토콜. TCP를 사용하는 경우 다음과 같아야 합니다.연결됨패킷을 교환하기 전에 다른 소켓에 연결하십시오. 서버 호출은 socket
소켓을 생성하고 bind
바인딩한 후 listen
연결을 수신합니다. 클라이언트는 socket
및 를 사용한 bind
다음 connect
서버에 연결합니다. ( bind
클라이언트에 대한 호출은 선택 사항입니다. connect
호출되면 시스템은 사용되지 않는 포트를 할당하고 소켓에 바인딩할 적절한 IP 주소를 선택합니다.)
TCP 포트 53과 UDP 포트 53 소켓은 다른 소켓입니다.
TCP와 UDP 모두에서 서비스를 제공할 수 있는 경우 포트 번호는 일반적으로 두 프로토콜 모두에서 동일합니다. 위 시나리오에서는 하나는 수신 0.0.0.0:53/tcp
하고 다른 하나는 수신하는 두 개의 소켓을 생성하는 DNS 서버가 있을 수 있습니다 0.0.0.0:53/udp
.
일부 이전 서비스는 하나의 프로토콜에서만 실행되도록 설계되었습니다. 이 경우 동일한 포트 번호를 사용하는 두 개의 서비스가 표시될 수 있습니다(물론 다른 프로토콜). 예를 들어, 512/tcp는 rexec에 사용되고 512/udp는 biff에 사용됩니다. 이와 같은 시스템에는 포트에서 수신 대기하는 완전히 다른 프로그램이 있습니다. rexecd
512/tcp에서 수신하고 comsat
512/udp에서 수신합니다.