IPv4ES the perfect solution to IPv6 adoption resistance

IPv4ES the ultimate solution combining best parts of the both worlds!

Initial worlds: I've seen so much denial and whining about IPv6. People just want IPv4 with more addresses. There's the solution.

People absolutely hate:

  • Colons and letters in the addresses.

  • Complex and long hex addresses (ie. letters) with colons.

Design goals:

  • Require minimal changes to the user interfaces and existing processing logic.

  • Keep the IPv4 address format, which is familiar and loved by users and administrators.

  • Use widely supported underlying stack allowing extremely fast adoption.

  • Extend the IPv4 style compatible address address space drastically.

How can we accomplish all that?

  • Address format is N.N.N.N, but with with 32 bit unsigned integers instead of old 8 bits. As result, we've got a plenty of address space.

  • Utilizing underlying widely supported technical networking stack with 128 bit address space of the box. Making adoption easy and fast.

Output from following Python class:

  • IPv6 ::1 as IPv4ES 0.0.0.1

  • IPv6 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff as IPv4ES 4294967295.4294967295.4294967295.4294967295

  • IPv4ES 255.512.65535.4294967295 as IPv6 0:ff:0:200:0:ffff:ffff:ffff

  • IPv6 2001:db8:dead:beef:cafe:bab3:1337:c0de as IPv4ES 536939960.3735928559.3405691571.322420958


The Python class including the address handler and conversion. This is a light PoC so there's no proper exception handling and or validation. All inputs to the class are expected to be mostly valid.


from ipaddress import ip_address, IPv6Address

from binascii import hexlify, unhexlify


class IPv4ES():

""" The IPv4ES Extended Space Python class """


def v6_to_v4es(self, addr):

""" Transform IPv6 to IPv4ES """

a = addr.exploded.replace(':', '')

es = []

for offset in range(0, 32, 8):

seg = unhexlify(a[offset:offset + 8])

es.append(str(int.from_bytes(seg, 'big')))

return '.'.join(es)


def v4es_to_v6(self, addr):

""" Transform IPv4ES to IPv6 """

v6 = []

for seg in addr.split('.'):

v6_seg = hexlify(int(seg).to_bytes(4,'big')).decode()

v6 += [v6_seg[-8:-4], v6_seg[-4:]]

return ':'.join(v6)


def __init__(self, addr):

self.es_addr = 'Init'

if type(addr) is str:

if '.' in addr:

self.es_addr = addr

elif ':' in addr:

self.es_addr = self.v6_to_v4es(ip_address(addr))

else:

raise ValueError('Only IPv4ES or IPv6 addresses are supported')

elif type(addr) is IPv6Address:

self.es_addr = self.v6_to_v4es(addr)

else:

raise ValueError('Only IPv4ES or IPv6 addresses are supported')


def __repr__(self):

return self.es_addr

def as_v6(self):

return ip_address(self.v4es_to_v6(self.es_addr))


if __name__ == '__main__':


def self_test(addr):

es = IPv4ES(addr)

if ':' in addr:

print('IPv6', addr, 'as IPv4ES', es)

assert(str(es.as_v6()) == addr)

else:

print('IPv4ES', addr, 'as IPv6', es.as_v6())

assert(str(es) == addr)


# Light self-test and demonstration

self_test('::1')

self_test('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')

self_test('255.512.65535.4294967295')

self_test('2001:db8:dead:beef:cafe:bab3:1337:c0de')

Slogan, sometimes you'll need just a silly solution for bonkers people.

Post scriptum: Any feedback is appreciated, feel free to send feedback, ideas and suggestions. - Thank you