TCP header is usually 20 bytes unless options are present. Maximum header length is 60 bytes. A typical TCP header contains the following:
– Source Port (16 bits)
– Destination Port (16 bits)
– Sequence bits (32 bits)
– Acknowledgement Number (32 bits) **
– Header Length (4 bits)
– Reserved (4 bits)
– ECE **
– ACK **
– Window size (16 bits) **
– TCP Checksum (16 bits)
– Urgent Pointer (16 bits)
– Options (variable)
The items with ** refer to data flowing from receiver to sender.
The rest of the items are from the sender to the receiver.
Source port and destination port are the ports used in the communications.
Sequence number identifies the byte in the stream of data. TCP numbers each byte of data. The sequence number is a 32 bit unsigned integer that loops around. Initial sequence number is often picked randomly.
Acknowledgement number is the next byte that the receiver is expecting.
Header length is between 20 bytes and 60 bytes.
CWR – Congestion Window Reduced (the sender reduced its sending rate)
ECE – ECN Echo (the sender received an earlier congestion notification)
URG, ACK, PSH, RST, SYN and FIN are explained in the TCP Flags post in my earlier blog.
Window size is the number of bytes starting with the acknowledgement number that the receiver is willing to accept. Since it’s 16 bits, it limited in size to 65,535 bytes.
TCP Checksum contains header and data checksum.
Urgent pointer is only valid if URG bit is set. This “pointer” is a positive offset that must be added to the Sequence Number field of the segment to yield the sequence number of the last byte of urgent data.
Options – Most common option is MSS or maximum segment size.
Each end of a connection normally specifies this option on the first segment it sends (the ones with the SYN bit field set to establish the connection).
The MSS option specifies the maximum-size segment that the sender of the option is willing to receive in the reverse direction.
(Some of the material above is from Richard Stevens book TCP/IP Illustrated, Volume 1)