A third performance issue is the overall communication code path through the socket layer, TCP/IP stack, link layer, and network interface. The socket layer is not necessarily tailored to the needs of Web servers. Researchers have modified existing socket APIs or implemented new APIs with Web servers in mind [10].
Some commercial operating systems provide interfaces specifically for Web servers. In particular, Windows NT provides interfaces eliminating redundant system calls: AcceptEx() and TransmitFile(). In addition to other benefits, these interfaces aggregate several system calls, reducing the code path between the Web server and TCP/IP stack. For example, AcceptEx() combines accepting a new connection, reading the request data, and obtaining peer address information, eliminating system calls and redundant socket layer code. Likewise, TransmitFile() combines reading data from the file system and writing header and data to the socket, also eliminating system calls.
In addition to socket layer optimizations, the TCP/IP stack has also been improved for Web server workloads. For example, TCP/IP implementations have been redesigned to efficiently manage short-lived connections [11]. Commercial operating systems have also been optimized for short-lived connections, improving management of TCP control blocks and sockets in the TIME_WAIT TCP/IP state.
The network interface hardware and corresponding driver are other key places for optimizations in the communication code path. For the purposes of this paper, we hold the network interface and driver implementations fixed when comparing servers on the same operating system. For completeness, it should be noted that network interfaces and their drivers can have a significant impact on performance. ``Smart'' network interface cards with on board processors are capable of coalescing interrupts, offloading fragmentation, checksum computation, and higher level TCP/IP processing such as connection establishment [12].