ip vs ifconfig 명령 장단점


28

어느 시점에서 내가 만난 Linux의 일부 교재 (Linux Foundation의)에서 다음이 언급됩니다.

ip명령은 ioctl 시스템 호출 보다는 netlink 소켓을 ifconfig사용하기 때문에 보다 다양하고 효율적 입니다.

후드에서 무슨 일이 일어나고 있는지 이해할 수 없기 때문에 누구나 이것에 대해 조금 더 자세히 설명 할 수 있습니까?

추신 : 나는 그 도구 에 대해이 주제 를 알고 있지만 도구 작동 방식에 대한이 특별한 차이점을 다루지 않습니다.

답변:


39

ifconfigFreeBSD 및 OpenBSD와 같은 운영 체제 의 명령은 나머지 운영 체제와 함께 업데이트되었습니다. 요즘에는 해당 운영 체제에서 모든 종류의 네트워크 인터페이스 설정을 구성하고 다양한 네트워크 프로토콜을 처리 할 수 ​​있습니다. BSD는 ioctl()이러한 것들을 지원합니다.

이것은 Linux 세계에서는 발생하지 않았습니다. 오늘날 세 가지 ifconfig명령이 있습니다.

  • ifconfig에서 GNU의 inetutils
    jdebp % inetutils-ifconfig -l
    enp14s0 enp15s0 lo
    jdebp % inetutils-ifconfig lo
    lo 링크 encap : 로컬 루프백
          inet addr : 127.0.0.1 Bcast : 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
          수신 바이트 : 51214341 TX 바이트 : 51214341
    jdebp %
  • ifconfig에서 NET-3 그물 도구
    jdebp % ifconfig -l
    ifconfig : option --help '는 사용법 정보를 제공합니다.-l' not recognised.
    ifconfig:
    jdebp % ifconfig lo
    lo : flags = 73 <업, 루프백, 실행> mtu 65536
        inet 127.0.0.1 넷 마스크 255.0.0.0
        inet6 :: 1 prefixlen 128 scopeid 0x10 <호스트>
        inet6 :: 2 접두사 128 scopeid 0x80 <compat, global>
        inet6 fe80 :: prefixlen 10 scopeid 0x20 <링크>
        loop txqueuelen 1000 (로컬 루프백)
        RX 패킷 9087 바이트 51214341 (48.8 MiB)
        수신 에러 0 드롭 0 오버런 0 프레임 0
        TX 패킷 9087 바이트 51214341 (48.8MiB)
        TX 오류 0 삭제 0 오버런 0 캐리어 0 충돌 0
    jdebp %
  • ifconfignosh 툴셋 (버전 1.40) 에서
    jdebp % ifconfig -l
    enp14s0 enp15s0 lo
    jdebp % ifconfig lo
    봐라
        루프백 실행 연결
        링크 주소 00 : 00 : 00 : 00 : 00 : 00 bdaddr 00 : 00 : 00 : 00 : 00 : 00 
        inet4 주소 127.0.0.1 접두사 8 bdaddr 127.0.0.1 
        inet4 주소 127.53.0.1 접두사 8 bdaddr 127.255.255.255 
        inet6 주소 :: 2 범위 0 접두사 128 
        inet6 주소 fe80 :: 범위 1 접두사 10 
        inet6 주소 :: 1 범위 0 접두사 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 접두사 8 bdaddr 127.0.0.1 
        inet4 주소 127.1.0.2 접두사 32 bdaddr 127.1.0.2 
        inet4 주소 127.53.0.1 접두사 8 bdaddr 127.255.255.255 
        inet6 주소 :: 3 범위 0 접두사 128 
        inet6 주소 :: 2 범위 0 접두사 128 
        inet6 주소 fe80 :: 범위 1 접두사 10 
        inet6 주소 :: 1 범위 0 접두사 128 
    jdebp % 

보시다시피 GNU inetutils 및 NET-3 net-tools ifconfig는 IPv6과 관련하여, 여러 주소를 가진 인터페이스 및과 같은 기능과 관련하여 현저한 결함이 있습니다 -l.

