나는 오랫동안 몇 가지 혼란스러운 문제에 시달렸습니다.
- Linux에서 제공하는 인터넷 도메인 소켓,
- 전송 프로토콜(TCP/UDP) 소켓 및
- 전송 프로토콜(TCP/UDP)의 포트입니다.
SO의 일부 관련 게시물에 대한 응답에는 모호함과 불일치가 많아 더욱 혼란스럽습니다.
Linux와 전송 프로토콜(TCP/UDP) 모두 "소켓"이라는 개념을 가지고 있습니다. 이 두 개념은 어떻게 다른가요? 예Linux에서 제공하는 인터넷 도메인 소켓(파일로 표시?)(신실하게) 시행하다전송 프로토콜의 소켓(TCP/UDP)? (그렇다고 생각합니다. 그것이 사실이라면 두 용어를 서로 바꿔서 사용할 수 있습니다.)
개념적으로 이 생각이 맞나요?항구전송 프로토콜(TCP/UDP)에서 튜플(IP 주소, 전송 프로토콜, 포트 번호) 또는 포트 번호만 사용합니까? (나는 포트가 튜플(IP 주소, 전송 프로토콜, 포트 번호)이라고 생각합니다. 왜냐하면 나는 다른 IP 주소나 다른 전송 프로토콜을 가진 동일한 포트 번호가 다른 포트를 나타낸다고 여러 번 배웠기 때문입니다. 그런 의미에서, 포트그리고 소켓(전송 프로토콜에서)같은 개념인 것 같습니다. ) 설정된 이름 "포트"는 단순히 "포트 번호"를 의미하는 것 같습니다. 불필요한 혼란을 피하기 위해 아래에서 "포트 번호"를 명시적으로 사용하겠습니다.
사이의 관계는 무엇입니까?소켓(전송 프로토콜에서)그리고튜플(IP 주소, 전송 프로토콜, 포트 번호)? 소켓 집합과 튜플 집합(IP 주소, 전송 프로토콜, 포트 번호) 사이에 전단사 매핑이 있습니까? 튜플(IP 주소, 전송, 포트 번호)당 하나 이상의 소켓이 있어야 하고, 소켓당 하나 이상의 튜플(IP 주소, 전송, 포트 번호)이 있어야 합니까? 두 개의 소켓이 동일한 튜플(IP 주소, 전송 프로토콜, 포트 번호)을 공유할 수 있습니까? 두 개의 튜플(IP 주소, 전송 프로토콜, 포트 번호)이 동일한 소켓을 공유할 수 있습니까?
나는 들었다두 프로세스가 동일한 소켓을 공유할 수 있음(제가 이해한 바는 Linux 인터넷 도메인 소켓과 전송 프로토콜(TCP/UDP) 소켓을 서로 바꿔서 사용할 수 있다는 가정 하에 두 프로세스가 파일을 공유할 수 있다는 것입니다.) 2개도 가능프로세스같은 것을 공유하다튜플(IP 주소, 전송 프로토콜, 포트 번호)?
나는 들었다두 연결이 동일한 소켓을 공유할 수 없습니다.(Linux 인터넷 도메인 소켓과 전송 프로토콜(TCP/UDP) 소켓을 서로 바꿔서 사용할 수 있다고 가정합니다.) 2개도 가능연결하다같은 것을 공유하다튜플(IP 주소, 전송 프로토콜, 포트 번호)?
감사해요.
답변1
- 소켓은 운영 체제의 API입니다. 이 API를 사용하면 동일하거나 다른 시스템의 애플리케이션이 TCP 및 UDP(다른 프로토콜 중에서) 프로토콜을 통해 통신할 수 있습니다. UNIX 도메인 소켓(인터넷사용자가 작성하는 도메인 소켓)은 동일한 시스템의 애플리케이션과 통신하기 위한 유사한 기능을 제공합니다. 개념은 유사합니다. API는 소켓 생성, 바인딩, 수신 + 승인 및 연결, 소켓 읽기 및 쓰기, 소켓 닫기를 위한 메서드를 제공합니다. 읽기 및 쓰기에 관해서는 일반 파일, 명명된 파이프, 익명 파이프 등과 관련된 다른 파일 설명자와 일치하지만 파일 설명자는 다르게 생성되고 더 많은 작업이 수행됩니다.
- TCP 및 UDP의 포트 번호는 1에서 65535 사이의 정수입니다. "포트"라는 단어는 "포트 번호"의 약어입니다. IP 주소, 포트 번호 및 프로토콜의 튜플은 끝점 주소를 설명합니다. 이를 "포트"라고 부르면 다른 문헌을 읽을 때 혼동을 일으킬 수 있습니다.
- 연결되지 않았지만 바인딩된 소켓은 단일 끝점(ip, 포트, 프로토콜)만 나타냅니다. 연결된 소켓은 로컬 끝점과 또 다른(로컬 또는 원격) 끝점인 연결을 나타냅니다. 동일한 연결에 대해 여러 개의 커널 소켓을 가질 수는 없지만 동일한 커널 소켓에 대해 여러 개의 파일 설명자를 가질 수 있습니다. 연결된 여러 소켓에서 동일한 끝점을 가질 수 있지만 동일한 연결 내에서는 가질 수 없습니다. 즉, 연결의 다른 끝점은 달라야 합니다. 실제로 동일한 끝점을 나타내는 연결되지 않은 여러 소켓이 있을 수 있지만 이는 매우 드문 경우입니다.
- 소켓은 파일 설명자이고 파일 설명자를 공유할 수 있으므로 프로세스 간에 소켓을 공유할 수 있습니다. 공유는 일반적으로 부모가 일부 파일이나 소켓을 열고 자식이 이를 상속하는 분기를 통해 수행됩니다. 그러나 한 프로세스에서 다른 프로세스로 파일 설명자/소켓을 보내는 방법도 있습니다. 공유는 쓰기와 읽기가 모두 가능하지만 데이터가 복제되지 않음을 의미합니다. 즉, 부모가 일부 데이터를 읽으면 소켓에서 해당 데이터를 가져오고 자식도 읽을 수 없게 됩니다. 그러나 프로세스가 동일한 시스템의 기존 소켓과 정확히 동일한 연결을 나타내는 새 소켓을 생성하는 것은 불가능합니다(기존 소켓을 공유하지 않고).
- 두 개의 소켓/연결은 한 끝점에서 동일한 포트를 공유할 수 있지만 두 끝점이 모두 공유할 수는 없습니다. 즉, 소스 IP, 소스 포트, 대상 IP, 대상 포트 또는 프로토콜 중 하나 이상이 달라야 합니다.
답변2
"포트"는 집과 같으며 도시, 거리 이름, 집 번호로 식별되며 "포트 번호"는 집의 집 번호와 같습니다. 제 글의 의미를 이해하는 데 도움이 되길 바랍니다.
이해합니다. 동의합니다. 생각해 보면 유용한 개념입니다.
"포트 번호" 개념은 기존 시스템의 정확한 기술 세부 사항에 대해 이야기해야 할 때 정의하기가 더 쉽습니다. TCP 패킷의 포트 필드 값을 참조하거나 UNIX 소켓 API에서 사용되는 필드를 참조할 수 있습니다 sin_port
. struct sockaddr_in
이러한 유형의 토론에서 우리는 독자에게 TCP 패킷이 사용되는 방법에 대한 전체 내용을 참조할 수 있습니다(아마도 원본 RFC :-). 또는 프로그램에서 소켓 API 함수를 사용하는 방법은 man
페이지를 보면 이해할 수 있습니다.
이 개념이 단순화되는 것은 당연하다. "포트 번호 80" 대신 "포트 80"이라고 자연스럽게 말할 수 있습니다.
이것원래 TCP 표준, RFC 793에서는 "포트"와 "포트 번호"의 개념을 서로 다른 것으로 설명합니다. ("포트 식별자"는 소개 부분에서 "포트 번호"와 동일한 의미로 사용되기도 합니다).
man
예를 들어 Linux의 현재 페이지에서는 이러한 구분을 그렇게 신중하게 수행하지 않습니다.man 7 ip
"포트"는 "포트 번호"의 약어로 자주 사용됩니다.
리눅스 man
페이지는 프로그래머들이 참고하는 매우 중요한 문서이기 때문에 "포트"라는 용어가 모호해진다. 오해받을까봐 걱정된다면 '포트번호' + IP 주소로 이야기하는 것이 아주 좋습니다.
5. 두 개의 연결이 동일한 소켓을 공유할 수 없다고 들었습니다(Linux의 인터넷 도메인 소켓과 전송 프로토콜(TCP/UDP) 소켓을 서로 바꿔서 사용할 수 있다고 가정). 두 연결이 동일한 튜플(IP 주소, 전송 프로토콜, 포트 번호)을 공유할 수 있습니까?
단일 수신 포트는 여러 다른 소스 포트로부터 연결을 수신할 수 있습니다.
Linux TCP 프로그래밍에서 리스너는 이러한 각 연결에 대해 소켓을 획득합니다(그리고 연결되지 않은 소켓을 수신합니다).
소켓 API는 동일한 소스 포트를 사용하여 여러 개의 나가는 연결을 설정하는 것과 같은 반대 방법을 제공하지 않습니다. 전송 프로토콜 표준이 기술적으로 이를 허용할지는 모르겠습니다.
당신이할 수 있다이렇게 하면 동일한 대상 포트에 여러 연결을 설정할 수 없습니다. 대상 시스템은 두 연결을 구별할 수 없습니다. 나는 그들이 이 특별한 제한이 처리하기에는 너무 이상하다고 생각한 것 같습니다. 그런 다음 UNIX 소켓을 포함하여 원래 API에 더 광범위한 제한이 적용되었습니다. 나중에 누군가 이것을 시도하면 실제로 테스트된 적이 없는 곳에서 극단적인 경우를 발견할 위험이 있습니다. :-).
UDP 전송 프로토콜에는 연결 개념이 없으므로 이 질문은 적용되지 않습니다. 원하는 경우 UDP 소켓을 호출할 수 있지만 connect()
이는 단지 편의를 위한 것입니다.
현대 문서에서 "소켓"이라고 쓰면 사람들은 이를 UNIX 소켓 API의 소켓 개념을 가리키는 것으로 해석할 것입니다. "소켓"은 RFC 793에서 다르게 정의됩니다. 다음 정의는아니요더 이상 사용되지 않습니다.
단일 호스트 내의 여러 프로세스가 동시에 TCP 통신 기능을 사용할 수 있도록 TCP는 각 호스트 내에 일련의 주소 또는 포트를 제공합니다. 인터넷 통신 계층의 네트워크 및 호스트 주소와 연결되어 하나의소켓. 소켓 쌍은 각 연결을 고유하게 식별합니다. 즉, 소켓은 동시에 여러 연결에 사용될 수 있습니다.