目录
TCP协议全称"传输控制协议(Transmission Control Protocol)", 人如其名, 要对数据的传输进行一个详细的控制.
下来按照"安全"和"性能"两方面介绍TCP的机制. 安全和性能, 追求一个服务端和客户端双方都能接受的一个平衡点(一味的追求性能, 则不够安全;一味的追求安全则性能不够好)
保证"安全"的机制:
1. 确认应答机制
2. 超时重传机制
3. 流量控制机制(针对的是"接收端缓冲区"的安全)
4. 拥塞控制机制(针对的是"发送端"的安全)
保证"性能"的机制:
1. 滑动窗口(针对的是"发送端"的性能)
2. 捎带应答机制
3. 延迟应答机制
1. 确认应答机制(ACK机制)
如上图, 主机A每传输一个数据, 主机B收到了都会进行回复, 主机B确认了这个消息, 才能往下发下一条消息. 这是一个串型的过程, 是一个确认应答的机制.
TCP将每个字节的数据都进行了编号, 即为序列号
每个序列号对应每个确认序列号
每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据, 下一次你从哪里开始发
2. 超时重传机制
如上图, 主机A发送数据给主机B之后, 可能因为网络拥堵等原因, 数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重新发送.
但是, 主机A未收到主机B发来的确认应答, 也可能是因为ACK丢失了
因此主机B会收到很多重复数据, 那么TCP协议需要能够识别出哪些包是重复的包, 并且把重复的包丢弃掉.
这时候我们可以利用在确认应答机制提到的序列号, 因为每个数据都有自己的编号, 就可以很容易做到去重的效果.
那么, 如果超时的时间如何确定呢?
最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返回". 但是这个时间的长短, 随着网络环境的不同, 是有差异的.
如果超时时间设的太长, 会影响整体的重传效率; 如果超时时间设的太短, 有可能会频繁发送重复的包.
TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.
Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍.
如果重发一次后, 仍然得不到应答, 等待2*500ms后再进行重传; 如果仍然得不到应答, 等待4*500ms进行重传, 依次类推, 以指数形式递增.