文章目录
- 1. TCP可靠传输
- 2. TCP流量控制
- 3. TCP拥塞控制
1. TCP可靠传输
网络层:提供尽最大努力交付,不可靠传输。
传输层:使用TCP实现可靠传输
可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
TCP可靠传输机制:
-
校验:与UDP校验一样, 增加伪首部
-
序号:一个字节占用一个序号,TCP序号字段指的是一个报文段第一个字节的序号。
-
确认:接受方收到发送方发送的报文后,回返回一个报文用作确认(这个报文可以带数据,称为捎带应答),这个回复报文首部确认字段是收到报文序号的下一个
TCP使用累计确认机制,确认报文的字段是TCP接收方最近需要接受的字段
eg:
设黄色报文段丢失,绿色报文段正常接受,TCP确认报文确认号字段为4 -
重传:确认重传二者联系紧密,TCP在一段时间(重传时间)没有收到确认报文就要重传刚刚发送的报文。
TCP采用自适应算法动态改变重传时间RTTS(加权平均往返时间)的方法。
冗余ACK:(快重传) 每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
发送方已发送1,2,3,4,5报文段 接收方收到1,返回给1的确认(确认号为2的第一个字节) 接收方收到3,仍返回给1的确认(确认号为2的第一个字节) 发送方收到2个对于报文段1的冗余ACK 认为2报文段丢失,重传2号报文段﹐快速重传
2. TCP流量控制
流量控制:让发送方慢点,要让接收方来得及接收。
TCP使用滑动窗口机制来实现流量控制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小。
即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
eg:
TCP在建立连接时,主机B会通过确认报文,告知A自己的接受窗口大小(设为400)。发送端会调整自己的发送窗口大小为这个大小也为400字节。同时设一个报文段长100字节。滑动窗口过程如下图:
上图接受方进行了三次流量控制,发送方的发送窗口从400->300->100->0
仔细分析上图,当B主机发送响应报文,设置了自己的接受窗口大小为0后,主机A会调整自己的发送窗口为0。
此后,A主机需要等待B发送响应报文,通知其修改自己的发送窗口,继续发送数据。而B需要等待A主机发送数据后才可以发送响应报文。这样就构成了类似死锁的现象。
为了解决这个问题:
- TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
- 若持续计时器设置的时间到期,就发送一个窗口探测报文段。接收方收到探测报文段时给出现在的窗口值。
3. TCP拥塞控制
出现拥塞的条件:对资源需求的总和>可用资源
资源:网络带宽,交换机数据缓存等
网络中有许多资源同时呈现供应不足导致网络性能变坏,最终网络吞吐量将随输入负荷增大而下降。
TCP拥塞控制:为了避免过多的数据注入网络中。
注意区分流量控制和拥塞控制:
- 拥塞控制针对的是网络全局上,流量控制针对的只是针对发送方和接受方(点对点)
- 拥塞是因为网络上很多主机都在发送数据,导致拥塞。而流量控制是因为接受方上层来不及处理发送方 发送的数据。
这里为了方便分析,假设:
-
数据单方向传送,而另一个方向只传送确认。(无捎带应答)
-
接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度。
因为:发送窗口=min(接收窗口rwnd,拥塞窗口cwnd)
接受窗口:接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。
拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
慢开始,拥塞避免:
ssthresh:慢开始的阻塞窗口到这个位置增长速度减慢。由慢开始过渡到拥塞避免
如果网络发生阻塞,阻塞窗口重置为1,重新开始慢开始,ssthresh减小为发生阻塞时的阻塞窗口值的一半。
之后的过程继续重复即可。
快重传,快恢复:
快重传:因为TCP采用累计确认机制,所以如果收到多个重复的确认报文(冗余ACK),可以确认这个确认数据流ack字节之后的报文数据丢失。需要重传一次。
当收到冗余ACK时,重发报文后进行快恢复,拥塞窗口大小不是直接重置到1,而是直接将新拥塞窗口大小设置为冗余ACK时的拥塞窗口大小的一半(新ssthresh值)(快恢复)。
TCP Tahoe版本废弃,了解即可。