目录
- 一些常识
- 状态机
- ack
- 滑动窗口
- 拥塞窗口和慢启动
- 快速恢复和快速重传
- SACK
一些常识
- MAC头14字节
- IP首部:20字节+option
- TCP头:20字节+option(klv格式,toa,mss,win,sack等)
- UDP头:8字节
- MTU:网络层最大传输单元
- MSS:最大分段长度(TCP的syn包中传递,防止底层分片)
- MSL:报文最大生存时间
状态机
握手
挥手
ack
- server端准备发送的数据包可以和ack一起发送(接受延迟的ack,最大200ms,可以通过TCP_NODELAY关闭)
- 不必每个数据包都回ack,可以发一个累积的ack
滑动窗口
- 发送方不必把整个窗口一口气发送完
- 窗口大小由接收端通告
- PUSH标记:通知接收端,传输层别再攒包了,一口气全上送应用层。
拥塞窗口和慢启动
- 拥塞窗口:cwnd
- 慢启动:slow start,“慢”是相对于整个滑动窗口一波流而言,
- 慢启动阈值:ssthresh = 拥塞时cwnd的一半
- 发送方取得滑动窗口 = MIN(拥塞窗口,接收端通告窗口)
当发生网络拥塞(cwnd = 32)时(定时器超时,没有收到确认),cwnd= 1,进入慢启动,cwnd *= 2,呈指数增长,直到ssthresh = 16, 进入拥塞避免,cwnd += 1.
快速重传和快速恢复
- 一旦接收端收到一个乱序的报文,立即发送一个重复ack出去,不要再延时确认, 如果连续收到3个重传的ack,发送端就知道网络拥塞了,立即重传,不要等超时定时器了。
- 快速恢复:不想进入慢启动突然降低窗口大小,发送端收到3次重复ack后,ssthresh = cwnd/2 , cwnd = sstresh + 3,然后每次收到一个重复的ack时,cwnd+=1,一旦收到确认新数据的ack时,cwnd = ssthresh。
SACK
可选择的确认,告诉发送方,哪些报文需要重传,而不是全部重传,导致窗口迅速减少。