2013-07-18 2 views
-2

나는 소켓이 네트워크 프로그램에서 널리 사용되고 있다는 것을 알고 있으며,이 코드를 사용하여 코드를 작성할 수있다. 그러나 나는 어떤 것을 이해할 수 없다 :socket의 정의는 무엇이며 왜 필요하며 어떻게 작동합니까?

1. 소켓이 필요한 이유는 무엇입니까?

응용 프로그램 계층 프로그램을 네트워크 계층별로 구분하는 데 사용되는 경우 응용 프로그램 이름이나 다른 고유 특성을 사용하지 않는 이유는 무엇입니까?

소켓은 표준입니까?

소켓은 리눅스 또는 다른 OS의 구조입니까?

2. 소켓 작동 방식은 무엇입니까?

bind, accept, listen, send와 같이 소켓 주변에는 많은 기능이 있습니다. 예를 들어 send()는 TCP로 dest에 메시지를 보내고 msg는 네트워크 계층에 메시지를 보내는 방법은 무엇입니까? 그것은 TCP 버퍼에 msg를 보냅니 까? 네트워크 계층 프로세스가 TCP 버퍼 데이터를 읽는 방법과 하위 계층 프로세스로 데이터를 보내는 방법

send(int sockfd, const void *buf, size_t len, int flags) 함수를 사용하면 첫 번째 arg 'sockfd'는 임의의 int와 같은 정의되지 않은 소켓이며, 결과는 무엇이며 왜 발생합니까? os가 처리하는 것은 무엇입니까?

+0

이것은 너무 광범위한 질문입니다. 나는 당신이 "Unix Network Programming"이라는 책을 읽는 것이 좋을 것이라고 제안한다. – Barmar

+3

왜 소켓에 관한 모든 질문을이 질문에 넣으려고합니까? 또한 질문에는 먼저 자신의 질문에 답하는 선의의 시도가 표시되지 않습니다. – jxh

답변

3

소켓은 버클리에서 시작되었으므로 (따라서 이름은 Berkeley sockets) 네트워크를 통한 프로세스 간 통신을위한 "표준"추상화를위한 것입니다.

  1. POSIX 소켓은 표준이며, 그들은 기본적으로 (인터페이스에 대한)를 원래의 버클리 소켓
  2. 인터페이스가 아주 잘 설명되어 있으며, 그것은 예를 들어, 당신이 사용하는 경우 발생하는 지정 send에있는 sockfd 매개 변수의 임의 int. "어떻게 네트워크 레이어에 메시지를 보냅니 까?" 라이브러리가 어떻게 구현되는지에 대한 문제이며, 서로 다른 OS에 대해 다른 대답을 가지고 있습니다. 사용자의 관점에서 볼 때, 이것은 문제가되지 않아야합니다.
3

UNIX에서 소켓은 일종의 파일 설명 자입니다. Windows에서 SOCKET은 일종의 HANDLE입니다. 파일 기술자 (descriptor)와 핸들 (HANDLE)은 이러한 운영 체제가 리소스에 대해 수행되는 다양한 작업 (예 : 읽기 및 쓰기)을 허용하는 방식입니다. 따라서 네트워크 연결은 OS의 네트워크 서비스가 제공하는 OS 리소스로 간주됩니다.

소켓 API는 다소 표준이지만 각 OS는 표준 API에 대한 OS 고유의 옵션뿐만 아니라 OS 고유의 API도 제공 할 수 있습니다.

소켓의 기본 구현에는 구조가 포함될 가능성이 큽니다.

OS가 소켓 API를 구현하는 방법은 다른 시스템 호출을 구현하는 것과 크게 다르지 않습니다. send() API는 결국 데이터를 네트워크 스택에 전달하는 시스템 호출로 변환됩니다. 네트워크 스택은 자체 버퍼를 관리하지만 일반적으로 send()은 사용자 공간의 데이터를 네트워크 버퍼에 복사합니다 (이는 write() 시스템 호출이 호출 될 때와는 다릅니다). 네트워크 스택은 코드를 통해 데이터를 처리하여 다른 레이어 (일반적으로 소켓 -> TCP -> IP -> 이더넷 드라이버)로 전달합니다. 최하위 계층에서는 OS가 물리적 장치와 통신하는 데 사용하는 모든 장치 드라이버와 유사합니다.

당신이 send()에 비 소켓의 파일 기술자를 전달

는, 나도 EBADF, EINVAL, 또는 ENOTSOCK, 대부분의 경우 오류가 발생하는 기대.

관련 문제