源端口和目的端
- 源端口、目的端口,各2个字节,每个TCP报文段都包含源端口号和目的端口号,用来寻找发送端和接收端的应用进程;
- 序号,4个字节,32位的无符号数,用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如一段报文的序号字段值是301 ,而携带的数据共有100字段,显然下一个报文段(如有)的数据序号应该从401开始。
- 确认号,4个字节,是期望收到对方下一个报文的第一个数据字节的序号,因此确认序号应当是上次已成功收到数据字节序号加1。
- 数据偏移(首部长度),4位,指出TCP报文的数据距离TCP报文段的起始处有多远,也就是数据部分payload相对于整个报文段的起始位置的偏移量,以4字节为一个单位计量首部的长度。需要这个值是因为选项字段的长度是可变的,由于这个字段占4位,因此TCP首部最多为60字节。如果没有选项字段,正常的长度是20字节;
- 保留,6位,保留以后使用,但目前应都为0;
- 紧急URG,1位,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
- 确认ACK,1位,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
- 推送PSH,1位,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
- 复位RST,1位,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
- 同步SYN,1位,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
- 终止FIN,1位,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
- 窗口,2字节,当接收方收到TCP报文段时,它会根据自身处理能力和缓冲区的剩余空间确定一个窗口大小。这个窗口大小会被通知给发送方,发送方会根据该窗口大小来限制发送数据的量;
- 检验和,2字节,校验和覆盖了整个的TCP报文段,包含TCP首部、TCP伪首部和TCP数据。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证;
- 紧急指针,2字节,只有当URG标志位置1时紧急指针才有效。紧急指针的值是一个相对于序列号的偏移量。具体而言,紧急指针指示了紧急数据段的最后一个字节的位置。在该位置之前的数据被认为是紧急数据,具有更高的优先级,需要尽快处理;
- 选项,长度是可变的,最长可达到40字节。提供了一种扩展TCP功能和灵活性的机制。它允许TCP协议在标准首部之外传递额外的控制信息。选项字段由多个选项组成,每个选项都具有自己的格式和目的。选项字段的存在使得TCP可以进行更多的协商和配置,以满足特定的需求和优化网络性能。以下是一些常见的TCP选项:
15.1 最大报文段长度(Maximum Segment Size,MSS):用于指定通信双方所支持的最大报文段大小,从而帮助确定每个TCP报文段的尺寸。
15.2 窗口扩大因子(Window Scale):用于扩大接收方窗口的规模,以支持更大的窗口大小。
15.3 时间戳(Timestamps):用于实现时钟同步和测量往返时间(RTT),以帮助调整拥塞窗口的大小。
15.4 选择确认(Selective Acknowledgment,SACK):允许接收方向发送方指示已经正确接收的数据段范围,从而提供更有效的重传机制。
15.5 延迟确认(Delayed Acknowledgment):用于延迟发送确认,以减少网络中的确认流量。
15.6 其他扩展选项:还有其他一些扩展选项,如前向重传、快速重传等,用于改善TCP协议的性能和可靠性。
选项字段的使用是基于协商和双方的支持。在TCP三次握手过程中,通信双方可以交换选项信息,并在连接建立时进行协商。通过使用选项字段,TCP可以根据具体需求进行灵活配置和优化,从而提高网络效率和可靠性。