IPv6 문제는 도구 자체에서 일부 누락 된 코드입니다. 그러나 기본적으로 Linux는 (다른 운영 체제와 마찬가지로) ioctl()인터페이스를 통해 IPv6 기능을 제공하지 않기 때문에 발생합니다 . 프로그램은 네트워킹을 통해서만 IPv4 주소를보고 조작 할 수 있습니다 ioctl().

리눅스가 아닌 다른 인터페이스를 통해이 기능을 제공 send()하고 recv(), 다소 이상한 소켓의 주소 패밀리를 특별한에, 그리고 AF_NETLINK.

는 GNU와 NET-3 ifconfig수있는 이 새로운 API를 사용하도록 조정되었습니다. 그렇게에 대한 인수는 다른 운영 체제에 이식 아니라고했지만,이 프로그램은 실제로 있었다 이미 이식 할 수 없습니다 어쨌든 그 많은 논쟁의이 없었다.

그러나 그들은 조정되지 않았으며 오늘날까지도 앞서 언급 한대로 남아 있습니다. (일부 사람들은 수년에 걸쳐 여러 시점에서 작업을했지만, 슬프게도 개선 된 점은 프로그램에 적용되지 않았습니다. 예를 들어 : Bernd Eckenfels는 NET-3 net-tools에 netlink API 기능을 추가 한 패치허용하지 않았습니다.ifconfig 패치가 작성된 후 4 년이 지났습니다.)

대신, 일부 사람들 ip은 새로운 Linux API를 사용 하는 명령으로 툴셋을 완전히 재창조 했으며, 다른 구문을 사용했으며, 유행 스타일의 인터페이스 뒤에 다른 여러 기능을 결합했습니다 .command subcommand

나는 필요 ifconfig은 FreeBSD의 명령 줄 구문 및 출력 스타일했다고 ifconfig합니다 (GNU 나 NET-3도가 ifconfig있으며, 이는 ip가장 확실하게해야하지 않습니다). 그래서 나는 썼다. ifconfigLinux에서 netlink API를 사용하는를 작성할 수 있다는 증거로 사용합니다.

그래서 ifconfig당신이 인용 한 것과 같은 에 대한 지혜가 더 이상 사실이 아닙니다. 이다 지금 사실 즉 ' ifconfig넷 링크 사용하지 않습니다. ". 2 개를 덮은 담요는 3 개를 덮지 않습니다.

항상하고있다 "넷 링크가 더 효율적이다"라는 말을 사실. 으로 수행하는 작업의 ifconfig경우 netlink API와 API 사이의 효율성과 관련하여 실제로 많은 것이 없습니다 ioctl(). 주어진 작업에 대해 거의 같은 수의 API 호출을 만듭니다.

실제로, 각 API 호출은 시스템에서 하나가 아니라 netlink 케이스에서 두 개의 시스템 호출입니다 ioctl(). 그리고 netlink API는 사용량이 많은 시스템에서 API 호출 결과를 알려주는 확인 메시지를 툴이 수신하지 못할 가능성을 명시 적으로 통합한다는 단점이 있습니다.

또한, 사실은 그 말을하는 것입니다 ip은 GNU보다 "더 융통성"이고 NET-3 ifconfig가 넷 링크 사용하기 때문에 . 하나의 큰 프로그램에서 다른 것 이외의 별도의 프로그램으로 수행하는 작업을 수행하므로 더 많은 작업을 수행하기 때문에 더 다양합니다 ifconfig. 추가 작업을 수행하기 위해 내부적으로 사용하는 API가 단순히 다재다능하지는 않습니다. 이에 대한 API 고유의 것은 없습니다. 하나는 FreeBSD를 사용하는 모든 기능을 하나의 도구를 쓸 수 ioctl()는 "보다 다양한"개인보다 것을 동일하게 상태를 예를 들어, API, 그리고 ifconfig, route, arp, 및 ndp명령.

하나는 쓸 수 route, arp그리고 ndp역시 넷 링크 API를 사용하여 Linux에서 사용하는 명령.

추가 자료


