문제

이것은 내 조직의 소프트웨어 엔지니어 중 한 명이 제기 한 질문이었습니다. 나는 가장 광범위한 정의에 관심이 있습니다.

올바른 솔루션이 없습니다

다른 팁

요약

TCP 소켓은 엔드 포인트입니다 사례 특정 TCP 연결 또는 청취 상태와 관련하여 IP 주소와 포트로 정의됩니다.

포트는 가상화 식별자입니다 서비스 종료점 정의 (서비스와는 별개 사례 엔드 포인트 일명 세션 식별자).

TCP 소켓입니다 ~ 아니다 연결, 그것은 특정 연결의 끝점입니다.

서비스 엔드 포인트에 동시 연결이있을 수 있습니다, 연결이 식별되기 때문에 로컬 및 원격 모두 엔드 포인트, 트래픽을 특정 서비스 인스턴스로 라우팅 할 수 있습니다.

주어진 주소/포트 조합에 대해 하나의 리스너 소켓 만있을 수 있습니다..

박람회

이것은 내가 내부에서 알고 있다고 생각한 많은 것들을 재검토 해야하는 흥미로운 질문이었습니다. "소켓"과 같은 이름이 자명 할 것이라고 생각할 것입니다. 네트워크 케이블을 연결하는 엔드 포인트의 이미지를 불러 일으키는 것이 분명히 선택되었으며, 기능적 유사점이 강합니다. 그럼에도 불구하고, 네트워크 의회에서 "소켓"이라는 단어는 너무 많은 수하물을 가지고있어 신중한 재검토가 필요합니다.

가장 광범위한 의미에서, 항구는 입학 또는 방송의 지점입니다. 네트워킹 컨텍스트에서 사용되지는 않지만 프랑스어 단어 포르테 말 그대로 의미합니다 문 또는 게이트웨이, 또한 항구가 데이터를 배송하든 대형 강철 컨테이너에 관계없이 운송 엔드 포인트라는 사실을 강조합니다.

이 논의의 목적을 위해 TCP-IP 네트워크의 맥락에 대한 고려 사항을 제한 할 것입니다. OSI 모델은 모두 매우 좋지만 완전히 구현 된 적이 없으며 교통량이 많은 스트레스 조건에서 훨씬 덜 배치되었습니다.

IP 주소와 포트의 조합은 엄격하게 엔드 포인트로 알려져 있으며 때로는 소켓이라고합니다. 이 사용법은 원래 TCP 사양 인 RFC793에서 시작됩니다.

TCP 연결 두 개의 엔드 포인트로 정의됩니다 소켓.

엔드 포인트 (소켓)는 네트워크 주소와 A의 조합으로 정의됩니다. 포트 식별자. 주소/포트가 있습니다 ~ 아니다 소켓을 완전히 식별하십시오 (나중에 자세히 설명).

포트의 목적은 주어진 네트워크 주소에서 여러 엔드 포인트를 차별화하는 것입니다. 포트는 가상화 된 엔드 포인트라고 말할 수 있습니다. 이 가상화는 단일 네트워크 인터페이스에서 여러 동시 연결을 가능하게합니다.

인터넷에서 각 TCP 연결을 고유하게 식별하는 두 가지 엔드 포인트를 지정하는 소켓 쌍 (클라이언트 IP 주소, 클라이언트 포트 번호, 서버 IP 주소 및 서버 포트 번호로 구성된 4- 튜플)입니다. (TCP-IP 예시 된 볼륨 1, W. Richard Stevens)

대부분의 C- 유래 언어에서, TCP 연결은 소켓 클래스 인스턴스에서 메소드를 사용하여 설정 및 조작됩니다. 더 높은 수준의 추상화, 일반적으로 네트워크 스트림 클래스의 인스턴스에서 작동하는 것이 일반적이지만, 이는 일반적으로 소켓 객체에 대한 참조를 노출시킵니다. 코더 에이 소켓 객체는 소켓 객체의 메소드를 사용하여 연결이 생성되고 조작되기 때문에 연결을 나타내는 것으로 보입니다.

C#에서는 (기존 청취자에게) TCP 연결을 설정하려면 먼저 tcpclient. 끝점을 지정하지 않는 경우 tcpclient 생성자 기본값을 사용합니다 - 어떤 방식 으로든 로컬 엔드 포인트가 정의됩니다. 그런 다음 당신은 연결하다 당신이 만든 인스턴스에 대한 메소드. 이 방법에는 다른 엔드 포인트를 설명하는 매개 변수가 필요합니다.

이 모든 것이 약간 혼란스럽고 소켓이 연결이라고 믿게합니다. 나는 Richard Dorman이 그 질문을 할 때 까지이 오해에 대해 노력하고있었습니다.

