TCP-报文结构
TCP提供一种面向连接的、全双工的、可靠的字节流服务。
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
TCP的接收端必须丢弃重复的数据。
TCP对字节流的内容不作任何解释。对字节流的解释由TCP连接双方的应用层解释。
TCP通过下列方式来提供可靠性:
- 应用数据被分割成TCP认为最适合发送的数据块,称为报文段或段。
- TCP协议中采用自适应的超时及重传策略。
- TCP可以对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- TCP的接收端必须丢弃重复的数据。
- TCP还能提供流量控制。
TCP报文段格式
- 源端口和目的端口:各占2个字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口实现
- 序号字段:占4字节。TCP连接中传送到数据流中的每一个字节都编上一个序号。序号字段的值则是指的是本报文段所发送的数据的数据的第一个字节的序号
- 确认号字段:占4字节。是期望收到对方下一个报文段的数据的第一个字节的序号
- 数据偏移:占4位。它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。
- 保留字段:占6位。保留为今后使用,但目前应置为0
- 紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
- 确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效
- 复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接
- 同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。
- 终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接
- 窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
- 校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
- 紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
- 选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
- 填充字段:这是为了使整个首部长度是4字节的整数倍
TCP首部的主要选项
最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度
窗口扩大因子,用于长肥管道
时间戳,可用于测量往返时延RTT
TCP的数据编号与确认
TCP是面向字节的。TCP将所要传送的报文看成是字节组装成的数据流,并使每一个字节对应一个序号。
在连接建立时,双方都要商定初始序号。TCP每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。
TCP的确认是接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号+1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。
为了提高效率,TCP可以累计确认,即在接收多个报文段后,一次确认。