어느 시점에서 내가 (Linux Foundation에서) 발견한 일부 Linux 교과서에서 다음과 같은 내용이 언급되었습니다.
ip
ifconfig
명령은 명령을 사용하는 것보다 더 다양하고 효율적입니다.인터넷 연결대신에 소켓I/W 제어시스템 호출.
뒤에서 무슨 일이 일어나고 있는지 이해할 수 없기 때문에 누구든지 이것에 대해 자세히 설명할 수 있습니까?
PS 나도 알아이 주제그러나 작동 방식의 구체적인 차이점은 다루지 않습니다.
답변1
FreeBSD 및 OpenBSD와 같은 운영 체제의 명령은 ifconfig
나머지 운영 체제와 일치하도록 업데이트되었습니다. 현재는 이러한 운영 체제에서 다양한 네트워크 인터페이스 설정을 구성하고 다양한 네트워크 프로토콜을 처리할 수 있습니다. BSD는 ioctl()
이러한 것들을 지원합니다.
리눅스 세계에서는 이런 일이 일어나지 않습니다. 오늘은 세 가지 명령이 있습니다 ifconfig
.
ifconfig
~에서GNU inetutilsjdebp % inetutils-ifconfig -l enp14s0 enp15s0 루오 jdebp % inetutils-ifconfig lo lo link encap: 로컬 루프백 inet 주소: 127.0.0.1 브로드캐스트: 0.0.0.0 마스크: 255.0.0.0 상위 루프백 작업 MTU: 65536 측정항목: 1 RX 패킷: 9087 오류: 0 삭제: 0 오버플로: 0 프레임: 0 TX 패킷: 9087 오류: 0 삭제: 0 오버플로: 0 캐리어: 0 충돌: 0 txqueuelen: 1000 RX 바이트: 51214341 TX 바이트: 51214341 제드 BP%
ifconfig
~에서NET-3 네트워크 도구jdebp% ifconfig -l ifconfig: 옵션 --help'는 사용법 정보를 제공합니다.
-l' not recognised. ifconfig:
jdebp % ifconfig lo lo:flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 넷마스크 255.0.0.0 inet6::1 prefixlen 128scopeid 0x10<호스트> inet6::2 prefixlen 128scopeid 0x80<호환 가능, 전역> inet6 fe80:: prefixlen 10scopeid 0x20<링크> Loop txqueuelen 1000(로컬 루프백) RX 패킷 9087바이트 51214341(48.8MiB) RX 오류 0 드롭 0 오버플로 0 프레임 0 TX 패킷 9087바이트 51214341(48.8MiB) TX 오류 0 드롭 0 오버플로 0 캐리어 0 충돌 0 제드 BP%ifconfig
(버전 1.40)부터Nosh 도구 세트jdebp% ifconfig -l enp14s0 enp15s0 루오 jdebp % ifconfig lo 루오 링크 루프백 작업 링크주소 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 주소 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 주소 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 주소::2 범위 0 prefixlen 128 inet6 주소 fe80:: 범위 1 prefixlen 10 inet6 주소::1 범위 0 prefixlen 128 jdebp % sudo ifconfig lo inet4 127.1.0.2 별칭 jdebp % sudo ifconfig lo inet6 ::3/128 별칭 jdebp % ifconfig lo 루오 링크 루프백 작업 링크주소 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 주소 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 주소 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 inet4 주소 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 주소::3 범위 0 prefixlen 128 inet6 주소::2 범위 0 prefixlen 128 inet6 주소 fe80:: 범위 1 prefixlen 10 inet6 주소::1 범위 0 prefixlen 128 제드 BP%
보시다시피 GNU inetutils 및 NET-3 네트워크 도구는 ifconfig
IPv6, 여러 주소와의 인터페이스 및 -l
.
IPv6의 문제점 중 하나는 도구 자체에 일부 코드가 누락되어 있다는 것입니다. 그러나 주된 이유는 Linux가 다른 운영 체제와 마찬가지로 인터페이스를 통해 ioctl()
IPv6 기능을 제공 하지 않는다는 것입니다. 프로그램은 네트워크를 통해 IPv4 주소를 보고 조작할 수만 있습니다 ioctl()
.
대신 Linux는 다른 인터페이스 send()
와 recv()
특별하고 다소 이상한 소켓 주소 제품군을 통해 이 기능을 제공합니다 AF_NETLINK
.
GNU 및 NET ifconfig
-3할 수 있다이 새로운 API를 사용하기 위해 조정이 이루어졌습니다. 이에 반대하는 주장은 다른 운영 체제로 이식할 수 없지만 이러한 프로그램은 실제로 작동한다는 것입니다.이미휴대용이 아님그래도그러니 논란의 여지가 없습니다.
그러나 그들은 조정되지 않았으며 오늘날까지 위에서 설명한 대로 유지됩니다. (일부 사람들은 수년에 걸쳐 다양한 지점에서 작업했지만 불행하게도 개선 사항은 프로그램에 통합되지 않았습니다. 예를 들면 다음과 같습니다. Bernd Eckenfels는 패치를 받지 못했습니다.ifconfig
패치가 작성된 지 4년 후, 일부 netlink API 기능이 NET-3 net-tools에 추가되었습니다. )
대신 일부는 ip
새로운 Linux API를 사용하고 다른 구문을 사용하고 세련된 인터페이스 뒤에 여러 가지 다른 기능을 결합하여 도구 세트를 명령으로 완전히 재창조합니다.command subcommand
ifconfig
FreeBSD의 명령줄 구문과 출력 스타일이 필요한 것이 있습니다 ifconfig
(GNU나 NET-3에도 없고 ifconfig
확실히 ip
없습니다). 그래서 하나 썼습니다. ifconfig
Linux에서 netlink API를 사용하여 작성할 수 있다는 증거 입니다.
그러므로 ifconfig
당신이 인용한 것과 같은 에 대해 받아들여진 지혜는 더 이상 사실이 아닙니다. 이것은지금은 진짜가 아니야" ifconfig
netlink를 사용하지 마십시오."라고 말합니다. 두 사람을 덮는 담요는 세 사람을 덮을 수 없습니다.
그것항상"netlink가 더 효율적이다"라고 말하는 것은 사실이 아닙니다. netlink를 사용하여 수행되는 작업의 경우 ifconfig
netlink API와 API 사이의 효율성에는 큰 차이가 없습니다 ioctl()
. 특정 작업에 대해 사람들은 거의 동일한 수의 API 호출을 수행합니다.
실제로 모든 API 호출은둘ioctl()
시스템의 시스템 호출이 아닌 netlink 사례 의 시스템 호출입니다. 틀림없이 netlink API의 단점은 많이 사용되는 시스템에서 도구가 API 호출 결과를 알리는 확인 메시지를 결코 받지 못할 가능성을 명시적으로 포함한다는 것입니다.
또한 ip
GNU 및 NET-3보다 "더 일반적" 이라고 말하는 것은 ifconfig
사실이 아닙니다 .넷링크를 사용하기 때문에. 별도의 프로그램이 필요한 하나의 대규모 프로그램에서 더 많은 작업을 수행할 수 있기 때문에 더욱 다재다능합니다.밖의 ifconfig
. 이러한 추가 작업을 수행하기 위해 내부적으로 API를 사용하는 것만으로는 더 다양해지지 않습니다. 이에 대해 API에는 고유한 내용이 없습니다. ioctl()
예를 들어, FreeBSD API를 사용하는 일체형 도구를 작성하고 이 도구가 , 및 명령만 사용하는 것보다 "더 일반적"이라고 똑같이 주장 ifconfig
할 route
수 arp
있습니다 ndp
.
netlink API를 사용하여 Linux용 route
, arp
및 명령을 작성할 수도 있습니다.ndp
추가 읽기
- 조나단 데보인 폴라드(2019).
ifconfig
. 스낵 가이드. 소프트웨어. - 에두아르도 페로(2009-04-16).ifconfig: 잘못된 IP 주소/초기 패치 보고. 데비안 버그 #359676.
답변2
ifconfig
우리가 많은 배포판에서 사용하는 표준은 다양한 이유로 더 이상 사용되지 않습니다. 실제로 오래되고 제한된 방식으로 커널과 대화하는 것은 더 이상 모든 네트워크 구성을 이해하지 못합니다. ifconfig
사용할 수 있는 것과 같은 특정 네트워크 구성은 조작할 수 없습니다 ip
. 또한 ifconfig
네트워크 네임스페이스에 대한 지원도 제한됩니다.
일화로 인터페이스 IP 별칭은 SuSE에서만 볼 수 ip
있고 SuSE에서는 볼 수 없다는 사실을 발견했습니다 ifconfig
.
이면의 차이점은 다음과 같습니다.ifconfig와 ip: 차이점은 무엇이며 네트워크 구성 비교
ip
언뜻 보면 다소 복잡해 보일 수도 있지만 기능은 ifconfig보다 훨씬 광범위합니다 . 이는 네트워크 스택의 두 계층, 즉 계층 2(링크 계층), 계층 3(IP 계층)으로 기능적으로 구성되며 net-tools 패키지에서 위의 모든 명령 작업을 수행합니다.
ifconfig
주로 시스템 인터페이스를 표시하거나 수정 하지만 이 명령은 다음 작업을 수행할 수 있습니다.
인터페이스 속성을 표시하거나 수정합니다.
ARP 캐시 항목을 추가 및 삭제하고 호스트에 대한 새 정적 ARP 항목을 생성합니다.
모든 인터페이스와 연관된 MAC 주소를 표시합니다.
커널 라우팅 테이블을 표시하고 수정합니다.
ifconfig와 고대 버전의 주요 차이점 중 하나는 후자는 네트워크 구성에 ioctl을 사용한다는 것입니다. 이는 커널과 상호 작용하는 덜 인기 있는 방법인 반면, 전자는 네트워크 구성에 netlink 소켓 메커니즘을 사용합니다. 보다 유연한 후속 버전은 커널과 사용자 공간 간의 ioctl 상호 통신을 위해 rtnetlink(네트워크 환경에서 작동하는 기능을 추가함)를 사용합니다.
netlink의 사용/이점에 관해: fromLJ - 커널 코너 - Netlink 소켓을 사용하는 이유와 방법
Netlink 소켓은 커널과 사용자 공간 프로세스 간에 정보를 전송하는 데 사용되는 특수한 유형의 IPC입니다. 표준 소켓 API와 커널 모듈의 특수 커널 API를 통해 사용자 공간 프로세스 간의 전이중 통신 링크를 제공합니다. Netlink 소켓은 AF_NETLINK 주소 계열을 사용합니다.
…
위 함수가 사용자와 커널 간의 통신을 위해 시스템 호출, ioctl 또는 proc 파일 시스템 대신 netlink를 사용하는 이유는 무엇입니까? 새로운 기능을 위해 시스템 호출, ioctl 또는 proc 파일을 추가하는 것은 쉽지 않습니다. 커널을 오염시키고 시스템을 불안정하게 만들 위험이 있습니다. 그러나 Netlink 소켓은 간단합니다. netlink.h에 상수(즉, 프로토콜 유형)를 추가하기만 하면 됩니다. 그러면 커널 모듈과 애플리케이션은 소켓 스타일 API를 사용하여 즉시 통신할 수 있습니다.
....
Netlink 소켓은 사용자 공간 응용 프로그램과 커널 모듈 간의 통신에 사용되는 유연한 인터페이스입니다. 애플리케이션과 커널에 사용하기 쉬운 소켓 API를 제공합니다. 전이중, 버퍼링된 I/O, 멀티캐스트 및 비동기 통신과 같이 다른 커널/사용자 공간 IPC에서는 사용할 수 없는 고급 통신 기능을 제공합니다.