많은 독서와 생각을했을 때, 나는 이제 수업을하는 것이 훨씬 더 의미가 있다고 확신합니다. tcpconnection 두 가지 인수를하는 생성자로 LocalEndpoint 그리고 RemoteNdpoint. 당신은 아마 단일 인수를지지 할 수 있습니다 RemoteNdpoint 로컬 엔드 포인트에 대해 기본값이 허용되는 경우 이는 멀티 하이머 컴퓨터에서 모호하지만 원격 엔드 포인트로 가장 짧은 경로로 인터페이스를 선택하여 라우팅 테이블을 사용하여 모호성을 해결할 수 있습니다.

명확성도 다른 측면에서도 향상 될 것입니다. 소켓입니다 ~ 아니다 IP 주소와 포트의 조합으로 식별 :

...] TCP Demultiplex는 대상 IP 주소, 대상 포트 번호, 소스 IP 주소 및 소스 포트 번호와 같은 로컬 및 외국 주소를 포함하는 네 가지 값을 모두 사용하는 들어오는 세그먼트를 사용합니다. TCP는 대상 포트 만 살펴보면 들어오는 세그먼트를 얻는 프로세스를 결정할 수 없습니다. 또한, 들어오는 연결 요청을받을 [주어진 포트 번호]의 [다양한] 엔드 포인트 중 하나는 청취 상태에있는 것입니다. (P255, TCP-IP 예시 된 볼륨 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 항은 말합니다

연결은 끝의 소켓 쌍에 의해 완전히 지정됩니다. 로컬 소켓은 다른 외국 소켓과 많은 연결에 참여할 수 있습니다.

소켓 의이 정의는 소켓과 동일하지 않기 때문에 프로그래밍 관점에서 도움이되지 않습니다. 물체, 이것은 특정 연결의 끝점입니다. 프로그래머 와이 질문의 대부분은 프로그래머입니다. 이것은 중요한 기능적 차이입니다.

참조

  1. TCP-IP 예시 볼륨 1 프로토콜, W. Richard Stevens, 1994 Addison Wesley

  2. RFC793, DARPA를위한 남부 캘리포니아 대학교 정보 과학 연구소

  3. RFC147, 소켓의 정의, Joel M. Winett, Lincoln Laboratory

소켓은 세 가지로 구성됩니다.

  1. IP 주소
  2. 전송 프로토콜
  3. 포트 번호

포트는 장치의 논리 게이트를 나타내는 1 내지 65535 사이의 숫자입니다. 클라이언트와 서버 간의 모든 연결에는 고유 한 소켓이 필요합니다.

예를 들어:

  • 1030은 항구입니다.
  • (10.1.1.2, TCP, 포트 1030)는 소켓입니다.

소켓 두 네트워크 응용 프로그램 사이의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터에서 문의하는 통신에도 사용될 수 있습니다. 응용 프로그램은 서로 통신하기위한 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 양쪽이 데이터를 전송 및 수신 할 수 있습니다. 따라서 소켓은 OSI 모델의 모든 레벨에서 2 위에서 이론적으로 만들 수 있습니다. 프로그래머는 종종 간접적이지만 네트워크 프로그래밍에 소켓을 사용합니다. Winsock과 같은 프로그래밍 라이브러리는 소켓 프로그래밍의 많은 저수준 세부 사항을 숨 깁니다. 소켓은 1980 년대 초부터 널리 사용되었습니다.

항구 네트워크 통신의 엔드 포인트 또는 "채널"을 나타냅니다. 포트 번호를 사용하면 동일한 컴퓨터의 다른 응용 프로그램이 서로 방해하지 않고 네트워크 리소스를 활용할 수 있습니다. 포트 번호는 가장 일반적으로 네트워크 프로그래밍, 특히 소켓 프로그래밍에 나타납니다. 그러나 때로는 포트 번호가 캐주얼 사용자가 볼 수 있습니다. 예를 들어, 인터넷에서 방문하는 일부 웹 사이트는 다음과 같은 URL을 사용합니다.

http://www.mairie-metz.fr:8080/ 이 예에서 숫자 8080은 웹 브라우저에서 웹 서버에 연결하는 포트 번호를 나타냅니다. 일반적으로 웹 사이트는 포트 번호 80을 사용 하며이 번호는 URL에 포함되지 않아도됩니다 (가능하지만).

IP 네트워킹에서 포트 번호는 이론적으로 0에서 65535입니다. 그러나 가장 인기있는 네트워크 응용 프로그램은 범위의 최저 엔드 (예 : HTTP의 경우 80)에서 포트 번호를 사용합니다.

참고 : PORT라는 용어는 네트워크 기술의 다른 여러 측면을 나타냅니다. 포트는 직렬, 병렬 및 USB 포트와 같은 주변 장치의 물리적 연결 지점을 참조 할 수 있습니다. 포트라는 용어는 또한 허브, 스위치 또는 라우터와 같은 특정 이더넷 연결 지점을 나타냅니다.

심판 http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

심판 http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

비유로

많은 기술적 인 것들이 이미 위에 주어졌지만 소켓... 대비 대신 대신 대답을 추가하고 싶습니다. 누군가가 여전히 IP, 포트 및 소켓의 차이를 느낄 수 없다면

서버를 고려하십시오,

그리고 말하십시오 사람 X, Y, Z 그것으로부터 서비스가 필요합니다 (채팅 서비스 : 채팅 서비스) 서버 s

그 다음에

IP 주소가 말합니다 --> 누구? 그 채팅 서버 's'x, y, z가 연락하고 싶어

좋아, 당신은 "누가 서버"를 얻었습니다.

그러나 서버의 '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에는 무엇보다도 개념이 포함됩니다. 포트. 인터넷 소켓과 동일한 IP 주소에서 효과적으로 다른 데이터 엔드 포인트입니다.AF_INET) 묶을 수 있습니다.

그것이 일어나기 때문에 UDP도 마찬가지입니다, 및 기타 전송 계층 프로토콜. 그들은 기술적으로는 그렇지 않습니다 필요 포트가 특징이지만이 포트는 위의 레이어의 여러 응용 프로그램을 제공하여 동일한 컴퓨터를 사용하여 나가는 연결을 수신 (실제로 만들어 낸) 방법을 제공합니다.

TCP 또는 UDP 연결의 해부학을 제공합니다. 각각에는 소스 포트 및 주소, 대상 포트 및 주소가 있습니다. 이는 특정 세션에서 대상 응용 프로그램이 소스로부터받을뿐만 아니라 응답 할 수 있도록합니다.

따라서 포트는 본질적으로 동일한 주소를 공유하는 여러 동시 연결을 허용하는 사양이 규정되어 있습니다.

이제 우리는 응용 프로그램 관점에서 외부 세계에 대한 의사 소통 방법을 살펴 봐야합니다. 이를 위해서는 운영 체제를 친절하게 요청해야하며 대부분의 OSE는 버클리 소켓을 지원하기 때문에 작업과 같은 응용 프로그램에서 포트와 관련된 소켓을 만들 수 있습니다.

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);

