일반 소켓이란 무엇이며 네트워크 장치와 어떤 관련이 있습니까?


9

Linux에서 네트워크 드라이버가 작동하는 방식을 이해하려고합니다. 이 Q & A 는 Linux의 네트워크 장치가 장치 파일로 표시되지 않음을 보여주었습니다. 네트워크 드라이버가와 작동 함을 나타 sockets냅니다.

예를 들어, 이것은ioctl 호출을 통해 네트워크 장치를 설정하는 방법을 나타 냅니다. ioctl그러나 파일 기술자를 필요로 네트워크 드라이버에 대한 장치 파일이없는 점을 감안, 전달 될 수있는 유일한 파일 기술자가 소켓에서 하나입니다.

이것은 질문의 요점을 알려줍니다. 지금까지는 실제 네트워크 카드의 소프트웨어 표현 인 네트워크 인터페이스가 실제로 소켓보다 열등한 객체 인 것처럼 보입니다.

  • 그러나이 추상적 인 의미에서 소켓이란 무엇입니까? 푸시 알림을 지원하는 장치 파일의 다른 이름일까요? 사용자 공간 응용 프로그램에 의해 네트워크 인터페이스의 주소 : 포트 쌍에 바인딩 된 연결 지점 측면에서 TCP 소켓을 이해합니다. 네트워크 인터페이스를 설정하기위한 전제 조건으로 소켓을 이해하지 못합니다.

  • 소켓이없는 Linux의 네트워크 인터페이스 (예 :로 eth0표시 ifconfig)가 존재할 수 있습니까?

  • 합니까 ifconfig또는 일부 네트워크 관리자 데몬은 우리가 네트워크 인터페이스 옵션을 설정할 수 있도록 열려있는 소켓을 유지?


답변:


6

장치 파일을 신속하게 검토합시다. Linux에서 응용 프로그램은 파일 디스크립터를 통해 rad와 통신하고 커널에 쓰기 작업을합니다 . 그것은 파일에 효과적이며, 문자 스트림을 생성하고 소비하는 문자 장치에 동일한 API를 사용할 수 있으며 무작위 액세스 주소에서 고정 크기의 블록을 읽고 쓰는 장치 는 파일이기도합니다.

그러나 이러한 장치를 구성하는 방법 (보레이트 설정 등)이 필요했으며이를 위해 ioctl 호출이 발명되었습니다. 장치에 특정한 데이터 구조와 커널에 사용되는 I / O 제어의 종류를 전달하고 동일한 데이터 구조로 결과를 다시 가져 오므로 매우 일반적인 확장 가능한 API이며 많은 것들에 사용될 수 있습니다 .

이제, 네트워크 운영은 어떻게 맞습니까? 일반적인 네트워크 서버 응용 프로그램이 원하는 결합 일부 네트워크 주소로 듣기 (HTTP에 대한 예를 들어, 80, 또는 22 SSH) 특정 포트 및 클라이언트의 경우 커넥트 , 그것은 싶어 보낼 데이터 및 수신 이 클라이언트에서 데이터를. 그리고 클라이언트를위한 이중 작업.

파일 작업에이를 어떻게 적용 할 것인지는 확실하지 않습니다 ( 계획 9 참조 ). UNIX 디자이너가 새로운 API를 개발 한 이유는 sockets 입니다. 당신의 섹션 2 맨 페이지에서 자세한 내용을 찾을 수 있습니다 socket, bind, listen, connect, sendrecv. 파일 I / O API와는 socket다르지만 이 호출은 파일 디스크립터도 리턴합니다. 웹에서 소켓을 사용하는 방법에 대한 많은 자습서가 있습니다 (Google 조금).

지금까지 이것은 모든 순수한 UNIX이며, 소켓이 발명 될 당시 아무도 네트워크 인터페이스에 대해 이야기하지 않았습니다. 이 API는 실제로 오래 되었기 때문에 AF_*Linux 에서는 인터넷 프로토콜 이외의 다양한 네트워크 프로토콜에 대해 정의되어 있습니다 ( 상수 참조).

그러나 컴퓨터가 여러 개의 네트워크 카드를 얻기 시작하면서 이에 대한 추상화가 필요했습니다. Linux에서 이는 네트워크 인터페이스 (NI)입니다. OpenVPN 등의 터널로 서버로 사용되는 다양한 터널, 사용자 응용 프로그램 끝점에도 사용됩니다. 설명 된 것처럼 소켓 API는 파일을 기반으로하지 않으며 파일 시스템과 독립적입니다. 같은 방식으로 네트워크 인터페이스도 파일 시스템에 나타나지 않습니다. 그러나 NI는 파일 시스템 ( /proc/sys기타 네트워킹 튜너 블) 에서 사용할 수 있습니다 .

NI는 네트워크 패킷이 커널로 들어오고 나가는 엔드 포인트의 커널 추상화입니다. 반면에 소켓은 패킷을 응용 프로그램과 통신하는 데 사용됩니다. 패킷 처리에 소켓이 필요하지 않습니다. 예를 들어, 포워딩이 활성화되면 패킷이 한 NI에 입력되고 다른 NI에 남겨질 수 있습니다. 그런 의미에서 소켓과 네트워크 인터페이스는 완전히 독립적입니다.

그러나 블록 및 문자 장치를 구성하는 방법이 필요한 것처럼 NI를 구성하는 방법이 있어야했습니다. 소켓은 이미 파일 설명자를 반환했기 때문에 ioctl해당 파일 설명자를 허용하는 것이 다소 논리적이었습니다 . 그것이 당신이 연결 한 netdevice 인터페이스입니다.

패킷 필터링, 패킷 캡처 등과 같은 유사한 방식으로 시스템 호출에 대한 다른 몇 가지 남용이 있습니다.

이 모든 것이 한 조각 씩 성장해 왔으며 많은 곳에서 특히 논리적이지 않습니다. 한 번에 모두 디자인했다면 아마도 더 직교 API를 만들었을 것입니다.


Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.오타입니까?
TheMeaningfulEngineer

어느 부분이 오타라고 생각하십니까? 일반 소켓에는 유닉스 도메인 소켓과 달리 파일 이름이나 아이 노드가 없습니다.
dirkt

나는 문장을 의미 적으로 이해하지 못했습니다. 죄송합니다. 다시 확인하고 싶었습니다.
TheMeaningfulEngineer

죄송합니다, 저는 영어를 모국어가 아닙니다. 나는 그것을 바꾸려고 노력했다. 이해하기가 더 쉬워 졌는가?
dirkt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.