Adding :face: to every IP: Celebrating IPv6's one-year anniversary

Paul Saab

One year ago, Facebook joined several other major Internet companies to adopt IPv6 in support of the World IPv6 Launch. This was a particularly big milestone for the Internet because without IPv6, the number of people and devices connecting to the Internet cannot continue to grow. By creating new addresses, IPv6 is helping us keep Facebook (and the Internet) fast, responsive, and reliable.

At Facebook, we've been delighted with the adoption of IPv6 and the amount of growth we've seen in the last year. When we launched, slightly under 1% of our users were using IPv6 to stay connected on Facebook and today, over 4% of our users access Facebook via IPv6. As more and more devices connect to the Internet every day, we believe supporting IPv6 will continue to be important for providing access for everyone.

Building on the success of supporting IPv6 for people using Facebook, we've also been working to adopt IPv6 internally. As our own infrastructure grows, we will need more IP addresses in order to add more servers and in turn, build new features and improvements to our users' ability to connect with the world. In preparation for this, we are building support for IPv6 throughout our network.

IPv6 allows for more flexibly in our network designs. More and more future hardware designs will communicate using IP addresses, and there just aren't enough available with IPv4. We believe in solving a problem before it becomes a problem, and by working on this before we completely run out of addresses, we're able to take a more phased approach to transitioning our network to IPv6.

But most excitingly, moving to IPv6 also lets us answer the question, "Now that there are effectively infinite IP addresses available to us, what would we do differently?"

To get us here, we're working through some challenges that will make our software compatible with IPv4 and IPv6. Most software written in recent times has not had to worry about IPv6, and just assumes everything is IPv4. This usually means you need two sockets to accept connections from both IPv4 and IPv6 clients. IPv6 sockets can technically support connections from IPv4 clients, but it is considered harmful to implement IPv6 in this way (see here). We need to make it so that our software can intelligently select IPv4 or IPv6 when it needs to make a request to other systems over the network.

In addition, we have to account for the fact that IP addresses are not just integers. Since IPv4 is 32bits, an IPv4 address can be converted to an integer and then subnetted and subjected to various IP address mathematics. Also, IPv6 addresses can't easily be compared as strings due to the multiple ways every operating system chooses to implement rfc5952, which defines the IPv6 text representation. Storage for IP addresses can also be an issue, depending on string length and binary representation.

Because IPv6 adoption is still growing, we sometime run into bugs and scaling issues because of a lack of large-scale usage and testing. Our amazing network engineering team has been working tirelessly to go from no IPv6 support 2+ years ago to having full IPv6 support down to every host in our network. We are working with vendors in the industry to make IPv6 support ubiquitous and ensure that the Internet (and access to it) keeps growing. We hope you will join us in supporting IPv6.

Paul Saab is an infrastructure engineer who has many :face:'s.

Keep Updated

Stay up-to-date via RSS with the latest open source project releases from Facebook, news from our Engineering teams, and upcoming events.

Subscribe
Facebook © 2017