또한 가능합니다. Urgh, 그것은 작품에 스패너를 던졌습니다!

좋아, 실제로는 그렇지 않았다. 우리가해야 할 일은 몇 가지 적절한 정의를 제시하는 것입니다.

  • 인터넷 소켓은 IP 주소, 프로토콜 및 서비스가 데이터를 제공 할 수있는 관련 포트 번호의 조합입니다. 따라서 TCP Port 80, StackoverFlow.com은 인터넷 소켓입니다.
  • UNIX 소켓은 파일 시스템에 표시되는 IPC 엔드 포인트입니다. /var/run/database.sock.
  • 소켓 API는 애플리케이션이 소켓에 데이터를 읽고 쓸 수있는 애플리케이션을 요청하는 방법입니다.

짜잔! 그 일이 일어납니다. 그래서 우리의 계획에서

  • 포트는 전송 계층 프로토콜의 일부로 주어진 요청에 응답 해야하는 서비스 번호를 식별하는 숫자 식별자입니다.

따라서 실제로 포트는 인터넷 소켓을 형성하기위한 요구 사항의 하위 집합입니다. 불행히도, 단어 소켓의 의미가 여러 다른 아이디어에 적용되었습니다. 그래서 나는 당신에게 당신의 다음 프로젝트 소켓의 이름을 말하고, 그냥 혼란에 추가하기 위해;)

소켓 = IP 주소 + 포트 (숫자 주소)
그들은 함께 기계의 네트워크 연결에 대한 엔드 포인트를 식별합니다. (방금 네트워크 101을 flunk 했습니까?)

일반적으로 많은 이론적이지만이 두 개념을 구별하는 가장 쉬운 방법 중 하나는 다음과 같습니다.

서비스를 받으려면 서비스 번호가 필요합니다. 이 서비스 번호를 포트라고합니다. 그렇게 간단합니다.

예를 들어, 서비스로서의 HTTP는 포트 80에서 실행 중입니다.

이제 많은 사람들이 서비스를 요청할 수 있으며 클라이언트 서버의 연결이 설립되었습니다. 많은 연결이있을 것입니다. 각 연결은 클라이언트를 나타냅니다. 각 연결을 유지하기 위해 서버는 클라이언트를 유지하기 위해 연결 당 소켓을 생성합니다.

