답변:
S는 서버 프로그램입니다 :의는 HTTP 서버 말할 수 있도록, 그래서 잘 알려진 포트 번호를 사용합니다 HTTP 나 IP 주소를 가진 호스트에서 실행 80입니다, 10.0.0.4
그것은에 연결을 수신 할 수 있도록, 10.0.0.4:80
(때문에 모든 사람들이 그것을 찾을 것으로 예상됩니다).
내부 S , 내가 만들거야 소켓 과 결합 그 주소로 지금의 OS는 연결이 들어오는 것을 알고 10.0.0.4:80
내 라우팅되어야 S의 특정 소켓을 통해 공정.
소켓이 바인드되면 netstat 출력 :
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
NB. S 는 클라이언트가 어떻게 접근하는지 신경 쓰지 않기 때문에 로컬 주소는 모두 0입니다.
일단 S가 이 소켓이 바인드 한, 그것은 것입니다 동의를 연결 - 새로운 클라이언트가 연결될 때마다, accept
반환 새로운 해당 클라이언트에 고유 한 소켓을,
연결이 승인되면 netstat 출력 :
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
이제 S 는 더 많은 클라이언트 연결을 받아 들일 수 있습니다 ... 각 소켓마다 고유 한 소켓이 있고 각 소켓은 고유 한 TCP 연결과 연결되며 각 연결에는 고유 한 원격 주소가 있습니다. S 는 소켓과 연관시켜 클라이언트 상태 (있는 경우)를 추적합니다.
대략적으로 :
accept
호출 중 하나 가 리턴 할 때 마다 하나의 프로세스 에서만 수행됩니다. 각 수신 연결 소켓은 서버의 한 인스턴스에 고유합니다.socketpair
, 해당 프로세스의 하위 프로세스 및 상속 프로세스 또는 해당 프로세스의 소켓 중 하나를 명시 적으로 전달한 프로세스기계를 아파트 건물로 생각하십시오.
항구는 아파트 번호입니다.
소켓은 아파트의 문입니다.
IP 주소는 건물의 주소입니다.
A socket is the door of an apartment.
그러나 하나의 포트에서 수많은 소켓을 열 수 없었습니까?
포트는 TCP 및 UDP 프로토콜에서 주소의 일부입니다. OS가 어떤 데이터를 수신해야하는지 식별하는 데 도움이됩니다. 포트는 TCP 및 UDP의 본질적인 부분이므로 OS는 TCP 및 UDP를 지원하기 위해 포트를 지원해야합니다.
소켓은 OS가 네트워크 데이터를 보내고받을 수 있도록 응용 프로그램에 제공하는 인터페이스의 일부입니다. 대부분의 소켓 구현은 TCP 및 UDP 이외의 많은 프로토콜을 지원하며 일부 프로토콜에는 포트 개념이 없습니다. OS는 TCP 또는 UDP를 지원하기 위해 소켓을 지원하지 않아도됩니다. 응용 프로그램에서 사용할 수있는 다른 인터페이스를 제공 할 수 있습니다. 소켓은 단순히 특정 포트에서 데이터를 송수신하는 한 가지 방법입니다.