포트와 소켓의 차이점은 무엇입니까?
이것은 우리 조직의 소프트웨어 엔지니어 중 한 명이 제기 한 질문이었습니다. 가장 광범위한 정의에 관심이 있습니다.
요약
TCP 소켓은특정 TCP 연결 또는 수신 상태의 게이트웨이에서 IP 주소와 포트로 정의 된 엔드 포인트 인스턴스 입니다.
포트는 서비스 엔드 포인트를 정의 하는 식별자입니다 (서비스 인스턴스 엔드 포인트 일명 세션 식별자 와 구별됨 ).
TCP은 소켓 연결 이 아니라 특정 연결의 끝점입니다.
이 연결 로컬 및 원격 끝점 모두에 의해 식별 되어 트래픽이 특정 서비스 인스턴스로 라우팅 될 수 있기 때문에 서비스 끝점에, 대한 동시 연결이있을 수 있습니다 .
주어진 주소 / 포트 조합에 대해 하나의 리스너 소켓 만있을 수 있습니다 .
박람회
이것은 내가 안다고 생각했던 여러 가지를 재검토했던 여러 가지 질문을했습니다. "소켓"과 같은 이름은 자명하고 생각할 것입니다. 네트워크 케이블을 연결하는 엔드 포인트의 이미지를 불러 일으키기 위해 선택 가능한 기능적 유사성이 있습니다. 그럼에도 불구하고 네트워크 용어로 "소켓"이라는 단어는 너무 많은 짐을 운반하므로 신중한 재검토가 필요합니다.
가장 넓은 의미에서 포트는 수신 또는 송신 지점입니다. 큰 강철 컨테이너를 사용하지 않는 것은 아니지만 프랑스어 단어 porte는 말 그대로 문 또는 게이트웨이를 의미 하며 데이터를 발송하든 큰 강철 컨테이너를 운송하든 항구가 운송 종점이라는 사실을 더욱 강조합니다.
이 논의의 목적을 위해 TCP-IP 네트워크의 많은에 대한 고려를 제한 할 것입니다. OSI 모델은 모두 매우 훌륭하지만 구현되지 않았으며 트래픽이 많이 발생하지 않습니다.
IP 주소와 포트의 조합을 엄격하게 끝점이라고하며 소켓이라고도합니다. 이 사용법은 원래 TCP 사양 인 RFC793에서 시작됩니다.
TCP 연결 은 두 개의 끝점 ( 소켓)에 의해 정의 됩니다.
엔드 포인트 (소켓)는 네트워크 주소와 포트 식별자 의 조합으로 정의 됩니다. 주소 /가 포트 소켓을 완전히 식별하는 [해석] 아닙니다 (나중에 자세히 설명).
포트의 목적은 주어진 네트워크 주소에서 여러 엔드 포인트를 구별하는 것입니다. 말할 수 있습니다. 이 하나는 단일 네트워크 인터페이스에서 여러 동시 연결을 가능하게합니다.
인터넷에서 각 TCP 연결을 고유하게 이미지하는 두 끝점을 지정하는 소켓 쌍 (클라이언트 IP 주소, 클라이언트 포트 번호, 서버 IP 주소 및 서버 포트 번호로 구성된 4- 튜플)입니다. ( TCP-IP 일러스트 볼륨 1 , W. Richard Stevens)
대부분의 C 파생 언어에서 TCP 연결은 소켓 클래스의 인스턴스에서 메소드를 사용하여 설정 및 조작됩니다. 일반적으로 NetworkStream 클래스의 인스턴스 인 더 높은 수준의 추상화에서 작동하는 것이 일반적이지만 일반적으로 소켓 개체에 대한 참조를 노출합니다. 코더 에게이 생성되는 연결은 연결이 생성되고 생성 된 메소드를 사용하여 생성되고 조작되기 때문에 연결됩니다.
C #에서 기존에 제외에 대한 TCP 연결을 설정 한 비용을 TcpClient 를 만듭니다 . TcpClient 생성자에 대한 엔드 포인트를 지정하지 않고 사용합니다. 어떤 방식 으로든 로컬 엔드 포인트가 정의됩니다. 그런 다음 생성 한 인스턴스 에서 Connect 메서드 를 호출합니다 . 이 메소드는 다른 끝점을 설명하는 변수가 필요합니다.
이 모든 것은 혼란스럽고 소켓이 인 연결이라고 믿게 만듭니다. 나는 Richard Dorman이 질문을 할 때까지 계속해서 오해로 일하고 있습니다.
것을 읽고 생각 많은 했으므로 이제 두 개의 인수 인 LocalEndpoint 및 RemoteEndpoint를 사용하는 생성자가있는 TcpConnection 클래스를 갖는 것이 훨씬 더 합리적이라고 확신합니다 . 로컬 엔드 포인트에 다중이 허용되는 경우 단일 인수 RemoteEndpoint를 지원할 수 있습니다. 이 멀티 홈 컴퓨터에서 모호하지만 원격 끝점에 대한 가장 짧은 경로가있는 인터페이스를 선택하여 라우팅 테이블을 사용하여 모호성을 사용할 수 있습니다.
다른 모든 레벨이 증가합니다. 소켓은 IP 주소와 포트의 조합으로 활 활활합니다 .
[...] TCP는 로컬 및 외부 주소를 구성하는 4 개의 값 (대상 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의 두 번째 단락에 따르면
연결은 끝의 소켓 쌍에 의해 완전히 지정됩니다. 로컬 소켓은 외부 소켓에 대한 많은 연결에 참여할 수 있습니다.
소켓 정의이 는 특정 연결의 끝점 인 소켓 object- 와 동일하지 않기 때문에 프로그래밍 관점에서 도움이되지 않습니다 . 프로그래머에게는 질문의 청중입니다 대부분이 프로그래머입니다.
참고 문헌
TCP-IP 일러스트 볼륨 1 The Protocols , W. Richard Stevens, 1994 Addison Wesley
RFC793 , DARPA를위한 서던 캘리포니아 대학교 정보 과학 연구소
RFC147 , 소켓의 정의, Joel M. Winett, Lincoln Laboratory
소켓은 세 가지로 구성됩니다.
- 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 포트와 주변 장치의 물리적 연결 지점을 참조 할 수 있습니다. 포트라는 용어는 허브, 스위치 또는 라우터와 같은 특정 연결 지점을 의미합니다.
ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
ref 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 소켓 방식을 지원하는 다음과 같은 응용 프로그램에서 포트와 소켓을 만들 수 있습니다.
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 as a service는 포트 80에서 실행됩니다.
이제 많은 사람들이 서비스를 강화하고 서버에서 연결이 설정되었습니다. 많은 연결이 될 것입니다. 각 연결은 클라이언트를 나타냅니다. 각 연결을 유지하기 위해 서버는 클라이언트를 유지하기 위해 연결 당 소켓을 만듭니다.
소켓과 PC 2 대의 연결을 동일시하는 답변이 많이있는 것 같습니다. 소켓은 항상 1 대의 PC 에서 끝점 으로 연결되어 있거나 연결되어 있지 않을 수 있습니다. 확실히 우리는 모두 어느 시점에서 리스너 또는 UDP 소켓을 사용했습니다. 중요한 부분은 주소 지정이 가능하고 모든 것이 가능합니다. 1.1.1.1:1234로 메시지를 신호하는 것은 해당 엔드 포인트에 대해 정의 된 소켓이 때문에 작동하지 않을 것입니다.
소켓은 프로토콜에 따라 늘어납니다. 따라서 TCP / IP 및 UDP / IP가 사용 하는 고유성 구현 * (ipaddress : port)은 예를 들어 IPX (네트워크, 노드 및 ... ahem, 소켓)와 많은 것입니다. 소켓은 일반적인 "소켓"용어가 의미하는 것입니다. IPX 소켓 번호는 IP 포트와 동일합니다.) 그러나 약간의 고유 한 주소 지정 가능한 엔드 포인트를 제공합니다.
IP가 지배적 인 프로토콜이 되었기 때문에 포트 (네트워킹 용어로)는 소켓 주소의 일부인 UDP 또는 TCP 포트 번호와 동의어가 있습니다.
UDP는 연결이 없습니다. 즉, 두 끝점 사이에 가상 회로가 생성되지 않습니다. 그러나 여전히 UDP 소켓 을 끝점이라고합니다. API 함수는 둘 다 다른 유형의 소켓 인
SOCK_DGRAM
UDP (소켓 전송)이고SOCK_STREAM
TCP (가상 회로 생성 )를 분명히합니다 .기술적으로 IP 헤더는 IP 주소를 보유하고 IP (UDP 또는 TCP) 상단의 프로토콜은 포트 번호를 보유합니다. 이를 통해 다른 프로토콜 (예 : 포트 번호는 없지만 IP 주소 지정 정보가있는 ICMP) 을 통해 사용할 수 있습니다.
짧고 대답입니다.
포트 같이 표현 내부 어드레스 프로그램 또는 프로세스를 메모리하는 호스트.
소켓 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 개의 소켓이 함께 바인딩되면 연결이 발생합니다.
소켓은 운영 체제에서 네트워크 서비스를 요청하기 위해 프로세스에서 사용하는 특수한 유형의 파일 핸들입니다. 소켓 주소는 {protocol, local-address, local-process} 트리플입니다. 여기서 로컬 프로세스는 포트 번호로 이미지입니다.
예를 들어, TCP / IP 제품군에서 :
{tcp, 193.44.234.3, 12345}
대화는 두 프로세스 실행 링크 링크 두 프로세스 메시지를 나타냅니다. 연결은 연결을 구성하는 두 프로세스를 완전히 지정하는 5- 튜플 : {protocol, local-address, local-process, foreign-address, foreign-process}
예를 들어, TCP / IP 제품군에서 :
{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}
유효한 연결 일 수 있습니다.
반 연결은 {프로토콜, 로컬 주소, 로컬 프로세스} 중 하나입니다.
또는
{프로토콜, 외부 주소, 외부 프로세스}
연결의 각 절반을 지정합니다.
반 연결은 소켓 또는 전송 주소라고도합니다. 즉, 소켓은 네트워크에서 이름을 지정하고 주소를 수있는 통신의 끝점입니다. 소켓 인터페이스는 통신 프로토콜에 대한 여러 API (응용 프로그래밍 인터페이스) 중 하나입니다. 일반적인 통신 프로그래밍 인터페이스로 설계 제안 4.2 BSD UNIX 시스템에서 처음 소개되었습니다. 표준화되지 않았습니다.
여기에있는 방식으로 개념을 이해합니다.
- 소켓 은 전화와 가변 (예 : 통신을위한 신호 간 장치)
- IP 는 전화 번호 (예 : 소켓 주소)와 가변합니다.
- 포트 는 통화하려는 사람 (즉, 해당 주소에서 주문하려는 서비스)과 있습니다.
- 소켓은 클라이언트 또는 서버 소켓이 될 수 있습니다 (즉, 회사에서 고객 지원 전화는 서버이지만 가정의 전화는 대부분 클라이언트입니다).
따라서 통신의 소켓은 쌍 (ip, port) = (address, service)에 바인딩 된 장치입니다.
노트 :
- 컴퓨터, 컴퓨터, 호스트, 모바일 또는 PC는 여러 개의 주소, 여러 개의 개의 열린 포트, 소켓을 소켓을 수 있습니다. 여러 사람이 대화 할 수있는 여러 전화 번호를 사무실에서와 같이 여러 전화 번호와 여러 사람이 대화 할 수 있습니다.
- 개방형 / 활성 포트가 존재하는 포트에 액세스 할 수있게 소켓이기 때문에 소켓이 연결되어 있어야합니다. 그러나 당분간 사용하지 않는 포트가 있습니다.
- 또한 서버 소켓에서는 여러 선 (전화 번호)을 다수있는 수있는 전화에서와 같이 (포트, 컴퓨터의 특정 전화 주소) 또는 (포트, 컴퓨터의 모든 주소)에 바인딩 할 수 있습니다. 전화 또는 하나의 특정 전화선을 전화로 연결해도 모든 전화선이나 특정 전화선을 통해 사람에게 연락 할 수 있습니다.
- 일반적으로 두 사람이 항상 같은 전화를 동시에 사용할 수있는 것은 전화에서와 같이 소켓을 두 개의 포트와 연결 (바인딩) 할 수 없습니다.
- 고급 : 동일한 시스템에서 유형 (클라이언트 또는 서버)과 포트 및 IP가 소켓을 소켓을 수 없습니다. 그러나 클라이언트 인 경우 각 클라이언트 소켓의 로컬 포트가 다르기 때문에 두 개의 소켓을 사용하여 서버에 대해 두 개의 연결을 열 수 있습니다.)
의심을 해소하기를
포트는 가장 쉬운 부분이 소켓의 고유 식별자 일뿐입니다. 소켓은 프로세스가 연결을 설정하고 서로 통신하는 데 사용할 수있는 것입니다. Tall Jeff는 완벽하지 않은 훌륭한 전화 비유를 가지고 수정하기로 결정했습니다.
- IP 및 포트 ~ 전화 번호
- 소켓 ~ 전화 장치
- 연결 ~ 전화
- 연결 설정 ~ 전화 걸기
- 프로세스, 원격 애플리케이션 ~ 사람
- 메시지 ~ 연설
소켓은 소프트웨어의 구조입니다. 다소간 파일입니다. 읽기 및 쓰기와 같은 작업이 있습니다. 그것은 물리적 인 것이 아닙니다. 소프트웨어가 물리적 인 것을 참조하는 방법입니다.
포트는 장치와 같은 것입니다. 각 호스트에는 하나 이상의 네트워크가 있습니다 (물리적 네트워크). 호스트에는 각 네트워크에 주소가 있습니다. 각 주소에는 수천 개의 포트가 있습니다.
하나의 소켓 만 주소에서 포트를 사용할 수 있습니다. 소켓은 파일 시스템 I / O를위한 장치를 할당하는 것과 거의 비슷하게 포트를 할당합니다. 포트가 할당 된 소켓은 소켓이 닫히면 포트가 해제됩니다.
TCP / IP를 용어 살펴보십시오 .
애플리케이션은 네트워크를 통해 통신하는 프로세스 쌍 (클라이언트-서버 쌍)으로 구성됩니다. 이러한 프로세스는 소켓 이라는 소프트웨어 인터페이스를 통해 네트워크와 메시지를주고받습니다 . 책 "컴퓨터 방식 : 하향식 접근 방식"에 제시된 비유를 고려하십시오. 다른 집과 소통하고 싶은 집이 있습니다. 여기서 집은 프로세스와 유사하며 소켓으로가는 문입니다. 전송 프로세스는 문 반대편에 데이터를 목적지로 인프라가 안전하게 가정합니다. 메시지가 다른쪽에 도착하면 자신의 문 (소켓)을 통해 집 (프로세스)으로 전달됩니다. 같은 책 의이 그림은 다음과 같은 도움이 될 수 있습니다. 소켓은 애플리케이션에 위치 통신을 제공하는 전송 계층의 일부입니다. 이는 애플리케이션의 관점에서 볼 때 두 호스트가 서로간에 많은 라우터 및 / 스위치 또는가 있더라도 서로 직접 연결되어 있음을 의미합니다. 소켓은 연결 자체가 아니라 연결의 끝점입니다. 전송 계층 프로토콜은 호스트에서만 구현되고 중간 라우터에서는 구현되지 않습니다. 항구 기계에 내부 주소 지정 수단을 제공합니다. 주요 목적은 여러 프로세스가 다른 프로세스 (해당 데이터)를 방해하지 않고 네트워크를 통해 데이터를 제공받을 수 있습니다.
모든 소켓에는 포트 번호가 제공됩니다. 세그먼트가 호스트에 도착하면 전송 계층은 세그먼트의 대상 포트 번호를 검사합니다. 그런 다음 세그먼트를 소켓으로 전달합니다. 전송 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는이 작업을 디 멀티플렉싱 이라고 합니다 . 그런 다음 세그먼트의 데이터는 소켓에 프로세스로 전달됩니다.
에서 오라클 자바 튜토리얼 :
소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 한 끝점입니다. 소켓은 포트 번호에 바인딩되므로 TCP 계층은 데이터가 전송 될 응용 프로그램을 식별 할 수 있습니다.
포트와 소켓은 은행 지점과 비교할 수 있습니다.
"은행"의 건물 번호는 IP 주소와 유사합니다. 은행에는 다음과 같은 다른 섹션이 있습니다.
- 저축 계좌 부서
- 개인 대출 부서
- 주택 융자 부서
- 고충 처리 부서
따라서 1 (저축과), 2 (개인 대출과), 3 (주택 융자과), 4 (고충과)는 항구입니다.
이제 저축 계좌를 개설하고 은행 (IP 주소)으로 이동 한 다음 "저축 계좌 부서"(포트 번호 1)로 이동 한 다음 "저축 계좌 부서에서 일하는 직원 중 한 명을 만납니다." ". 계좌 개설을 위해 그를 SAVINGACCOUNT_EMPLOYEE1이라고 부르겠습니다.
SAVINGACCOUNT_EMPLOYEE1은 소켓 설명자이므로 SAVINGACCOUNT_EMPLOYEE1 ~ SAVINGACCOUNT_EMPLOYEEN이있을 수 있습니다. 이들은 모두 소켓 설명자입니다.
마찬가지로, 다른 부서에서 직원이 근무하게되며 소켓과 유사합니다.
내가 가정하는 상대 TCP / IP 용어는 질문에 함축되어 있습니다. 평신도의 용어로 :
PORT는 특정 우편 번호에있는 특정 집의 전화 번호와 같습니다. 마을의 우편 번호는 마을과 그 마을에있는 모든 집의 IP 주소로 생각할 수 있습니다.
반면에 SOCKET은 한 쌍의 집에서 서로 대화하는 전화기 사이에 설정된 전화 통화와 비슷합니다. 이러한 호출은 같은 마을에있는 집이나 다른 마을에있는 두 집간에 설정할 수 있습니다. SOCKET은 서로 대화하는 한 쌍의 전화기 사이에 임시로 설정된 경로입니다.
소켓은 통신 끝점입니다. 소켓은 TCP / IP 프로토콜 제품군과 직접 관련이 없으며 시스템에서 지원하는 모든 프로토콜과 함께 사용할 수 있습니다. C 소켓 API는 먼저 시스템에서 빈 소켓 객체를 가져 와서 로컬 소켓 주소에 바인딩 할 수 있다고 예상합니다 (연결없는 프로토콜에 대한 수신 트래픽을 직접 검색하거나 연결 지향 프로토콜에 대한 수신 연결 요청을 수락하기 위해). 또는 어떤 프로토콜이든 원격 소켓 주소에 연결할 수 있습니다. 둘 다 제어하려면 소켓이 바인딩 된 로컬 소켓 주소와 소켓이 연결된 원격 소켓 주소를 모두 제어 할 수도 있습니다. 비 연결형 프로토콜의 경우 소켓을 연결하는 것은 선택 사항이지만 그렇게하지 않으면 소켓을 통해 보내려는 모든 패킷과 함께 대상 주소를 전달해야합니다. 다른 방법으로 소켓이이 데이터를 보낼 위치를 알 수 있습니까? 장점은 단일 소켓을 사용하여 패킷을 다른 소켓 주소로 보낼 수 있다는 것입니다. 소켓을 구성하고 연결 한 후에는 양방향 통신 파이프로 간주하십시오. 이를 사용하여 데이터를 일부 대상으로 전달할 수 있고 일부 대상은이를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용이 전송되고 수신 된 내용을 읽을 수 있습니다. 이를 사용하여 데이터를 일부 대상으로 전달할 수 있고 일부 대상은이를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용이 전송되고 수신 된 내용을 읽을 수 있습니다. 이를 사용하여 데이터를 일부 대상으로 전달할 수 있고 일부 대상은이를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용이 전송되고 수신 된 내용을 읽을 수 있습니다.
반면에 포트는 TCP / IP 프로토콜 스택의 특정 프로토콜에만있는 것입니다. TCP 및 UDP 패킷에는 포트가 있습니다. 포트는 단순한 숫자입니다. 소스 포트와 대상 포트의 조합은 두 호스트 간의 통신 채널을 식별합니다. 예를 들어 간단한 HTTP 서버와 간단한 FTP 서버가 둘 다있는 서버가있을 수 있습니다. 이제 해당 서버의 주소에 대한 패킷이 도착하면 HTTP 또는 FTP 서버에 대한 패킷인지 어떻게 알 수 있습니까? 음, HTTP 서버는 포트 80에서 실행되고 FTP 서버는 포트 21에서 실행되므로 패킷이 대상 포트 80에서 도착하면 FTP 서버가 아닌 HTTP 서버용입니다. 또한 패킷에는 소스 포트가 있습니다. 이러한 소스 포트가 없으면 서버는 한 번에 하나의 IP 주소에 대한 연결 만 가질 수 있기 때문입니다. 소스 포트를 사용하면 서버가 동일한 연결을 구별 할 수 있습니다. 모두 동일한 대상 포트 (예 : 포트 80, 동일한 대상 IP, 항상 동일한 서버 주소 및 동일한 소스 IP)를 갖습니다. 하지만 소스 포트가 다르기 때문에 서버는 서로 구별 할 수 있습니다. 그리고 서버가 응답을 다시 보낼 때 요청이 들어온 포트로 그렇게하므로 클라이언트는 수신 한 다른 응답을 구별 할 수도 있습니다.
소켓은 데이터 I / O 메커니즘입니다. 포트는 통신 프로토콜 의 계약 개념입니다 . 소켓은 포트없이 존재할 수 있습니다. 포트는 특정 소켓없이 존재할 수 있습니다 (예 : 동일한 포트에서 여러 소켓이 활성화 된 경우 일부 프로토콜에서 허용 될 수 있음).
포트는 많은 프로토콜과 함께 수신기가 패킷을 라우팅해야하는 소켓을 결정하는 데 사용되지만 항상 필요한 것은 아니며 수신 소켓 선택은 다른 방법으로 수행 할 수 있습니다. 포트는 전적으로 프로토콜 처리기가 사용하는 도구입니다. 네트워크 하위 시스템. 예를 들어 프로토콜이 포트를 사용하지 않는 경우 패킷은 모든 청취 소켓 또는 소켓으로 이동할 수 있습니다.
넓은 의미에서 소켓은 전기, 케이블 또는 전화 소켓과 같은 소켓입니다. "필수 항목"(전원, 신호, 정보)이 나가고 들어올 수있는 지점입니다. "필수 항목"을 사용하는 데 필요하지 않은 많은 세부 항목을 숨 깁니다. 소프트웨어 용어로, 두 엔티티 간의 통신 메커니즘을 정의하는 일반적인 방법을 제공합니다 (이러한 엔티티는 무엇이든 될 수 있습니다-두 개의 애플리케이션, 두 개의 물리적으로 분리 된 장치, 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가 연결을 시도하는 대상 소켓은 socket : port 또는이 예에서는 192.0.2.100:80으로 작성됩니다. 이것은 연결의 서버 측이지만 서버는 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 #에서 소켓은 양방향 연결의 한쪽에 대한 상위 수준 구현입니다.
또한 Java 문서 의 정의 .
포트:
포트는 직렬, 병렬 및 USB 포트와 같은 주변 장치의 물리적 연결 지점을 참조 할 수 있습니다. 포트라는 용어는 허브, 스위치 또는 라우터에있는 것과 같은 특정 이더넷 연결 지점을 의미하기도합니다.
소켓:
소켓은 두 네트워크 응용 프로그램 간의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터의 프로세스 간 통신에도 사용할 수 있습니다. 응용 프로그램은 서로 통신하기 위해 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 양쪽 모두 데이터를 보내고받을 수 있습니다.
나는 많은 설명이 있다는 것을 알고 있습니다. 그러나 실용적인 예를 들어 이해하는 더 쉬운 방법이 하나 더 있습니다. 우리 모두 HTTP 포트 80에 연결할 수 있지만 한 번에 한 사용자 만 해당 포트에 연결할 수 있다는 의미입니까? 대답은 분명히 '아니오'입니다. 여러 목적으로 여러 사용자가 HTTP 포트 80에 액세스 할 수 있지만 여전히 서버에서 기다리는 적절한 응답을받을 수 있습니다. 이제 잠시 생각해보세요. 어떻게?. 예, 맞습니다. IP 주소다른 목적으로 연락하는 다른 사용자를 고유하게 식별합니다. 여기에 도달하기 전에 이전 답변을 읽었다면 IP 주소가 소켓이 구성하는 정보의 일부라는 것을 알 것입니다. 그것에 대해 생각해보십시오, 소켓없이 통신을 할 수 있습니까?. 대답은 '예'이지만 포트에서 하나 이상의 애플리케이션을 실행할 수는 없지만 하드웨어에서만 실행되는 'Dump'스위치가 아니라는 것을 알고 있습니다.
소켓은 애플리케이션에 대한 인터페이스로 사용되는 네트워킹 엔드 포인트의 SW 추상화입니다. Java, C #에서는 객체로, Linux, Unix에서는 파일로 표시됩니다.
포트는 통신을 설정하려는 경우 소켓의 속성 일뿐입니다. 소켓에서 패킷을 수신 한 특정 로컬 포트 및 NIC (로컬 IP 주소 포함) 또는 모든 NIC (INADDR_ANY가 바인드 호출에 지정됨)에 바인딩해야합니다. 패킷을 보내려면 원격 소켓의 포트와 IP를 지정해야합니다.
참고 URL : https://stackoverflow.com/questions/152457/what-is-the-difference-between-a-port-and-a-socket
'ProgramingTip' 카테고리의 다른 글
메모장 ++에서 JSON을 다시 포맷하는 방법은 무엇입니까? (0) | 2020.09.28 |
---|---|
내보내기를 사용하거나 사용하지 않고 변수 정의 (0) | 2020.09.28 |
JavaScript에서 배열을 비교하는 방법은 무엇입니까? (0) | 2020.09.28 |
믹스 인이란 무엇이며 왜 유용합니까? (0) | 2020.09.28 |
'git reset --hard HEAD'를 사용하여 이전 커밋으로 되돌리려면 어떻게해야합니까? (0) | 2020.09.28 |