2 개의 PC 사이에 연결된 소켓을 동일시하는 많은 답변이있는 것 같습니다. 소켓은 항상 그렇습니다 엔드 포인트 1 PC에서는 연결되어 있거나 연결되지 않을 수도 있습니다. 분명히 우리는 어느 시점에서 리스너 또는 UDP 소켓*을 사용했습니다. 중요한 부분은 그것이 해결 가능하고 활동적이라는 것입니다. 해당 엔드 포인트에 대해 소켓이 정의되지 않으므로 1.1.1.1:1234로 메시지를 보내는 것은 작동하지 않습니다.

소켓은 프로토콜에 따라 다르기 때문에 두 가지 독창성 구현 TCP/IP 그리고 UDP/IP 사용* (iPaddress : port), 예를 들어, 다릅니다. IPX (네트워크, 노드 및 ... Ahem, 소켓 - 일반 "소켓"용어와 다른 소켓은 IPX 소켓 번호가 IP 포트와 동일합니다). 그러나 그들은 모두 독특한 주소가 가능한 엔드 포인트를 제공합니다.

IP가 주요 프로토콜이되었으므로, 네트워킹 용어로 포트 (네트워킹 용어)는 소켓 주소의 일부인 UDP 또는 TCP 포트 번호와 동시성이되었습니다.

  • UDP는 연결이없는 것입니다. 즉, 2 개의 엔드 포인트 사이에 가상 회로가 생성되지 않음을 의미합니다. 그러나 우리는 여전히 언급합니다 UDP 소켓 엔드 포인트로. API 기능은 둘 다 다른 유형의 소켓임을 분명히합니다. SOCK_DGRAM UDP (메시지를 보내는 것만)입니다 SOCK_STREAM IS TCP (가상 회로 생성).

  • 기술적으로 IP 헤더는 IP 주소를 보유하고 있으며 IP (UDP 또는 TCP) 위의 프로토콜은 포트 번호를 보유합니다. 이것은 다른 프로토콜을 가질 수있게한다 (예 : ICMP 포트 번호는 없지만 IP 주소 지정 정보가 있습니다).

짧은 간단한 대답.

포트 an으로 설명 할 수 있습니다 내부 주소 프로그램이나 프로세스를 식별하는 호스트 내에서.

소켓 a로 설명 할 수 있습니다 프로그래밍 인터페이스 프로그램이 다른 프로그램이나 프로세스, 인터넷 또는 로컬에서 통신 할 수 있도록합니다.

'포트'는 TCP/IP 네트워킹의 개념이며 '소켓'은 API (프로그래밍)입니다. '소켓'은 포트 및 호스트 이름 또는 네트워크 어댑터를 가져 와서 데이터를 보내거나받을 수있는 데이터 구조로 결합하여 (코드로) 작성됩니다.

우수한 투명한 답변을 읽은 후, 나는 다음과 같은 요점이 네트워크 프로그래밍의 새로운 이민자 인 나에게 강조가 필요하다는 것을 알았습니다.

TCP-IP 연결은 하나의 주소를 연결하는 양방향 경로입니다. 다른 주소와 포트 조합 : 포트 조합. 따라서 로컬 컴퓨터에서 원격 서버의 포트로 연결을 열 때 (예 : www.google.com:80), 서버에서 새 포트 번호를 연결하여 서버가 전송 할 수 있도록합니다. 당신에게 돌아온 것들, (예 : 127.0.0.1:65234). Netstat를 사용하여 기계의 연결을 보는 것이 도움이 될 수 있습니다.

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...

소켓 주소는 IP 주소 및 포트 번호입니다.

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

연결은 2 개의 소켓이 함께 묶여있을 때 발생합니다.

소켓은 프로세스에서 운영 체제로부터 네트워크 서비스를 요청하는 데 사용되는 특수 유형의 파일 핸들입니다. 소켓 주소는 트리플입니다. {프로토콜, 로컬 포기, 로컬 프로세스} 지역 프로세스가 포트 번호로 식별됩니다.

예를 들어 TCP/IP 제품군에서 :

{TCP, 193.44.234.3, 12345}

대화는 두 프로세스 간의 커뮤니케이션 링크로서 둘 사이의 연관성을 묘사합니다. 연결은 연결을 구성하는 두 프로세스를 완전히 지정하는 5- 튜플입니다.

예를 들어 TCP/IP 제품군에서 :

{TCP, 193.44.234.3, 1500, 193.44.234.5, 21}

유효한 협회가 될 수 있습니다.

반 연관은 다음 중 하나입니다. {프로토콜, 로컬 포기, 로컬 프로세스}}

또는

{프로토콜, 외국 주소, 외국 프로세스}

연결의 각 절반을 지정합니다.

반 연관은 소켓 또는 전송 주소라고도합니다. 즉, 소켓은 네트워크에서 이름을 지정하고 해결할 수있는 통신의 종말점입니다. 소켓 인터페이스는 통신 프로토콜에 대한 여러 응용 프로그램 프로그래밍 인터페이스 (API) 중 하나입니다. 일반적인 통신 프로그래밍 인터페이스로 설계된 4.2BSD UNIX 시스템에 의해 처음 소개되었습니다. 표준화되지는 않았지만 사실상 산업 표준이되었습니다.