나는 당신이 "보다 다재다능한"주장을 너무 많이 읽고 있다고 생각합니다. IMHO는 ip모든 종류의 멋진 기능이 Linux에서 ioctl을 사용하는 것이 불가능하기 때문에 netlink가 더 다재다능 하다고 말합니다 .
TooTea

1
"netlink는 ip를보다 다양하게 만드는 것"은 "ip는 netlink를 사용하기 때문에보다 다목적으로 사용되는 것"과 동일 합니다 .
JdeBP

8

ifconfig많은 배포판에서 우리가 가진 표준 은 몇 가지 이유로 더 이상 사용되지 않습니다. 오래되고 제한적인 방식으로 커널과 대화하며 실제로 모든 네트워크 구성을 이해하지 못합니다. 사용할 수있는 ifconfig버전 과 같은 일부 네트워크 구성을 조작 할 수 없습니다 ip. 또한 ifconfig네트워크 네임 스페이스에 대한 지원이 제한됩니다.

일화적인 이야기로서, 나는 ipSuSE 에서만 보이지만 인터페이스 IP 별칭을 발견 했습니다 ifconfig.

후드의 차이점에 관해서 : ifconfig와 ip에서 : 차이점과 네트워크 구성 비교

하지만 ip첫 번째 사이트에서 조금 복잡한 것 같다하지만 ifconfig를보다 기능이 훨씬 더 넓다 수 있습니다. 이 기능은 네트워킹 스택의 두 계층 즉, 계층 2 (링크 계층), 계층 3 (IP 계층)으로 기능적으로 구성되며 net-tools 패키지에서 위에서 언급 한 모든 명령의 작업을 수행합니다.

ifconfig대부분 시스템의 인터페이스를 표시하거나 수정 하지만 이 명령은 다음 작업을 수행 할 수 있습니다.

  • 인터페이스 속성 표시 또는 수정

  • 호스트에 대한 새 정적 ARP 항목 작성과 함께 ARP 캐시 항목 추가, 제거

  • 모든 인터페이스와 관련된 MAC 주소를 표시합니다.

  • 커널 라우팅 테이블 표시 및 수정

고대 구성의 ifconfig와 구분되는 주요 특징 중 하나는 네트워크 구성에 ioctl을 사용한다는 점입니다. rtnetlink (네트워킹 환경 조작 기능을 추가 함)를 사용하여 커널과 사용자 공간 간의 상호 통신을위한 ioctl

넷 링크 사용 / 이점 정보 : LJ 에서-Kernel Korner-넷 링크 소켓을 사용하는 이유와 방법

Netlink 소켓은 커널과 사용자 공간 프로세스간에 정보를 전송하는 데 사용되는 특수 IPC입니다. 사용자 공간 프로세스를위한 표준 소켓 API와 커널 모듈을위한 특수 커널 API를 통해 두 가지간에 전이중 통신 링크를 제공합니다. Netlink 소켓은 주소 패밀리 AF_NETLINK를 사용합니다.

.....

위의 기능이 사용자와 커널 세계 간의 통신을 위해 시스템 호출, ioctl 또는 proc 파일 시스템 대신 netlink를 사용하는 이유는 무엇입니까? 새로운 기능을 위해 시스템 호출, ioctl 또는 proc 파일을 추가하는 것은 쉬운 일이 아닙니다. 커널을 오염시키고 시스템의 안정성을 손상시킬 위험이 있습니다. Netlink 소켓은 간단합니다. netlink.h에는 상수, 프로토콜 유형 만 추가하면됩니다. 그런 다음 커널 모듈과 응용 프로그램은 소켓 스타일 API를 사용하여 즉시 대화 할 수 있습니다.

....

Netlink 소켓은 사용자 공간 응용 프로그램과 커널 모듈 간의 통신을위한 유연한 인터페이스입니다. 응용 프로그램과 커널 모두에 사용하기 쉬운 소켓 API를 제공합니다. 다른 커널 / 사용자 공간 IPC에는없는 전이중, 버퍼 I / O, 멀티 캐스트 및 비동기 통신과 같은 고급 통신 기능을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.