Figure 14 shows a typical (and minimum length) TCP/IP datagram header. The header size is 40 bytes: 20 bytes of IP and 20 of TCP. Unfortunately, since the TCP and IP protocols were not designed by a committee, all these header fields serve some useful purpose and it's not possible to simply omit some in the name of efficiency.
Figure : Fields that change during a TCP connection
However, TCP establishes connections and, typically, tens or hundreds of packets are exchanged on each connection. How much of the per-packet information is likely to stay constant over the life of a connection? Half - the shaded fields in figure 4. So, if the sender and receiver keep track of active connections and the receiver keeps a copy of the header from the last packet it saw from each connection, the sender gets a factor-of-two compression by sending only a small (* 8 bit) connection identifier together with the 20 bytes that change and letting the receiver fill in the 20 fixed bytes from the saved hader.
One can scavenge a few more bytes by see how fields changes during a TCP connection life time. If the sender keep a copy of the last packet sent for each connection, it then can figure out what fields change in the current packet, and send a bitmask indicating what changed followed by the changing fields. If the sender only sends fields that differ, this scheme gets the average header size down to around ten bytes. For more detail discussion about this matter see [Jacobson 90].