포트가 가장 쉬운 부분이었고 소켓의 고유 식별자 일뿐입니다. 소켓은 프로세스가 연결을 설정하고 서로 통신하는 데 사용할 수있는 것입니다. Tall Jeff는 완벽하지 않은 훌륭한 전화 비유를 가지고 있었기 때문에 고치기로 결정했습니다.

  • IP 및 포트 ~ 전화 번호
  • 소켓 ~ 전화 장치
  • 연결 ~ 전화 통화
  • 연결 설정 ~ 숫자 호출
  • 프로세스, 원격 응용 프로그램 ~ 사람
  • 메시지 ~ 연설

소켓은 소프트웨어의 구조입니다. 파일이 더 많지 않습니다. 읽기 및 쓰기와 같은 작업이 있습니다. 그것은 육체적 인 것이 아닙니다. 소프트웨어가 물리적 인 것을 언급하는 방법입니다.

포트는 장치와 같은 것입니다. 각 호스트에는 하나 이상의 네트워크가 있습니다 (물리적); 호스트는 각 네트워크에 주소가 있습니다. 각 주소에는 수천 개의 포트가있을 수 있습니다.

하나의 소켓은 주소에서 포트를 사용하는 것일 수 있습니다. 소켓은 파일 시스템 I/O 용 장치를 할당하는 것처럼 포트에 대략 할당됩니다. 포트가 할당되면 다른 소켓은 해당 포트에 연결할 수 없습니다. 소켓이 닫히면 포트가 해제됩니다.

보세요 TCP/IP 용어.

응용 프로그램은 네트워크 (클라이언트-서버 쌍)를 통해 통신하는 한 쌍의 프로세스로 구성됩니다. 이러한 프로세스는 메시지를 보내고 수신합니다. 소켓. "Computer Networking : Top Down Approach"라는 책에 제시된 비유를 고려합니다. 다른 집과 의사 소통하고 싶은 집이 있습니다. 여기에서 집은 프로세스와 유사하고 소켓 문이 있습니다. 전송 프로세스는 도어 반대편에 데이터를 대상으로 전송할 인프라가 있다고 가정합니다. 메시지가 반대편에 도착하면 수신기의 문 (소켓)을 통해 집 (프로세스)으로 전달됩니다. 같은 책에서 나온이 그림은 다음을 도울 수 있습니다.
enter image description here
소켓은 전송 계층의 일부이며 응용 프로그램과의 논리적 통신을 제공합니다. 이는 응용 프로그램의 관점에서 수많은 라우터 및/또는 스위치가 있어도 두 호스트가 서로 직접 연결되어 있음을 의미합니다. 따라서 소켓은 연결 자체가 아니라 연결의 끝점입니다. 전송 계층 프로토콜은 중간 라우터가 아닌 호스트에서만 구현됩니다.
포트 기계에 내부 주소를 제공하는 수단을 제공합니다. 기본 목적은 여러 프로세스가 다른 프로세스 (데이터)를 방해하지 않고 네트워크를 통해 데이터를 보내고 수신 할 수 있도록합니다. 모든 소켓에는 포트 번호가 제공됩니다. 세그먼트가 호스트에 도착하면 전송 레이어는 세그먼트의 대상 포트 번호를 검사합니다. 그런 다음 세그먼트를 해당 소켓으로 전달합니다. 전송 계층 세그먼트에서 데이터를 올바른 소켓으로 전달하는이 작업은 탈식. 그런 다음 세그먼트의 데이터가 소켓에 연결된 프로세스로 전달됩니다.

~에서 Oracle Java 튜토리얼:

소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 하나의 엔드 포인트입니다. 소켓은 포트 번호로 바인딩되어 TCP 레이어가 데이터를 보내려는 응용 프로그램을 식별 할 수 있습니다.

포트 및 소켓은 은행 지점과 비교할 수 있습니다.

"은행"의 건물 번호는 IP 주소와 유사합니다. 은행에는 다음과 같은 다른 섹션이 있습니다.

  1. 저축 계좌 부서
  2. 개인 대출 부서
  3. 주택 융자 부서
  4. 고충부

따라서 1 (저축 계정 부서), 2 (개인 대출 부서), 3 (주택 융자 부서) 및 4 (고충 부서)는 항구입니다.

이제 저축 계좌로 가서 은행 (IP 주소)으로 가서 "저축 계좌 부서"(포트 번호 1)로 이동 한 다음 "저축 계정 부서에서 일하는 직원 중 한 명을 만나게하겠습니다. ". 계정을 오픈하기 위해 그를 SavingAccount_employee1이라고 부릅니다.

