TCP段结构
注:
- SYN表示建立连接,FIN表示关闭连接,ACK表示响应,RST表示连接重置。
- 序列号: 序列号指的是segment中第一个字节的编号,而不是segment的编号。 建立TCP连接时,双方随机选择序列号
- ACKs: 希望接收到的下一个字节的序列号
累计确认:该序列号之前的所有字节均已被正确接收到
TCP可靠数据传输概述
-
TCP采用了累积确认的方式,这类似于GBN,即如果TCP发送了对某个序号N的确认,则表明在N之前的所有字节流都已经被正确接收。但是另一方面,TCP又不会像GBN协议那样简单丢弃失序到达的报文段,而是会将它们缓存起来,但是这些被缓存的报文段不会逐个被确认。当发生超时时,TCP只会重传发生超时的那一个报文段。
-
TCP还允许接收方选择性的确认失序到达的分组,而不是累积的对最后一个确认最后一个正确到达的分组,将它与TCP所采取的选择重传结合起来看就很想选择重传协议的工作机制。因此说TCP的差错恢复结合了GBN和选择重传。
TCP重传示例
TCP流量控制
- 接收方为TCP连接分配buffer
- 上层应用可能处理 buffer中数据的速度较慢,引入流量控制,使上层tcp中的buffer不会溢出
- Receiver通过在Segment 的头部字段将RcvWindow 告诉Sender
- Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲 RcvWindow尺寸
TCP连接管理
Three way handshake:(建立连接)
-
Step 1: client host sends TCP SYN segment to server
specifies initial seq #
no data -
Step 2: server host receives SYN, replies with SYNACK segment
server allocates buffers
specifies server initial seq. # -
Step 3: client receives SYNACK, replies with ACK segment, which may contain data
Closing a connection:
client closes socket: clientSocket.close();
-
Step 1: client向server发送TCP FIN 控制segment
-
Step 2: server 收到FIN, 回复ACK. 关闭连接, 发送FIN.
-
Step 3: client 收到FIN, 回复ACK.
进入“等待” –如果收到FIN,会重新发送ACK -
Step 4: server收到ACK. 连接关闭.
TCP client lifecycle&TCP server lifecycle
TCP拥塞控制
当网络拥塞时数据报不能及时被转,在分组转发网络中,数据报就会被排队,甚至出现丢包因此说网络拥塞会带来网络销:
- 引入大的排队时延
- 当数据报被丢失时发送方必须重传,因此引入了重传开销
- 当数据报被丢失时,丢失路由器的上游路由器做的工作都变成了无用功
慢启动
原理:当连接开始时,指数性增长
加性增—乘性减: AIMD
原理:逐渐增加发送速率,谨慎探测可用带宽,直到发生loss
- Additive Increase: 每个RTT将CongWin增大一个MSS——拥塞避免
- Multiplicative Decrease: 发生loss后将CongWin减半
注:MSS(Maximum Segment Size)(最大报文段长度)
Q:何时应该指数性增长切换为线性增长(拥塞避免)?
A:当CongWin达到Loss事件前值的1/2时
Threshold变量
Loss事件发生时, Threshold 被设为Loss事件前CongWin 值的1/2。
Loss事件的处理:
- 3个重复ACKs:
CongWin切到一半
然后线性增长 - Timeout事件:
CongWin直接设为1个 MSS然后指数增长
达到threshold后, 再线性增长
注:3个重复ACKs表示网络还能够传输一些 segments,timeout事件表明拥塞更为严重。
TCP拥塞控制总结
- When CongWin is below Threshold, sender in slow-start phase, window grows exponentially.
- When CongWin is above Threshold, sender is in congestion-avoidance phase, window grows linearly.
- When a triple duplicate ACK occurs, Threshold set to CongWin/2 and CongWin set to Threshold.
- When timeout occurs, Threshold set to CongWin/2 and CongWin is set to 1 MSS.