이것은 내 조직의 소프트웨어 엔지니어 중 한 사람이 제기 한 질문이었습니다. 가장 넓은 정의에 관심이 있습니다.
답변
요약
TCP 소켓은 특정 TCP 연결 또는 수신 상태와 관련하여 IP 주소와 포트로 정의 된 엔드 포인트 인스턴스 입니다.
포트는 서비스 엔드 포인트를 정의 하는 가상화 식별자입니다 (서비스 인스턴스 엔드 포인트 또는 세션 식별자).
TCP 소켓은 연결 이 아니며 특정 연결의 끝점입니다.
로컬 및 원격 엔드 포인트에 의해 연결이 식별 되므로 트래픽이 특정 서비스 인스턴스로 라우팅 될 수 있으므로 서비스 엔드 포인트에 대한 동시 연결이있을 수 있습니다 .
주어진 주소 / 포트 조합에 대해 하나의 리스너 소켓 만있을 수 있습니다 .
박람회
이것은 흥미로운 질문이었습니다. 내가 알고 있다고 생각한 많은 것들을 다시 검토해야했습니다. “소켓”과 같은 이름은 설명이 필요하다고 생각할 것입니다. 네트워크 케이블을 연결하는 엔드 포인트의 이미지를 불러 일으키기 위해 선택되었습니다. 그럼에도 불구하고, 네트워크 용어에서 “소켓”이라는 단어는 너무 많은 수하물을 운반하므로 신중한 재검사가 필요합니다.
가장 넓은 의미에서 포트는 진입 지점 또는 발신 지점입니다. 네트워킹 문맥에서 사용되지는 않지만, 프랑스어 단어 porte는 문자 그대로 문 또는 게이트웨이를 의미 하며, 데이터 또는 대형 강철 컨테이너를 선적하든 포트가 운송 종점이라는 사실을 더욱 강조합니다.
이 논의의 목적을 위해 TCP-IP 네트워크의 컨텍스트로 고려를 제한 할 것입니다. OSI 모델은 모두 훌륭하지만 완전히 구현 된 적이 없으며 트래픽이 많은 스트레스가 많은 환경에서 훨씬 덜 널리 배포됩니다.
IP 주소와 포트의 조합은 엔드 포인트라고하며 소켓이라고도합니다. 이 사용법은 원래 TCP 사양 인 RFC793에서 시작됩니다.
TCP 연결 은 소켓 이라고하는 두 개의 엔드 포인트에 의해 정의됩니다 .
엔드 포인트 (소켓)는 네트워크 주소와 포트 식별자 의 조합으로 정의됩니다 . 주소 / 포트가 소켓을 완전히 식별 하지는 않습니다 (나중에 자세히 설명).
포트의 목적은 주어진 네트워크 주소에서 여러 엔드 포인트를 구별하는 것입니다. 포트가 가상화 된 엔드 포인트라고 말할 수 있습니다. 이 가상화는 단일 네트워크 인터페이스에서 여러 동시 연결을 가능하게합니다.
인터넷에서 각 TCP 연결을 고유하게 식별하는 두 개의 엔드 포인트를 지정하는 소켓 쌍 (클라이언트 IP 주소, 클라이언트 포트 번호, 서버 IP 주소 및 서버 포트 번호로 구성된 4 개의 튜플)입니다. ( TCP-IP Illustrated Volume 1 , W. Richard Stevens)
대부분의 C 파생 언어에서 TCP 연결은 Socket 클래스의 인스턴스에서 메소드를 사용하여 설정되고 조작됩니다. 일반적으로 NetworkStream 클래스의 인스턴스 인 높은 수준의 추상화에서 작동하는 것이 일반적이지만 일반적으로 소켓 객체에 대한 참조를 노출합니다. 코더에게이 소켓 객체는 소켓 객체의 메소드를 사용하여 연결이 생성되고 조작되기 때문에 연결을 나타내는 것으로 보입니다.
C #에서 (기존 리스너에 대한) TCP 연결을 설정하려면 먼저 TcpClient 를 작성하십시오 . TcpClient 생성자에 엔드 포인트를 지정하지 않으면 기본값이 사용됩니다. 한 가지 방법으로 로컬 엔드 포인트가 정의됩니다. 그런 다음
생성 한 인스턴스 에서 Connect 메서드 를 호출합니다 . 이 방법에는 다른 엔드 포인트를 설명하는 매개 변수가 필요합니다.
이 모든 것이 약간 혼란스럽고 소켓이 연결이며 믿을 수 없다고 믿게 만듭니다. Richard Dorman이 질문을 할 때까지이 오해를 받고 노력하고있었습니다.
많은 독서와 생각을 한 후에는 LocalEndpoint 와 RemoteEndpoint의 두 인수를 취하는 생성자와 TcpConnection 클래스를 갖는 것이 더 합리적이라고 확신합니다 . 로컬 엔드 포인트에 기본값을 사용할 수있는 경우 단일 인수 RemoteEndpoint를 지원할 수 있습니다. 멀티 홈 컴퓨터에서는이 기능이 모호하지만 원격 엔드 포인트에 대한 경로가 가장 짧은 인터페이스를 선택하여 라우팅 테이블을 사용하여 모호성을 해결할 수 있습니다.
다른 측면에서도 선명도가 향상됩니다. 소켓은 IP 주소와 포트의 조합으로 식별 되지 않습니다 :
[…] TCP는 로컬 및 외부 주소를 구성하는 네 가지 값 (대상 IP 주소, 대상 포트 번호, 소스 IP 주소 및 소스 포트 번호)을 모두 사용하여 수신 세그먼트를 역 다중화합니다. TCP는 대상 포트만보고 들어오는 세그먼트를 가져 오는 프로세스를 확인할 수 없습니다. 또한, 들어오는 연결 요청을 수신 할 [주어진 포트 번호]의 [다양한] 엔드 포인트 중 하나만이 수신 상태입니다. (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)
보시다시피 네트워크 서비스가 주소 / 포트가 동일한 여러 소켓을 가질 수 있지만 특정 주소 / 포트 조합에 하나의 리스너 소켓 만있을 가능성이 높습니다. 일반적인 라이브러리 구현은 소켓 클래스를 나타내며 인스턴스는 연결을 만들고 관리하는 데 사용됩니다. 혼란을 야기하고 두 개념의 광범위한 혼란을 초래하기 때문에 이것은 매우 불행한 일입니다.
Hagrawal은 저를 믿지 않습니다 (댓글 참조). 웹 브라우저를 http://dilbert.com에 연결 한 다음 실행했습니다 netstat -an -p tcp
. 출력의 마지막 6 줄에는 주소와 포트가 소켓을 고유하게 식별하기에 충분하지 않다는 두 가지 예가 포함되어 있습니다. 192.168.1.3 (내 워크 스테이션)과 54.252.94.236:80 (원격 HTTP 서버) 사이에는 두 가지 연결이 있습니다.
TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
소켓은 연결의 끝점이므로 주소 / 포트 조합이있는 소켓이 두 개 있고 주소 / 포트 조합이있는 소켓이 두 207.38.110.62:80
개 더 54.252.94.236:80
있습니다.
Hagrawal의 오해는 “식별하다”라는 단어를 매우 신중하게 사용함으로써 발생한다고 생각합니다. 나는 “완전하고 명확하고 독특하게 식별한다”는 것을 의미한다. 위의 샘플에는 주소 / 포트 조합이있는 두 개의 엔드 포인트가 54.252.94.236:80
있습니다. 주소와 포트만 있으면이 소켓을 구별 할 정보가 충분하지 않습니다. 소켓 을 식별하기에 충분한 정보가 없습니다 .
추가
RFC793 섹션 2.7의 단락 2에 따르면
연결은 끝에있는 소켓 쌍으로 완전히 지정됩니다. 로컬 소켓은 다른 외부 소켓에 대한 많은 연결에 참여할 수 있습니다.
이 소켓 정의 는 특정 연결의 끝점 인 소켓 객체 와 동일하지 않으므로 프로그래밍 관점에서 도움이되지 않습니다 . 프로그래머에게는이 질문의 독자 대부분이 프로그래머이며 이는 중요한 기능적 차이입니다.
참고 문헌
답변
소켓은 세 가지로 구성됩니다.
- IP 주소
- 전송 프로토콜
- 포트 번호
포트는 장치의 논리적 게이트를 나타내는 1에서 65535 사이의 숫자입니다. 클라이언트와 서버 사이의 모든 연결에는 고유 한 소켓이 필요합니다.
예를 들면 다음과 같습니다.
- 1030은 포트입니다.
- (10.1.1.2, TCP, 포트 1030)은 소켓입니다.
답변
소켓 은 두 네트워크 응용 프로그램 간의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 서로 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터의 프로세스 간 통신에도 사용될 수 있습니다. 응용 프로그램은 서로 통신하기 위해 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 어느 쪽이든 데이터를주고받을 수 있습니다. 따라서 이론적으로 2 개 이상의 OSI 모델 레벨에서 소켓을 작성할 수 있습니다. 프로그래머는 종종 간접적이지만 네트워크 프로그래밍에 소켓을 사용합니다. Winsock과 같은 프로그래밍 라이브러리는 소켓 프로그래밍의 많은 하위 수준 세부 정보를 숨 깁니다. 소켓은 1980 년대 초부터 널리 사용되었습니다.
포트 는 네트워크 통신을위한 엔드 포인트 또는 “채널”을 나타냅니다. 포트 번호를 사용하면 동일한 컴퓨터의 여러 응용 프로그램이 서로 간섭하지 않고 네트워크 리소스를 활용할 수 있습니다. 포트 번호는 네트워크 프로그래밍, 특히 소켓 프로그래밍에서 가장 일반적으로 나타납니다. 그러나 때로는 포트 번호가 일반 사용자에게 표시됩니다. 예를 들어, 인터넷에서 방문하는 일부 웹 사이트는 다음과 같은 URL을 사용합니다.
http://www.mairie-metz.fr:8080/ 이 예에서 숫자 8080은 웹 서버가 웹 서버에 연결하는 데 사용하는 포트 번호를 나타냅니다. 일반적으로 웹 사이트는 포트 번호 80을 사용하며이 번호는 URL에 포함시킬 필요는 없습니다.
IP 네트워킹에서 포트 번호는 이론적으로 0에서 65535 사이입니다. 가장 많이 사용되는 네트워크 응용 프로그램은 범위의 가장 낮은 포트 번호 (예 : HTTP의 경우 80)를 사용합니다.
참고 : 포트라는 용어는 네트워크 기술의 다른 여러 측면을 나타냅니다. 포트는 직렬, 병렬 및 USB 포트와 같은 주변 장치의 물리적 연결 지점을 나타낼 수 있습니다. 포트라는 용어는 허브, 스위치 또는 라우터와 같은 특정 이더넷 연결 지점을 나타냅니다.
심판 http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
심판 http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm
답변
약간의 비유로
소켓에 대해 많은 기술적 인 것들이 이미 제공되었지만 … 누군가가 여전히 IP, 포트 및 소켓의 차이점을 느낄 수없는 경우 를 대비하여 답변을 추가하고 싶습니다.
서버 S를 고려 ,
그리고 말 , Y는 Z는 사람 X를 서비스는에서 (채팅 서비스를 말한다) 필요가 서버 S
그때
IP 주소를 알려줍니다 > – 누구? X, Y, Z가 연락하고 싶은 채팅 서버 ‘S’
좋아, “서버는 누구인가”
그러나 서버 ‘S’가 다른 사람들에게 다른 서비스를 제공하고 있다고 가정하면 ‘S’는 개인 A, B, C에게 스토리지 서비스를 제공합니다.
그때
포트는 —> 어느 것을 알려줍니다 ? 서비스 당신 (X, Y, Z), 즉 스토리지 서비스가 아닌 채팅 서비스가 필요합니다
좋아 .., 당신은 ‘채팅 서비스’가 당신이 원하는 것이지 스토리지가 아니라는 것을 서버가 알게한다
그러나
당신은 세이고 서버는 세 가지를 모두 다르게 식별하고 싶을 수도 있습니다
소켓 이 온다
이제 소켓은 -> 어느 것을 알려줍니다 ? 특정 연결
즉,
사람 X를위한 소켓 1
사람 Y를위한 소켓 2
사람 Z를위한 소켓 3
나는 그것이 여전히 혼란 스러웠던 누군가를 돕기를 바랍니다 🙂
답변
먼저, A에서 B로 패킷을 가져 오는 것이 무엇인지 이해하는 것부터 시작해야한다고 생각합니다.
네트워크에 대한 일반적인 정의는 목적에 따라 네트워크를 여러 계층으로 분리하는 OSI 모델 을 사용 하는 것입니다. 여기서 다루는 몇 가지 중요한 사항이 있습니다.
- 데이터 링크 층 . 이 계층은 한 네트워크 장치에서 다른 네트워크 장치로 데이터 패킷을 가져 오는 역할을하며 실제로 전송하는 계층 바로 위에 있습니다. MAC 주소에 대해 이야기하고 MAC (하드웨어) 주소를 기반으로 호스트를 찾는 방법을 알고 있습니다.
- 네트워크 계층은 당신이 기계와 같은 물리적 장치 등을 통해 물리적 경계에 걸쳐 데이터를 전송 할 수있는 계층입니다. 네트워크 계층은 본질적으로 물리적 주소와 관련이있는 추가 주소 기반 메커니즘을 지원해야합니다. 인터넷 프로토콜 (IPv4)을 입력하십시오. IP 주소는 인터넷을 통해 A에서 B로 패킷을 가져올 수 있지만 개별 홉을 통과하는 방법에 대해서는 아무것도 모릅니다. 이것은 라우팅 정보에 따라 위의 계층에 의해 처리됩니다.
- 수송층 . 이 계층은 정보가 A에서 B로 전달되는 방식과 해당 동작에 대한 제한, 확인 또는 오류를 정의합니다. 예를 들어, TCP는 패킷에 손실 된 정보를 추론 할 수 있도록 추가 정보를 패킷에 추가합니다.
TCP는 무엇보다도 포트 개념을 포함 합니다. 이들은 인터넷 소켓 ( AF_INET
)이 바인딩 할 수 있는 동일한 IP 주소에서 사실상 다른 데이터 끝점입니다 .
이와 같이 UDP 및 기타 전송 계층 프로토콜 도 마찬가지 입니다. 그들은 기술적으로하지 않습니다 필요 기능 포트, 외부와 연결을 수신하기 위해 같은 컴퓨터를 사용 (실제로 만들기)에 이상이 포트는 레이어에 여러 응용 프로그램에 대한 방법을 제공 않습니다.
이것은 TCP 또는 UDP 연결의 구조를 제공합니다. 각각에는 소스 포트 및 주소와 대상 포트 및 주소가 있습니다. 이것은 주어진 세션에서 대상 응용 프로그램이 소스로부터 응답 할뿐만 아니라 수신 할 수 있도록합니다.
따라서 포트는 본질적으로 동일한 주소를 공유하는 여러 개의 동시 연결을 허용하는 사양 지정 방식입니다.
이제 우리는 응용 프로그램 관점에서 외부 세계와 어떻게 통신하는지 살펴볼 필요가 있습니다. 이를 위해서는 운영 체제에 친절하게 문의해야하며 대부분의 OS는 Berkeley Sockets 방식의 작업을 지원하므로 다음과 같은 응용 프로그램에서 포트와 관련된 소켓을 만들 수 있습니다.
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
큰! 따라서 sockaddr
구조에서 포트와 bam을 지정합니다! 작업 완료! 글쎄요, 거의 빼고 :
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
가능합니다. 어, 그 작품에 스패너가 던져졌습니다!
좋아, 실제로 그렇지 않았습니다. 우리가해야 할 일은 적절한 정의를 제시하는 것입니다.
- 인터넷 소켓은 서비스가 데이터를 제공 할 수있는 IP 주소, 프로토콜 및 관련 포트 번호의 조합입니다. 따라서 TCP 포트 80, stackoverflow.com은 인터넷 소켓입니다.
- 유닉스 소켓은 파일 시스템에 표현 된 IPC 엔드 포인트입니다 (예 🙂
/var/run/database.sock
. - 소켓 API는 애플리케이션이 소켓에서 데이터를 읽고 쓸 수 있도록 요청하는 방법입니다.
짜잔! 정리해 우리 계획에서
- 포트는 전송 계층 프로토콜의 일부로 지정된 요청에 응답해야하는 서비스 번호를 식별하는 숫자 식별자입니다.
따라서 실제로 포트는 인터넷 소켓을 형성하기위한 요구 사항의 일부입니다. 불행히도 소켓이라는 단어의 의미가 여러 가지 아이디어에 적용되었습니다. 그래서 나는 혼란에 추가하기 위해 다음 프로젝트 소켓의 이름을 진심으로 권고합니다.)
답변
소켓 = IP 주소 + 포트 (숫자 주소)이
둘은 머신에서 네트워크 연결의 엔드 포인트를 식별합니다. (방금 네트워크 101을 연결 했습니까?)
답변
일반적으로 이론적으로는 많지만이 두 개념을 구별하는 가장 쉬운 방법 중 하나는 다음과 같습니다.
서비스를 받으려면 서비스 번호가 필요합니다. 이 서비스 번호를 포트라고합니다. 그렇게 간단합니다.
예를 들어, 서비스로서의 HTTP는 포트 80에서 실행 중입니다.
이제 많은 사람들이 서비스를 요청할 수 있으며 클라이언트 서버와의 연결이 설정되었습니다. 많은 연결이있을 것입니다. 각 연결은 클라이언트를 나타냅니다. 각 연결을 유지하기 위해 서버는 연결 당 소켓을 만들어 클라이언트를 유지 관리합니다.