SavingAccount_employee1은 소켓 디스크립터이므로 SavingAccount_employeen에 SavingAccount_employee1이있을 수 있습니다. 이들은 모두 소켓 디스크립터입니다.

마찬가지로, 다른 부서들은 그 아래에서 일하는 직원을 가질 것이며 소켓과 유사합니다.

이것들은 기본 네트워킹 개념이므로 쉽게 이해할 수있는 포괄적 인 방법으로 설명하겠습니다.

  • 소켓 전화와 같습니다 (즉, 통신을위한 엔드 ~ 종료 장치)
  • IP 전화 번호와 같습니다 (예 : 소켓 주소)
  • 포트 대화하고 싶은 사람과 같습니다 (예 : 해당 주소에서 주문하려는 서비스)
  • 소켓은 클라이언트 또는 서버 소켓 일 수 있습니다 (즉, 회사의 고객 지원 전화는 서버이지만 집의 전화는 대부분 클라이언트입니다).

따라서 네트워킹의 소켓은 쌍 (IP, 포트) = (주소, 서비스)에 바인딩 된 가상 통신 장치입니다.

메모:

  • 기계, 컴퓨터, 호스트, 모바일 또는 PC에는 여러 주소, 여러 개의 열린 포트 및 여러 소켓이있을 수 있습니다. 사무실에서와 마찬가지로 여러 전화 번호가있는 여러 전화기와 여러 사람과 대화 할 수 있습니다.
  • 개방형/활성 포트의 존재는 포트에 액세스 할 수있게하는 소켓이기 때문에 소켓이 묶여 있어야합니다. 그러나 당분간 미사용 포트가있을 수 있습니다.
  • 또한 서버 소켓에서는 전화에서 많은 전화선 (전화 번호)을 전화로 전화 또는 하나의 특정 전화선이 전화선으로 남아 있지만 여전히 이러한 모든 전화선을 통해 또는 특정 전화선을 통해 사람에게 연락 할 수 있습니다.
  • 전화에서는 두 개의 포트와 소켓을 연관 (바인딩) 할 수 없습니다. 일반적으로 동시에 같은 전화를 사용하는 두 사람이 항상있을 수는 없습니다.
  • 고급 : 동일한 컴퓨터에서 동일한 유형 (클라이언트 또는 서버)과 동일한 포트 및 IP를 가진 두 개의 소켓을 가질 수 없습니다. 그러나 클라이언트 인 경우 각 클라이언트의 각 소켓의 로컬 포트가 다르기 때문에 두 개의 소켓을 사용하여 서버에 두 개의 연결을 열 수 있습니다)

당신이 의심을 없애기를 바랍니다

상대적인 TCP/IP 용어는 내가 생각하는 것이 질문에 의해 암시됩니다. 평신도의 용어로 :

항구는 특정 우편 번호의 특정 주택 전화 번호와 같습니다. 마을의 우편 번호는 도시의 IP 주소와 그 마을의 모든 집으로 생각할 수 있습니다.

반면에 소켓은 서로 대화하는 한 쌍의 주택의 전화 사이에서 확립 된 전화 통화와 비슷합니다. 이러한 전화는 같은 마을의 집이나 다른 도시의 두 집 사이에 설립 될 수 있습니다. 소켓 인 서로 대화하는 전화 한 쌍 사이의 임시 확립 된 경로입니다.

소켓은 통신 끝점입니다. 소켓은 TCP/IP 프로토콜 패밀리와 직접 관련이 없으며 시스템이 지원하는 프로토콜과 함께 사용할 수 있습니다. C Socket API는 먼저 시스템에서 빈 소켓 객체를 얻을 것으로 예상하여 로컬 소켓 주소에 바인딩 할 수 있습니다 (연결이없는 프로토콜을 위해 들어오는 트래픽을 직접 검색하거나 연결 지향 프로토콜에 대한 들어오는 연결 요청을 수락). 또는 원격 소켓 주소에 연결할 수 있습니다 (어떤 종류의 프로토콜). 두 가지를 모두 제어하려면 소켓 주소가 바인딩되고 원격 소켓 주소가 연결된 소켓 주소를 모두 제어하려면 두 가지 모두 수행 할 수 있습니다. 연결이없는 프로토콜의 경우 소켓을 연결하는 경우 선택 사항이지만 그렇게하지 않으면 소켓이 다른 곳에서 보내는 방법을 어떻게 알 수 있으므로 소켓 위로 보내려는 모든 패킷과 함께 대상 주소를 전달해야합니다. 이 데이터는? 장점은 단일 소켓을 사용하여 패킷을 다른 소켓 주소로 보낼 수 있다는 것입니다. 소켓이 구성되고 연결되어 있으면 양방향 통신 파이프라고 생각하십시오. 이를 사용하여 일부 대상으로 데이터를 전달할 수 있으며 일부 대상은이를 사용하여 데이터를 전달할 수 있습니다. 소켓에 쓰는 내용은 발송되며받은 내용은 읽을 수 있습니다.

