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