Just about all of the world's HTTP communication is carried over TCP/IP, a popular layered set of packet-switched network protocols spoken by computers and network devices around the globe. A client application can open a TCP/IP connection to a server application, running just about anywhere in the world. Once the connection is established, messages exchanged between the client's and server's computers will never be lost, damaged, or received out of order. [1]
[1] Though messages won't be lost or corrupted, communication between client and server can be severed if a computer or network breaks. In this case, the client and server are notified of the communication breakdown.
Say you want the latest power tools price list from Joe's Hardware store:
http://www.joes-hardware.com:80/power-tools.html
When given this URL, your browser performs the steps shown in Figure 4-1 . In Steps 1-3, the IP address and port number of the server are pulled from the URL. A TCP connection is made to the web server in Step 4, and a request message is sent across the connection in Step 5. The response is read in Step 6, and the connection is closed in Step 7.
HTTP connections really are nothing more than TCP connections, plus a few rules about how to use them. TCP connections are the reliable connections of the Internet. To send data accurately and quickly, you need to know the basics of TCP. [2]
[2] If you are trying to write sophisticated HTTP applications, and especially if you want them to be fast, you'll want to learn a lot more about the internals and performance of TCP than we discuss in this chapter. We recommend the "TCP/IP Illustrated" books by W. Richard Stevens (Addison Wesley).
TCP gives HTTP a reliable bit pipe . Bytes stuffed in one side of a TCP connection come out the other side correctly, and in the right order (see Figure 4-2 ).
TCP sends its data in little chunks called IP packets (or IP datagrams ). In this way, HTTP is the top layer in a "protocol stack" of "HTTP over TCP over IP," as depicted in Figure 4-3 a. A secure variant, HTTPS, inserts a cryptographic encryption layer (called TLS or SSL) between HTTP and TCP ( Figure 4-3 b).
When HTTP wants to transmit a message, it streams the contents of the message data, in order, through an open TCP connection. TCP takes the stream of data, chops up the data stream into chunks called segments, and transports the segments across the Internet inside envelopes called IP packets (see Figure 4-4 ). This is all handled by the TCP/IP software; the HTTP programmer sees none of it.
Each TCP segment is carried by an IP packet from one IP address to another IP address. Each of these IP packets contains:
An IP packet header (usually 20 bytes)
A TCP segment header (usually 20 bytes)
A chunk of TCP data (0 or more bytes)
The IP header contains the source and destination IP addresses, the size, and other flags. The TCP segment header contains TCP port numbers , TCP control flags, and numeric values used for data ordering and integrity checking.
A computer might have several TCP connections open at any one time. TCP keeps all these connections straight through port numbers .
Port numbers are like employees ' phone extensions. Just as a company's main phone number gets you to the front desk and the extension gets you to the right employee, the IP address gets you to the right computer and the port number gets you to the right application. A TCP connection is distinguished by four values:
<source-IP-address, source-port, destination-IP-address, destination-port>
Together, these four values uniquely define a connection. Two different TCP connections are not allowed to have the same values for all four address components (but different connections can have the same values for some of the components ).
In Figure 4-5 , there are four connections: A, B, C and D. The relevant information for each port is listed in Table 4-1 .
Table 4-1. TCP connection values | ||||
Connection | Source IP address | Source port | Destination IP address | Destination port |
A | 209.1.32.34 | 2034 | 204.62.128.58 | 4133 |
B | 209.1.32.35 | 3227 | 204.62.128.58 | 4140 |
C | 209.1.32.35 | 3105 | 207.25.71.25 | 80 |
D | 209.1.33.89 | 5100 | 207.25.71.25 | 80 |
Note that some of the connections share the same destination port number (C and D both have destination port 80). Some of the connections have the same source IP address (B and C). Some have the same destination IP address (A and B, and C and D). But no two different connections share all four identical values.
Operating systems provide different facilities for manipulating their TCP connections. Let's take a quick look at one TCP programming interface, to make things concrete. Table 4-2 shows some of the primary interfaces provided by the sockets API. This sockets API hides all the details of TCP and IP from the HTTP programmer. The sockets API was first developed for the Unix operating system, but variants are now available for almost every operating system and language.
Table 4-2. Common socket interface functions for programming TCP connections | |
Sockets API call | Description |
s = socket(<parameters>) | Creates a new, unnamed, unattached socket. |
bind(s, <local IP:port>) | Assigns a local port number and interface to the socket. |
connect(s, <remote IP:port>) | Establishes a TCP connection to a local socket and a remote host and port. |
listen(s,...) | Marks a local socket as legal to accept connections. |
s2 = accept(s) | Waits for someone to establish a connection to a local port. |
n = read(s,buffer,n) | Tries to read n bytes from the socket into the buffer. |
n = write(s,buffer,n) | Tries to write n bytes from the buffer into the socket. |
close(s) | Completely closes the TCP connection. |
shutdown(s,<side>) | Closes just the input or the output of the TCP connection. |
getsockopt(s, . . . ) | Reads the value of an internal socket configuration option. |
setsockopt(s, . . . ) | Changes the value of an internal socket configuration option. |
The sockets API lets you create TCP endpoint data structures, connect these endpoints to remote server TCP endpoints, and read and write data streams. The TCP API hides all the details of the underlying network protocol handshaking and the segmentation and reassembly of the TCP data stream to and from IP packets.
In Figure 4-1 , we showed how a web browser could download the power-tools.html web page from Joe's Hardware store using HTTP. The pseudocode in Figure 4-6 sketches how we might use the sockets API to highlight the steps the client and server could perform to implement this HTTP transaction.
We begin with the web server waiting for a connection ( Figure 4-6 , S4). The client determines the IP address and port number from the URL and proceeds to establish a TCP connection to the server ( Figure 4-6 , C3). Establishing a connection can take a while, depending on how far away the server is, the load on the server, and the congestion of the Internet.
Once the connection is set up, the client sends the HTTP request ( Figure 4-6 , C5) and the server reads it ( Figure 4-6 , S6). Once the server gets the entire request message, it processes the request, performs the requested action ( Figure 4-6 , S7), and writes the data back to the client. The client reads it ( Figure 4-6 , C6) and processes the response data ( Figure 4-6 , C7).