반면 포트는 TCP/IP 프로토콜 스택의 특정 프로토콜 만 가지고있는 것입니다. TCP 및 UDP 패킷에는 포트가 있습니다. 포트는 단순한 숫자입니다. 소스 포트와 대상 포트의 조합은 두 호스트 간의 통신 채널을 식별합니다. 예를 들어 간단한 HTTP 서버 및 간단한 FTP 서버가 될 서버가있을 수 있습니다. 이제 해당 서버의 주소를 위해 패킷이 도착한다면 HTTP 또는 FTP 서버의 패킷인지 어떻게 알 수 있습니까? 글쎄, HTTP 서버가 포트 80 및 포트 21의 FTP 서버에서 실행되므로 패킷이 대상 포트 80과 함께 도착하면 FTP 서버가 아닌 HTTP 서버 용입니다. 또한 패킷에는 이러한 소스 포트가 없으면 서버는 한 번에 하나의 IP 주소에 하나의 연결만 할 수 있기 때문에 소스 포트가 있습니다. 소스 포트는 서버가 다른 동일한 연결을 구별 할 수있게합니다. 모두 동일한 대상 포트 (예 : 포트 80, 동일한 대상 IP, 항상 동일한 서버 주소 및 동일한 소스 IP를 가지고 있습니다. 클라이언트이지만 다른 소스 포트가 있으므로 서버는 서로 구별 할 수 있습니다. 서버가 회신을 다시 보낼 때, 요청이 나온 포트에 그렇게 할 것입니다. 따라서 클라이언트가 수신하는 다른 답장을 구별 할 수 있습니다.

소켓은 데이터 I/O 메커니즘입니다. 포트는 a 계약 a의 개념 커뮤니케이션 프로토콜. 포트없이 소켓이 존재할 수 있습니다. 포트는 특정 소켓이있는 곳에 존재할 수 있습니다 (예 : 여러 소켓이 동일한 포트에서 활성화되어있는 경우 일부 프로토콜이 허용 될 수 있습니다).

포트는 수신기가 많은 프로토콜을 사용하여 패킷을 라우팅 해야하는 소켓을 결정하는 데 사용되지만 항상 필요한 것은 아니며 다른 방법으로 수신 소켓 선택을 수행 할 수 있습니다. 포트는 프로토콜 핸들러가 전적으로 사용하는 도구입니다. 네트워크 서브 시스템. 예 : 프로토콜이 포트를 사용하지 않으면 패킷은 모든 청취 소켓이나 소켓으로 이동할 수 있습니다.

넓은 의미에서 소켓은 전기, 케이블 또는 전화 소켓과 마찬가지로 소켓입니다. "필수품"(힘, 신호, 정보)이 나가서 출발 할 수있는 지점. 그것은 "필수품"을 사용하는 데 필요하지 않은 많은 세부 사항을 숨 깁니다. Software Parlance에서는 두 엔티티 간의 통신 메커니즘을 정의하는 일반적인 방법을 제공합니다 (이 엔티티는 두 가지 응용 프로그램, 2 개의 물리적으로 별도의 장치, OS 내의 사용자 및 커널 공간 등).

포트는 엔드 포인트 판별 자입니다. 한 엔드 포인트를 다른 엔드 포인트와 구별합니다. 네트워킹 수준에서는 한 애플리케이션이 다른 응용 프로그램과 차별화되어 네트워킹 스택이 정보를 적절한 응용 프로그램으로 전달할 수 있습니다.

이 질문에 대해 이미 이론적 인 답변이 주어졌습니다. 이 질문에 대한 실질적인 예를 제시하고 싶습니다.이 질문은 소켓과 포트에 대한 이해를 분명히 할 것입니다.

찾았어요 여기

이 예는 Wiley와 같은 웹 사이트에 연결하는 과정을 통해 걸어 갈 것입니다. 웹 브라우저 (Mozilla Firefox와 같은)를 열고 www.wiley.com을 주소 표시 줄에 입력합니다. 웹 브라우저는 DNS (Domain Name System) 서버를 사용하여 이름 www.wiley.com을 찾아 IP 주소를 식별합니다. 이 예에서 주소는 192.0.2.100입니다.

Firefox는 192.0.2.100 주소와 응용 프로그램 계층 웹 서버가 작동하는 포트에 연결합니다. Firefox는 잘 알려진 포트이기 때문에 포트가 무엇을 기대 해야하는지 알고 있습니다. 웹 서버의 잘 알려진 포트는 TCP 포트 80입니다.

Firefox가 연결하려는 대상 소켓은 소켓 : 포트 또는이 예에서 192.0.2.100:80으로 작성됩니다. 이것은 Connect의 서버 측이지만 서버는 Mozilla Firefox에서 볼 웹 페이지를 어디에서 보내야하는지 알아야하므로 연결 클라이언트 측면도 소켓이 있습니다.

클라이언트 측 연결은 192.168.1.25와 같은 IP 주소와 무작위로 선택된 동적 포트 번호로 구성됩니다. Firefox와 관련된 소켓은 192.168.1.25:49175처럼 보입니다. 웹 서버는 TCP 포트 80에서 작동하기 때문에이 소켓은 모두 TCP 소켓 인 반면 UDP 포트에서 작동하는 서버에 연결하는 경우 서버와 클라이언트 소켓은 모두 UDP 소켓이됩니다.

소켓은 데이터 I/O에 대한 커널에서 사용자 애플리케이션에 대한 추상화입니다. 소켓 유형은 프로토콜의 처리, IPC 통신 등에 의해 정의됩니다. 따라서 누군가 TCP 소켓을 작성하는 경우 간단한 방법 및 TCP 변환 및 하위 레벨 프로토콜 처리로 데이터를 읽고 데이터를 작성하는 등의 조작을 수행 할 수 있습니다. 패킷을 낮은 레벨 네트워크 프로토콜로 전달하는 것은 커널의 특정 소켓 구현에 의해 수행됩니다. 장점은 사용자가 프로토콜 특정 핵무기 처리에 대해 걱정할 필요가 없으며 일반 버퍼처럼 소켓에 데이터를 읽고 써야한다는 것입니다. IPC의 경우에도 마찬가지입니다. 사용자는 소켓에 데이터를 읽고 씁니다. 커널은 생성 된 소켓 유형을 기반으로 모든 낮은 레벨 세부 정보를 처리합니다.

IP와 함께 포트는 소켓에 주소를 제공하는 것과 같지만 필요하지는 않지만 네트워크 통신에 도움이됩니다.

단일 포트에는 여러 외부 IP와 연결된 하나 이상의 소켓이 다중 전기 콘센트와 같습니다.

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

소켓은 기본적으로 최소 IP- 주소 및 포트로 구성된 네트워크 통신의 엔드 포인트입니다. Java/C#에서 소켓은 양방향 연결의 한쪽을 더 높은 수준으로 구현하는 것입니다.

또한, 정의 자바 문서.

포트:

포트는 직렬, 병렬 및 USB 포트와 같은 주변 장치의 물리적 연결 지점을 참조 할 수 있습니다. 포트라는 용어는 또한 허브, 스위치 또는 라우터의 특정 이더넷 연결 지점을 나타냅니다.

소켓:

소켓은 두 네트워크 응용 프로그램 사이의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터에서 문의하는 통신에도 사용될 수 있습니다. 응용 프로그램은 서로 통신하기위한 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 양쪽이 데이터를 전송 및 수신 할 수 있습니다.

나는 많은 설명이 있다는 것을 알고 있습니다. 그러나 실용적인 예를 들어 이해하는 더 쉬운 방법이 있습니다. 우리 모두는 HTTP 포트 80에 연결할 수 있지만 한 번에 한 명의 사용자 만 해당 포트에 연결할 수 있습니까? 대답은 분명히 '아니오'입니다. 여러 목적으로 여러 사용자가 HTTP 포트 80에 액세스 할 수 있지만 서버에서 기다리고있는 적절한 응답을 여전히 얻을 수 없습니다. 이제 1 분 동안 생각해보십시오. 예, 당신은 맞습니다 IP 주소 이는 다른 목적으로 연락하는 다른 사용자를 독특하게 식별합니다. 여기에 도달하기 전에 이전 답변을 읽은 경우 IP 주소가 소켓이 구성하는 정보의 일부라는 것을 알게 될 것입니다. 생각해보십시오. 소켓없이 커뮤니케이션을 가질 수 있습니까?. 대답은 '예'이지만 포트에서 하나 이상의 응용 프로그램을 실행할 수는 없지만 하드웨어에서만 실행되는 '덤프'스위치가 아니라는 것을 알고 있습니다.

포트는 IP 네트워크 프로토콜의 TCP 및 UDP 전송에서 통신 엔드 포인트를 나타냅니다. 소켓은 이러한 프로토콜 (소켓 API)의 구현에 일반적으로 사용되는 통신 엔드 포인트에 대한 소프트웨어 추상화입니다. 대체 구현은 XTI/TLI API입니다.

또한보십시오:

Stevens, WR 1998, UNIX 네트워크 프로그래밍 : 네트워킹 API : 소켓 및 XTI; 1 권, 프렌 티스 홀.
Stevens, WR, 1994, TCP/IP 그림, 1 권 : 프로토콜, Addison-Wesley.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top