The Internet Protocol (IP) is the layer that gives the internet its name: it carries blocks of data, called datagrams, from one host to another across any number of interconnected networks. It is specified in RFC 791, “Internet Protocol” (September 1981), edited by Jon Postel and prepared by USC’s Information Sciences Institute for DARPA. The specification opens by stating that IP “provides for transmitting blocks of data called datagrams from sources to destinations, where sources and destinations are hosts identified by fixed length addresses.”
IP is connectionless and unreliable by design. As RFC 791 puts it, “the internet protocol provides no reliability, flow control, or sequencing” and is “limited in scope to provide the functions necessary to deliver a package of bits (an internet datagram) from a source to a destination.” There are no acknowledgments, no retransmissions, and no guarantee that datagrams arrive in order or at all. This minimalism is deliberate: it keeps routers simple and pushes the work of building reliable communication out to the endpoints, an instance of the end-to-end principle.
Two mechanisms defined by IP are addressing and fragmentation. Each datagram carries a source and destination IP address, the numeric labels that routing uses to forward packets toward their destination. When a datagram is too large for a particular network’s maximum packet size, IP can break it into fragments that are reassembled at the destination; RFC 791 specifies that the protocol “also provides for fragmentation and reassembly of long datagrams, if necessary, for transmission through small packet networks.”
IP is often described as the narrow waist of the internet. A great diversity of physical networks sits below it and a great diversity of transport protocols and applications sits above it, but nearly everything passes through the single, simple IP datagram in the middle. Because every device agrees on this one common format, networks built from entirely different hardware can interoperate. The protocol’s job is intentionally small: address a packet, and make a best effort to deliver it.