第三章 TCP协议详解
3.1 TCP服务的特点
- 面向连接: 通信双方必须先建立连接才能进行通信
- 字节流: 与UDP的基于数据报不同, 应用程序对数据的发送和接收没有边界限制. 具体来讲, 发送端和接收方各自维护缓存区, 两端执行的读写操作没有数量关系.
- 可靠传输: 采用应答机制和超时重传机制, 保证数据被接收方收到.
3.2 TCP头部
- 序号: 报文段中携带数据的编号, 具体值为ISN(初始序号值) + 数据部分第一字节在字节流中的偏移
- 确认号: 用于确认对数据的接收, 其值为收到的报文段序号的值+1
- 头部长度: 以4字节为单位, 因此头部最长为(2^4 - 1) * 4 = 60 字节
- 窗口大小: RWND接收窗口的大小, 用于进行流量控制
- 校验和: 采用CRC算法对整个TCP报文段进行校验
- 紧急指针: 也可称为紧急偏移, 是一个正的偏移量, 与序号相加表示紧急数据结束的位置(紧急数据最后一字节的下一字节序号)
3.3 TCP连接的建立与关闭
三次握手
同步报文段发起连接: 主机A发送带有
SYN标志和A端初始序号
的报文段到主机B同步报文段同意连接: 主机B接收后返回带有
SYN标志, B端初始序号以及确认号
的报文段到主机A确认第二个同步报文段: 主机A向主机B发送第二个同步报文段的确认报文段
四次挥手
第一个结束报文段: 主机A发送带有FIN标志的结束报文段
主机B确认第一个结束报文段
第二个结束报文段: 主机B发送带有FIN标志的结束报文段
主机A确认第二个结束报文段
注:
服务端和客户端都可以主动结束连接
第一个确认报文段的必要性:
半关闭状态
TCP连接是全双工的, 双方都可以接发数据. 双方也都可以主动发送结束报文段表示数据发送结束, 但另一方依旧可以继续发送数据(以及接受确认报文段), 直至另一方也发送结束报文段结束TCP连接, 这种状态就是半关闭状态. 不过, 使用半关闭状态的程序比较少见.
连接超时
建立连接时, 若发起方未收到确认报文段, 则会先尝试多次重连. 发送间隔为2^n, 即1s, 2s, 4s, 8s, 16s…. 具体重连次数由内核定义.
3.4 状态转移
粗虚线表示典型的服务端连接的状态转移; 粗实线表示典型的客户端连接的状态转移.
补充:
正常的由客户端发起的四次挥手是 ESTABLISHED→ FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT; FIN_WAIT_1状态时, 服务端的状态时CLOSE_WAIT; FIN_WAIT_2 相当于半关闭状态.
若FIN_WAIT_1状态的客户端直接收到带有ACK信息的结束报文段 (不进行第二次挥手而直接第三次挥手), 则可直接转到TIME_WAIT状态
同时关闭: 客户端主动关闭连接进入到FIN_WAIT_1后, 也收到了服务端的主动关闭连接报文段, 则发送ACK报文段, 然后进入CLOSING, 收到ACK后也转移到TIME_WAIT
TIME_WAIT状态的意义:
可靠地结束TCP连接: 要保证 第四次挥手的确认报文段能够被对方接收
保证让迟来的TCP报文段有足够的时间被识别和丢弃: 让应用程序保持对端口的占用, 避免在连接完全结束前被其他应用程序使用.
3.5 复位报文段
某些情况下, TCP一端会向另一端发送带有RST标志的复位报文段, 以通知对方关闭或重新建立连接:
- 访问不存在的端口(或该端口仍被处于TIME_WAIT状态的连接占用): 第一次握手指向的端口不存在, 则返回一个带有
RST标志, 接收窗口为0
的确认报文段 - 异常终止连接: 发送复位报文段后, 发送端所有等待发送的数据将被丢弃
- 处理半打开连接: 当一端系统关闭或异常终止连接, 而另一端没有接收到结束报文段, 则另一端处于半打开状态. 若此时另一端继续尝试往这个半打开状态的连接写入数据, 则对方会回应一个复位报文段
3.6 TCP交互数据流
TCP报文段根据携带数据长度分为 交互数据
和 成块数据
交互数据仅包含很少的字节, 对实时性要求高, 如ssh, telnet
成块数据的长度通常为TCP报文段允许的最大数据长度, 对传输效率高, 如ftp
- 当发送大量大块数据时, 发送方会连续发送多个TCP报文段
3.8 带外数据??????
有些传输层协议具有带外(Out Of Band, OOB)数据的概念, 用于迅速通告对方本段发生的重要事件. 因此带外数据比普通数据有更高的优先级, 总是被立即发送.
- UDP没有实现带外数据传输;
- 而TCP利用头部的紧急指针标志
URG
和紧急指针来模拟
3.9 TCP超时重传
TCP模块为每个TCP报文段都维护了一个重传定时器, 当超过时间未收到确认报文段, 则重新发送报文段, 每次重传超时时间都会增加一倍, 直至放弃连接.
3.10 拥塞控制
拥塞控制能够提高网络利用率, 包含四个部分:
慢启动
拥塞避免
快速启动
快速恢复
- 拥塞控制的最终受控变量是发送窗口(SWND)即发送端向网络一次连续写入的数据量(报文段数量)
- 为了实现拥塞控制, 发送端引入一个拥塞窗口(CWND)的状态变量. 实际的SWND是RWND和CWND的较小值
慢启动和拥塞避免
- 慢启动: 每接收到一个报文段的确认, 就CWND增加一个该报文段的数据大小
- 慢启动使得CWND能够指数型增加, 但这很可能导致网络拥塞, 因此TCP还定义了一个重要的状态变量 - 慢启动门限, 当CWND超过该值时, 进入拥塞避免状态.
- 拥塞避免状态使得CWND能够线性增加, 有如下两种实现方式:
法一是根据时间线性增加
法二的公式等价于$ \frac{SMSS}{CWND/SMSS} $, 可以近似理解为, 收到当前所有发出的报文段才使CWND+1个SMSS
拥塞的发生包含两种情况:
- 传输超时, 即TCP重传定时器溢出 → 慢启动和拥塞避免
此时, 更新状态变量: $ ssthresh =max(FlightSize / 2, 2*SMSS) $, $ CWND<= SMSS $
- 接收到重复的确认报文段 → 快速重传和快速恢复
如果该情况发生在传输超时之后, 则也被当做第一种情况对待.
快速重传和快速恢复
- Title: 第三章 TCP协议详解
- Author: Huan Lee
- Created at : 2023-08-20 07:07:53
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/20/notion-第三章 TCP协议详解-c14662ea/
- License: This work is licensed under CC BY-NC-SA 4.0.