답변:
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에 따르면
연결은 끝에있는 소켓 쌍으로 완전히 지정됩니다. 로컬 소켓은 다른 외부 소켓에 대한 많은 연결에 참여할 수 있습니다.
이 소켓 정의 는 특정 연결의 끝점 인 소켓 객체 와 동일하지 않으므로 프로그래밍 관점에서 도움이되지 않습니다 . 프로그래머에게는이 질문의 독자 대부분이 프로그래머이며 이는 중요한 기능적 차이입니다.
소켓은 세 가지로 구성됩니다.
포트는 장치의 논리적 게이트를 나타내는 1에서 65535 사이의 숫자입니다. 클라이언트와 서버 사이의 모든 연결에는 고유 한 소켓이 필요합니다.
예를 들면 다음과 같습니다.
소켓 은 두 네트워크 응용 프로그램 간의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 서로 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터의 프로세스 간 통신에도 사용될 수 있습니다. 응용 프로그램은 서로 통신하기 위해 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 어느 쪽이든 데이터를주고받을 수 있습니다. 따라서 이론적으로 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 모델 을 사용 하는 것입니다. 여기서 다루는 몇 가지 중요한 사항이 있습니다.
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);
가능합니다. 어, 그 작품에 스패너가 던져졌습니다!
좋아, 실제로 그렇지 않았습니다. 우리가해야 할 일은 적절한 정의를 제시하는 것입니다.
/var/run/database.sock
.짜잔! 정리해 우리 계획에서
따라서 실제로 포트는 인터넷 소켓을 형성하기위한 요구 사항의 일부입니다. 불행히도 소켓이라는 단어의 의미가 여러 가지 아이디어에 적용되었습니다. 그래서 나는 혼란에 추가하기 위해 다음 프로젝트 소켓의 이름을 진심으로 권고합니다.)
소켓 = IP 주소 + 포트 (숫자 주소)이
둘은 머신에서 네트워크 연결의 엔드 포인트를 식별합니다. (방금 네트워크 101을 연결 했습니까?)
일반적으로 이론적으로는 많지만이 두 개념을 구별하는 가장 쉬운 방법 중 하나는 다음과 같습니다.
서비스를 받으려면 서비스 번호가 필요합니다. 이 서비스 번호를 포트라고합니다. 그렇게 간단합니다.
예를 들어, 서비스로서의 HTTP는 포트 80에서 실행 중입니다.
이제 많은 사람들이 서비스를 요청할 수 있으며 클라이언트 서버와의 연결이 설정되었습니다. 많은 연결이있을 것입니다. 각 연결은 클라이언트를 나타냅니다. 각 연결을 유지하기 위해 서버는 연결 당 소켓을 만들어 클라이언트를 유지 관리합니다.
2 PC 사이의 연결과 소켓을 동일시하는 많은 답변이있는 것 같습니다. 소켓은 항상 1 대의 PC 에서 엔드 포인트 였으며, 연결되었거나 연결되지 않았을 수 있습니다. 확실히 모든 지점에서 리스너 또는 UDP 소켓 *을 사용했습니다. 중요한 부분은 주소 지정이 가능하고 활동적이라는 것입니다. 해당 엔드 포인트에 소켓이 정의되어 있지 않으므로 1.1.1.1:1234로 메시지를 보내는 것은 작동하지 않습니다.
소켓은 프로토콜에 따라 다릅니다. 따라서 TCP / IP 및 UDP / IP에서 사용 하는 고유성 구현 * (ipaddress : port)은 IPX (네트워크, 노드 및 소켓 등)와 다르지만 다릅니다. 소켓은 일반적인 "소켓"용어를 의미합니다. IPX 소켓 번호는 IP 포트와 동일합니다. 그러나 모두 고유 한 주소 지정 가능 엔드 포인트를 제공합니다.
IP가 주요 프로토콜이되었으므로 포트 (네트워킹 용어로)는 소켓 주소의 일부인 UDP 또는 TCP 포트 번호와 동의어가되었습니다.
짧은 대답.
포트 같이 표현 내부 어드레스 프로그램 또는 프로세스를 식별하는 호스트 내에.
소켓 A와 기술 될 수 인터페이스 프로그래밍 프로그램이 로컬 인터넷에, 다른 프로그램이나 프로세스와 통신하거나 할 수 있도록.
'포트'는 TCP / IP 네트워킹의 개념이고 '소켓'은 API (프로그래밍)입니다. '소켓'은 포트와 호스트 이름 또는 네트워크 어댑터를 가져 와서 데이터를 보내거나받는 데 사용할 수있는 데이터 구조로 결합하여 코드로 만들어집니다.
이것들은 기본적인 네트워킹 개념이므로 상세하면서도 이해하기 쉽고 포괄적 인 방법으로 설명하겠습니다.
따라서 네트워킹의 소켓은 쌍 (ip, port) = (address, service)에 바인딩 된 가상 통신 장치입니다.
노트 :
그것은 당신이 의심을 지우고 희망
탁월한 투표 응답을 읽은 후 네트워크 프로그래밍의 새로운 이민자에게 다음 사항이 강조되어야한다는 것을 알았습니다.
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
...
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 개의 튜플입니다.
TCP / IP 제품군에서 예를 들면 다음과 같습니다.
{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}
유효한 연결이 될 수 있습니다.
반 연결은 {protocol, local-address, local-process}입니다.
또는
{프로토콜, 외부 주소, 외부 프로세스}
연결의 각 반을 지정합니다.
반 연결을 소켓 또는 전송 주소라고도합니다. 즉, 소켓은 네트워크에서 이름을 지정하고 주소를 지정할 수있는 통신의 끝점입니다. 소켓 인터페이스는 통신 프로토콜에 대한 여러 API (Application Programming Interface) 중 하나입니다. 일반적인 통신 프로그래밍 인터페이스로 설계된이 인터페이스는 4.2BSD UNIX 시스템에서 처음 도입되었습니다. 표준화되지는 않았지만 사실상 업계 표준이되었습니다.
소켓은 통신 엔드 포인트입니다. 소켓은 TCP / IP 프로토콜 제품군과 직접 관련이 없으며 시스템이 지원하는 모든 프로토콜과 함께 사용할 수 있습니다. C 소켓 API는 먼저 시스템에서 빈 소켓 객체를 가져와 로컬 소켓 주소에 바인딩 할 수 있습니다 (연결없는 프로토콜의 들어오는 트래픽을 직접 검색하거나 연결 지향 된 프로토콜의 들어오는 연결 요청을 수락 할 수 있음). 또는 원격 소켓 주소에 연결할 수 있습니다 (두 종류의 프로토콜 모두). 둘 다 제어하려면 소켓이 바인딩 된 로컬 소켓 주소와 소켓이 연결된 원격 소켓 주소를 모두 제어 할 수 있습니다. 연결없는 프로토콜의 경우 소켓 연결은 선택 사항이지만 그렇게하지 않으면 소켓 이이 데이터를 어디로 보낼지 다른 방법으로 소켓을 통해 보내려는 모든 패킷과 함께 대상 주소를 전달해야합니까? 장점은 단일 소켓을 사용하여 다른 소켓 주소로 패킷을 보낼 수 있다는 것입니다. 소켓을 구성하고 연결했으면 양방향 통신 파이프로 간주하십시오. 이를 사용하여 데이터를 일부 대상으로 전달하고 일부 대상이이 데이터를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용은 발송되며 수신 된 내용은 읽을 수 있습니다. 이를 사용하여 데이터를 일부 대상으로 전달하고 일부 대상이이 데이터를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용은 발송되며 수신 된 내용은 읽을 수 있습니다. 이를 사용하여 데이터를 일부 대상으로 전달하고 일부 대상이이 데이터를 사용하여 데이터를 다시 전달할 수 있습니다. 소켓에 쓴 내용은 발송되며 수신 된 내용은 읽을 수 있습니다.
반면 포트는 TCP / IP 프로토콜 스택의 특정 프로토콜에만있는 것입니다. TCP 및 UDP 패킷에는 포트가 있습니다. 포트는 단순한 숫자입니다. 소스 포트와 대상 포트의 조합은 두 호스트 간의 통신 채널을 식별합니다. 예를 들어 간단한 HTTP 서버와 간단한 FTP 서버가 될 서버가있을 수 있습니다. 이제 해당 서버의 주소로 패킷이 도착하면 HTTP 또는 FTP 서버의 패킷인지 어떻게 알 수 있습니까? HTTP 서버는 포트 80에서 실행되고 FTP 서버는 포트 21에서 실행되므로 패킷이 대상 포트 80과 함께 도착하면 FTP 서버가 아니라 HTTP 서버를위한 것입니다. 또한 소스 포트가없는 패킷에는 서버가 한 번에 하나의 IP 주소에만 연결할 수 있습니다. 소스 포트를 사용하면 서버가 다른 동일한 연결을 구별 할 수 있습니다. 포트 80, 동일한 대상 IP (서버의 IP) 및 동일한 소스 IP가 있습니다. 동일한 클라이언트이지만 서로 다른 소스 포트가 있으므로 서버는 서로 구별 할 수 있습니다. 그리고 서버가 응답을 다시 보내면 클라이언트는 동일한 서버에서 수신 한 다른 응답을 구별 할 수있는 방식으로 요청의 포트로 전달됩니다.
포트는 가장 쉬운 부분으로, 소켓의 고유 식별자 일뿐입니다. 소켓은 프로세스가 연결을 설정하고 서로 통신하기 위해 사용할 수있는 것입니다. Tall Jeff는 완벽하지 않은 훌륭한 전화 비유를 가지고 있었으므로 수정하기로 결정했습니다.
netstat
디스플레이를 좀 보세요 . 청취 소켓에서 승인 된 모든 소켓은 동일한 포트를 공유합니다. Ergo 포트는 소켓의 고유 식별자가 아닙니다.
응용 프로그램은 네트워크를 통해 통신하는 프로세스 쌍 (클라이언트-서버 쌍)으로 구성됩니다. 이러한 프로세스는 socket 이라는 소프트웨어 인터페이스를 통해 네트워크와 메시지를주고받습니다 . "컴퓨터 네트워킹 : 하향식 접근"책에 제시된 유추를 고려하십시오. 다른 집과 의사 소통을 원하는 집이 있습니다. 여기서 집은 프로세스와 유사하며 소켓의 문입니다. 송신 프로세스는 데이터를 목적지로 전송하는 인프라가 출입문의 다른쪽에 있다고 가정합니다. 메시지가 다른쪽에 도착하면 수신자의 도어 (소켓)를 통해 집 (프로세스)으로 전달됩니다. 같은 책의이 삽화가 도움이 될 수 있습니다.
소켓은 전송 계층의 일부이며 응용 프로그램에 논리적 통신을 제공합니다. 즉, 응용 프로그램의 관점에서 두 호스트간에 많은 라우터 및 / 또는 스위치가 있더라도 두 호스트가 서로 직접 연결되어 있습니다. 따라서 소켓은 연결 자체가 아니라 연결의 끝점입니다. 전송 계층 프로토콜은 중간 라우터가 아닌 호스트에서만 구현됩니다.
포트기계에 내부 주소 지정 수단을 제공합니다. 주요 목적은 여러 프로세스가 다른 프로세스 (데이터)를 방해하지 않고 네트워크를 통해 데이터를주고받을 수 있도록하는 것입니다. 모든 소켓에는 포트 번호가 제공됩니다. 세그먼트가 호스트에 도착하면 전송 계층은 세그먼트의 대상 포트 번호를 검사합니다. 그런 다음 세그먼트를 해당 소켓으로 전달합니다. 전송 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업을 디 멀티플렉싱 이라고 합니다 . 세그먼트의 데이터는 소켓에 연결된 프로세스로 전달됩니다.
소켓은 소프트웨어의 구조입니다. 그것은 다소 파일입니다. 읽기 및 쓰기와 같은 작업이 있습니다. 그것은 물리적 인 것이 아닙니다. 소프트웨어가 물리적 인 것을 참조 할 수있는 방법입니다.
포트는 장치와 같은 것입니다. 각 호스트에는 하나 이상의 네트워크가 있습니다 (실제). 호스트는 각 네트워크에 주소를 가지고 있습니다. 각 주소는 수천 개의 포트를 가질 수 있습니다.
하나의 소켓 만 주소에서 포트를 사용 중일 수 있습니다. 소켓은 파일 시스템 I / O에 장치를 할당하는 것과 거의 비슷한 포트를 할당합니다. 포트가 할당되면 다른 소켓은 해당 포트에 연결할 수 없습니다. 소켓이 닫히면 포트가 해제됩니다.
TCP / IP 용어를 살펴보십시오 .
에서 오라클 자바 튜토리얼 :
소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 한 끝점입니다. 소켓은 포트 번호에 바인드되어 TCP 계층이 데이터를 보낼 애플리케이션을 식별 할 수 있습니다.
포트와 소켓은 은행 지점과 비교할 수 있습니다.
"은행"의 건물 번호는 IP 주소와 유사합니다. 은행에는 다음과 같은 다른 섹션이 있습니다.
따라서 1 (저축 계좌 부서), 2 (개인 대출 부서), 3 (주택 대출 부서) 및 4 (고충 처리 부서)가 항구입니다.
이제 저축 예금 계좌를 개설하고 은행 (IP 주소)으로 이동 한 다음 "저축 계좌 부서"(포트 번호 1)로 이동 한 다음 "저축 계좌 부서"에서 근무하는 직원 중 한 명을 만납니다. ". 계좌 개설을 위해 SAVINGACCOUNT_EMPLOYEE1에게 전화하겠습니다.
SAVINGACCOUNT_EMPLOYEE1은 소켓 설명자이므로 SAVINGACCOUNT_EMPLOYEE1 대 SAVINGACCOUNT_EMPLOYEEN이있을 수 있습니다. 이들은 모두 소켓 설명자입니다.
마찬가지로, 다른 부서들도 그 아래에서 일하고 있으며 소켓과 유사합니다.
소켓은 데이터 I / O 메커니즘입니다. 포트는 통신 프로토콜 의 계약 개념입니다 . 소켓은 포트없이 존재할 수 있습니다. 포트는 특정 소켓없이 존재할 수 있습니다 (예 : 동일한 포트에서 여러 개의 소켓이 활성화 된 경우 일부 프로토콜에 허용 될 수 있음).
포트는 많은 프로토콜을 사용하여 수신자가 패킷을 라우팅해야하는 소켓을 결정하는 데 사용되지만 항상 필요한 것은 아니며 다른 방법으로 수신 소켓을 선택할 수 있습니다. 포트는 전적으로 프로토콜 처리기에서 사용하는 도구입니다. 네트워크 서브 시스템. 예를 들어, 프로토콜이 포트를 사용하지 않으면 패킷은 모든 청취 소켓 또는 소켓으로 이동할 수 있습니다.
내가 생각하는 상대 TCP / IP 용어는 질문에 암시됩니다. 평신도의 관점에서 :
PORT는 특정 우편 번호에있는 특정 집의 전화 번호와 같습니다. 도시의 우편 번호는 도시 및 해당 도시의 모든 집의 IP 주소로 생각할 수 있습니다.
반면에 소켓은 서로 대화하는 한 쌍의 집 전화 사이에 설정된 전화 통화와 비슷합니다. 이러한 전화는 같은 도시의 주택 또는 다른 도시의 두 주택 사이에서 이루어질 수 있습니다. SOCKET 인 서로 통화하는 전화 쌍 사이에 임시로 설정된 경로입니다.
넓은 의미에서 소켓-은 전기, 케이블 또는 전화 소켓과 같은 소켓입니다. "필수 사항"(전력, 신호, 정보)이 나가고 나올 수있는 지점. "필수 항목"을 사용하는 데 필요하지 않은 많은 세부 항목을 숨 깁니다. 소프트웨어 관점에서 두 엔티티 사이의 통신 메커니즘을 정의하는 일반적인 방법을 제공합니다 (이 엔티티는 두 개의 애플리케이션, 두 개의 물리적으로 분리 된 디바이스, 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 #에서 소켓은 양방향 연결의 한면에 대한 상위 레벨 구현입니다.
포트:
포트는 직렬, 병렬 및 USB 포트와 같은 주변 장치의 물리적 연결 지점을 나타낼 수 있습니다. 포트라는 용어는 허브, 스위치 또는 라우터의 특정 이더넷 연결 지점을 가리 킵니다.
소켓:
소켓은 두 네트워크 응용 프로그램 간의 단일 연결을 나타냅니다. 이 두 응용 프로그램은 명목상 다른 컴퓨터에서 실행되지만 소켓은 단일 컴퓨터의 프로세스 간 통신에 사용될 수도 있습니다. 응용 프로그램은 서로 통신하기 위해 여러 소켓을 만들 수 있습니다. 소켓은 양방향이므로 연결의 어느 쪽이든 데이터를주고받을 수 있습니다.
포트는 IP 네트워크 프로토콜에 대한 TCP 및 UDP 전송의 통신 끝점을 나타냅니다. 소켓은 이러한 프로토콜 (소켓 API) 구현에 일반적으로 사용되는 통신 엔드 포인트에 대한 소프트웨어 추상화입니다. 대체 구현은 XTI / TLI API입니다.
또한보십시오:
Stevens, WR 1998, UNIX 네트워크 프로그래밍 : 네트워킹 API : 소켓 및 XTI; 프렌 티스 홀 1 권.
Stevens, WR, 1994, TCP / IP Illustrated, Volume 1 : The Protocols, Addison-Wesley.