TCP报文详解
TCP是一个可靠地传输协议,为了保证TCP的可靠性,也导致TCP头部很复杂。

根据上图,自上而下排序:

1.源端口:16比特,源端口范围 1024-65535 随机选择一个作为源端口

2.目的端口:16比特,目的端口范围在 0-65535 之间,具体要根据当时应用。如果是telnet,那么目的端口就是23

3.序号:占4个字节,是本报文段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而起数据供100字节,则下一个报文段的序号就是400;
4.确认序号:占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;
   由于序号字段有32比特长,可以对4GB的数据进行编号,这样就可保证当序号重复使用时,旧序号的数据早已在网络中消失了;


5.数据偏移字段
 数据偏移:占4比特,表示数据开始的地方离TCP报文段的起始处有多远。这实际上就是TCP报文段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。


6.保留字段: 6比特,供今后使用,目前置为0。
  6个比特的控制字段:

 (1)紧急比特URGent:当URG=1时,表明此报文应尽快传送,字段配合使用,而不要按原来的排队顺序来传送。与“紧急指针”字段配合使用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长;
 (2)确认比特ACK:只有当ACK=1时,确认序号字段才有意义;
 (3)急迫比特PSH:当PSH=1时,表明请求远地TCP将本报文段立即传送给其应用层,而不要等到整个缓存都填满了之后再向上交付。
 (4)复位比特ReSeT:当RST=1时,表明出现严重差错,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个非法的报文段或拒绝打开一个连接;
 (5)同步比特SYN:在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1。因此,SYN=1表示这是一个连接请求或连接接受报文,而ACK的值用来区分是哪一种报文;
 (6)终止比特FINal:用来释放一个连接,当FIN=1时,表明欲发送的字节串已经发完,并要求释放传输连接;
窗口字段


7.窗口Window:占2字节,表示报文段发送方的接收窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你能够发送的数据的字节数至多是此窗口的大小。”
 (1)通知窗口advertised window:接收端根据其接收能力许诺的窗口值,是来自接收端的流量控制。接收端将通知窗口的值放在TCP报文的首部中,传送给对方。
 (2)拥塞窗口congestion window:是发送端根据网络拥塞情况得出的窗口值,是来自发送端的流量控制。
 检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,由发端计算和存储,由收端进行

8.校验码:16比特头部校验,计算TCP头部的完整性以及证明数据段的有效性。

9.紧急指针:16比特紧急指针,当URG比特位取值1,此段才有意义。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长;

10.可选项:0个或者是N个32比特=4byte,最大可选项大小只能是40byte。具体根据可选项内容来定,