TCP协议基础与可靠传输机制

TCP协议基础与可靠传输机制 一、TCP协议概述TCPTransmission Control Protocol传输控制协议是传输层最重要的协议之一。正如其名TCP的核心使命是对数据的传输进行精细化控制确保数据能够可靠、有序、无差错地到达目的地。与UDP的无连接、不可靠传输不同TCP通过一系列复杂的机制在不可靠的IP网络之上构建了一条可靠的逻辑通信信道。二、TCP协议段格式TCP报文段由首部Header和数据Payload两部分组成。理解TCP首部各字段的含义是掌握TCP工作原理的基础。2.1 关键字段详解字段长度说明源/目的端口号各16位标识数据从哪个进程来到哪个进程去32位序列号Seq32位标识本报文段发送的数据的第一个字节的序号32位确认号Ack32位期望收到对方下一个报文段的第一个数据字节的序号4位首部长度4位表示TCP头部有多少个32位字4字节最大值为15因此首部最大长度为60字节6位标志位6位URG、ACK、PSH、RST、SYN、FIN见下文16位窗口大小16位接收方告诉发送方自己的接收缓冲区还剩多少空间16位校验和16位CRC校验覆盖首部和数据两部分16位紧急指针16位标识紧急数据的末尾位置选项最多40字节如窗口扩大因子、时间戳等2.1.1 4位首部长度数据偏移要点说明单位基本单位是4字节32位不是1字节取值范围[0, 15]实际字节范围[0, 60] 字节最小值5即 5 × 4 20字节标准报头无选项时最大值15即 15 × 4 60字节含40字节选项计算方式实际报头长度 4位值 × 4为什么这样设计因为TCP报头长度必须是4字节的整数倍方便内存对齐。2.2.2 两个经典问题问题a报头和有效载荷如何分离答通过 4位首部长度 字段读取该字段值 × 4 报头总长度从报文开头跳过该长度后面就是数据问题b如何交付给上层哪个进程答通过 16位目的端口号操作系统根据目的端口号找到对应的进程将数据交付给该进程2.2 六大标志位URG紧急紧急指针是否有效用于发送紧急数据ACK确认确认号是否有效建立连接后所有报文都应置1PSH推送提示接收端立即将数据从缓冲区交给应用层RST复位要求重新建立连接用于异常情况的连接重置SYN同步请求建立连接携带SYN的报文称为同步报文段FIN结束通知对方本端要关闭连接携带FIN的报文称为结束报文段2.3 窗口大小发送端构建的报文信息都是给对方的TCP是全双工通信双方既是发送端也是接收端我发送报文时报头中的窗口大小字段填的是我的接收窗口这个信息是告诉对方我还能接收多少对方收到后就知道自己最多还能发多少双方互相告知互相配合实现流量控制三、确认应答ACK机制TCP可靠传输的基石是确认应答机制。TCP将每个字节的数据都进行了编号这个编号就是序列号Sequence Number。核心逻辑发送方发送数据时TCP首部中的序列号字段填入该报文段第一个字节的序号接收方收到数据后返回ACK报文确认号字段填入期望收到的下一个字节的序号发送方收到ACK后就知道哪些数据已被成功接收可以继续发送后续数据3.1 序列号的作用TCP将每个字节的数据都进行了编号 序列号序列号不仅用于排序更重要的是消除重复通过序列号识别重复的数据包按序重组接收方根据序列号将乱序到达的报文重新排序确认定位确认号明确告知发送方我收到了哪些接下来要什么四、超时重传机制网络环境复杂数据包可能因网络拥堵等原因丢失。TCP通过超时重传机制保证可靠性。4.1 两种丢包场景场景一数据包丢失主机A发送数据给B之后可能因为网络拥堵等原因数据无法到达主机B如果主机A在一个特定时间间隔没有收到B发来的确认应答就会进行重发场景二ACK丢失因此主机B会收到很多重复数据那么TCP协议需要能够识别初那些包是重复的包并且把重复的丢弃掉这时候我们可以利用前面提到的序列号就可以很容易的做到去重的效果。在这两种情况下发送方都会在超时后重传数据。接收方通过序列号识别出重复的数据包直接丢弃只向应用层交付一份。4.2超时时间的动态计算超时时间RTO, Retransmission Timeout的设置至关重要太长影响重传效率降低吞吐量太短频繁发送重复包造成网络拥塞TCP采用自适应算法动态计算RTOLinux实现以500ms为一个单位进行控制超时时间都是500ms的整数倍指数退避首次超时等待500ms第二次等待2×500ms第三次4×500ms以此类推连接终止累计到一定重传次数后TCP认为网络或对端异常强制关闭连接这种指数退避策略避免了在网络拥塞时继续加重负担给网络恢复留出时间。