woonizzooni

IPv4 네트워크 접두어 길이 구하기 = CIDR Prefix Length 구하기 본문

Programming/Java

IPv4 네트워크 접두어 길이 구하기 = CIDR Prefix Length 구하기

woonizzooni 2019. 6. 13. 15:40

 

CIDR (Classless Inter-Domain Routing)

https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing

IPv4 CIDR blocks

 

subnetmask입력시 prefix legnth를 구해본다. (CIDR계산 방법 이해 전제하에 작성함)

ex) subnetmask가

 - "255.255.255.0"이면 24반환

 - "299.255.255.0"이면 throws UnknownHostException

 - "255.255.241.0"이면 -1반환 (비정상 subnetmask)

    public int convertNetmaskToPfxLength(String subnetmask) throws UnknownHostException {
        InetAddress netmask = InetAddress.getByName(subnetmask);
        byte[] netmaskBytes = netmask.getAddress();
        int pfxLength = 0;
        boolean zero = false;
        for (byte b : netmaskBytes) {
            int mask = 0x80;
            for (int i = 0; i < 8; i++) {
                int result = b & mask;
                if (result == 0) {
                    zero = true;
                } else if (zero) {
                    return -1;
                } else {
                    pfxLength++;
                }
                mask >>>= 1;
            }
        }
        return pfxLength;
    }

 

이번에는 반대로 prefix length로 subnetmask 문자열을 표시해본다.

ex) 0이면 255.255.255.255

    -1이면 'invalid prefixLength" exception

     24면 255.255.255.0

    public InetAddress convertPrefixLengthToNetmask(int prefixLength) throws UnknownHostException {
        if (prefixLength > 32 || prefixLength < 0) {
            throw new IllegalArgumentException("Invalid prefixLength");
        }

        int mask = 0xffffffff << 32 - prefixLength;
        byte[] netmaskBytes = new byte[] { (byte) (mask >>> 24), (byte) (mask >> 16 & 0xff),
                                           (byte) (mask >> 8 & 0xff), (byte) (mask & 0xff) };

        return InetAddress.getByAddress(netmaskBytes);
    }

 

이해를 돕고자 참고 링크 하나 더 추가. (앞 2개 박스는 결과로, Binary는 bit shift 및 masking에...)

https://kb.wisc.edu/page.php?id=3493

 

어라 정리하다보니...

 

IPv4/IPv6 다 지원하는 오픈소스SW가 있네. 더 시간이 남아도는 사람들은 참고해보자.

https://seancfoley.github.io/IPAddress/

https://github.com/seancfoley/IPAddress

 

 

Comments