# Evaluation of Modern Internet Transport Protocols over GEO Satellite Links
## 3 Modern Internet Transport Protocols
### Evolution of HTTP Protocols  
The Hyper Text Transfer Protocol (HTTP) is an application-layer protocol that was originally designed in the 1990s to transfer web pages between Internet hosts. The first version of the protocol (HTTP/1.0) worked over TCP but it required a new transport-level connection for each HTTP request. It soon evolved into HTTP/1.1 which allowed reusing the same TCP connection to fetch multiple web objects such as HTML pages, embedded images, scripts, etc. Also, it allowed the client to send multiple requests back-to-back (pipelining) without waiting for the server's response for each request. This reduced the latency of downloading web pages especially under high traffic load. Since then, HTTP/1.1 had become the de facto web standard for more than 20 years with only minor enhancements [3]. The complex composition of today's web content has uncovered many of HTTP/1.1 shortcomings. First, the protocol uses text-based headers and messages which creates a lot of chatter between endpoints. This adds a significant overhead in the processing of these protocol messages especially in high-demand servers. Second, persistent TCP connections consume the server resources even when the clients are idle. Also, pipelining of requests often runs into the head of line blocking (HoLB) problem which occurs when a high priority object is delayed by a low priority one or when packets arrive out of order [20]. The lack of a multiplexing layer has caused web clients to open multiple parallel connections, usually up to eight, to the same server in order to speed up the download of the different objects that compose the web page. However, this decreases network efficiency because TCP does not share congestion control across multiple connections. On the server side, web providers often use optimization workarounds to improve HTTP/1.1 speed. For example, so-called _domain sharding_ is used to distribute web contents across many server sites to reduce server load. Also, the concept of _image sprites_, which is a collection of multiple images aggregated in one file, is utilized to reduce embedded images' load times [20; 21]. HTTP/2 was developed and finalized in 2015 to overcome the problems of HTTP/1.1 while maintaining the original HTTP semantics, messages and status codes [21]. At its core, HTTP/2 uses a more efficient binary encoding of the header fields instead of the original plain text headers of HTTP/1.1. In HTTP/2 terminology, a _stream_ is a flow of bytes, with a unique identifier and a priority, which may carry one or more messages. A _message_ is a logical HTTP message, such as a request, or a response, which consists of one or more binary _frames_. For example, one frame could be carrying the HTTP header and another frame could be carrying the message payload, etc. All communication is performed over a single TCP connection that can carry any number of bidirectional streams. Frames from different streams can be interleaved and then reassembled at the receiver using the stream identifier embedded in the header of each frame as illustrated in Figure 3. This ability to interleave frames from different streams allows HTTP/2 to multiplex several requests and responses in parallel, and hence avoids the HoLB issue in HTTP/1.1. However, it does not eliminate the HoLB problem at the transport layer, because all streams are eventually multiplexed in one TCP byte stream [21]. Figure 3: An example of stream multiplexing in HTTP/2. There are other features in HTTP/2 such as stream prioritization and server push mechanisms which allow the server to open additional streams in order to send objects that may be requested later without being explicitly requested by the client. Finally, there are some TCP enhancements that were proposed in order to improve the performance of HTTP/2. For example, TCP Fast Open introduced a cookies-based mechanism in order to authenticate the client with the server from the first connection.