TCP协议原理
TCP 报文
报文封装
报文结构
源端口和目标端口
每个 TCP 报文段都包含源主机和目标主机的端口号,用于寻找发送端和接收端应用线程,这两个值加上 I P 首部中的源 I P 地址和目标 I P 地址就能确定唯一一个 TCP 连接。
序号
序号字段用来标识从 TCP发送端向 TCP 接收端发送的数据字节流, TCP 协议会对发送或者接收的数据进行编号(按字节的形式),那么使用序号对每个字节进行计数,就能很轻易管理这些数据。序号是 32 bit的无符号整数。
首部长度
首部长度字段占据 4bit空间,它指出了 TCP 报文段首部长度,以字节为单位,最大能记录 15*4=60 字节的首部长度
标志字段
- URG:首部中的紧急指针字段标志,如果是 1 表示紧急指针字段有效。
- ACK:首部中的确认序号字段标志,如果是 1 表示确认序号字段有效。
- PSH:该字段置一表示接收方应该尽快将这个报文段交给应用层。
- RST:重新建立 TCP 连接。
- SYN:用同步序号发起连接。
- FIN:中止连接。
窗口大小
TCP 的流量控制由连接的每一端通过声明的窗口大小来提供,窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的数据序号,发送方根据窗口大小调整发送数据,以实现流量控制。窗口大小是一个占据 16 bit空间的字段,因而窗口最大为 65535 字节,当接收方告诉发送方一个大小为 0 的窗口时,将完全阻止发送方的数据发送
校验和
检验和覆盖了整个的 TCP 报文段:TCP 首部和 TCP 数据区域,由发送端计算和填写,并由接收端进行验证。
紧急字段
只有当 URG标志置 1 时紧急指针才有效,紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。简单来说,本 TCP 报文段的紧急数据在报文段数据区域中,从序号字段开始,偏移紧急指针的值结束
选项字段
kind=2,最大报文段长度(MSS)选项
TCP连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节
kind=3,窗口扩大因子选项
TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。
假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位。