TCP传输大致过程

- 在传输过程中,若服务器端没有要发送到客户端的数据(或数据还没准备好,发送缓冲区为空),此时,如果收到C端发送过来的字节数据,返回的TCP报文段只包含一个TCP首部;
- 发送方只有收到接收方返回的TCP报文段(根据ack字段的值),才会将发送方的发送缓冲区中的已接收的字节数据清除;
- 双方通信过程中,接收窗口的大小会变化(因为当接收缓冲区内的数据未被上层取走时,下次能接收的数据就会相应变小),因此,发送窗口的大小也要随之改变;
- 服务器端可对接收的多个TCP报文段进行累积确认(虽然各个报文段可能是乱序到达,但是会按顺序先存放在接收缓冲区,确保最后交给应用层是有顺序的);
- 当接收缓冲区满时应尽快交付给上层,但并不是得满才交付,实际上只要确保交给上层是有序的即可;
- 捎带确认:当接收方有待发送数据时(即发送缓冲区不为空),如果收到发送方发送的TCP报文段,会立即返回ACK段(ACK字段值为1)并捎带数据返回给发送方;
- 超时重传:当发送方发送一个报文段就会启动一个对应计时器,若传输过程中该报文段丢失或者接收方返回的ACK段丢失,计时器会超时重传对应TCP报文段;
推迟确认机制:1、TCP规定,收到一个TCP报文段,如果在0.5秒内有多个报文段到达,可累积确认收到;2、如果接收方有数据需要发送,则立即返回ACK段并捎带确认;3、如果连续收到两个长度为MSS的报文段,则立即返回ACK段确认收到。
注意:以上图为例,序号6的TCP报文段丢失,采用推迟确认机制的话,接收方最后会返回的ACK段(ack=6),发送方收到该ACK段会持续等待,直到序号6的报文段对应计时器超时重传,序号6之后的其他计时器也随之超时重传。
这会导致:1、当出现报文段丢失时,必须等计时器超时才会重传,时间相对较长;2、虽然采用累积确认,但是之后的那些序号会被重复传送,冗余。
解决:快重传机制。
- 快重传机制(冗余ACK):接收方每收到一个TCP报文段,就立即返回一个ACK段,即使收到的报文段是一个失序的报文段,也要立即返回ACK段。当发送方连续收到3个冗余ACK段(只有失序的报文段返回的才是冗余的ACK段,虽然5返回的ack=6,但它不是冗余ACK段)时,不必等待计时器超时,会立即重传该确认号对应的报文段。
TCP流量控制
通过滑动窗口机制实现。接收方在ACK报文段中设置接收窗口rwnd大小,发送方根据该大小动态调整,避免接收方的缓冲区溢出。
具体内容可点击之前的文章查看,与文章中请求重传协议那部分基本一样,只要知道滑动窗口的机制就简单明了了。
TCP拥塞控制
如果发送方正确收到所有报文段的确认,认为此时网络通畅;如果收到冗余ACK,则认为此时网络有点拥塞;如果出现报文段丢失超时现象,则认为网络严重拥塞。TCP采用多种算法避免网络拥塞。
拥塞窗口(cwnd):表示发送方在未收到确认(ACK)的情况下可以发送的最大数据量,单位为最大报文段长度(MSS,太网中 MSS=1460 字节)。
TCP发送方在确定发送窗口(swnd)时,取拥塞窗口(cwnd)与接收方接收窗口(rwnd)中的最小值。
拥塞避免算法:
慢启动:
- cwnd的初始值置为1个MSS,发送方每收到已发送报文段的确认ACK就翻倍cwnd的值;
- 为避免cwnd增长过快而引起拥塞,发送方需设置一个慢开始阈值(ssthresh),在慢启动阶段,当cwnd的值增长大于等于ssthresh的值,cwnd的增长方式将改为拥塞避免;
- 当检测到严重拥塞时,会更新ssthresh的值为检测到严重拥塞时的cwnd的一半并将cwnd的值置为1,重启慢启动过程。
拥塞避免:
- 当cwnd的值等于ssthresh值时,启动拥塞避免过程;
- 在每个往返时延RTT内,只要收到确认的ACK(即使多个),cwnd的值线性增加1;
- 只要出现确认超时现象,就认为网络严重拥塞,更新ssthresh的值并将cwnd的值置为1,重新进入慢启动过程。
对于采用快重传机制,连续收到三个冗余ACK,TCP认为此时有点拥塞,处理没有那么严格,采用快速重传快速恢复。
快速重传快速恢复:
- 快速重传:重传序号为冗余序号的TCP报文段;
- 快速恢复:更新ssthresh的值为收到三个冗余ACK时的cwnd的值的一半,并重新进入拥塞避免过程。
拥塞控制总结:
初始时cwnd=1,执行慢启动过程,当cwnd=ssthresh时,执行拥塞避免过程;
在拥塞避免过程中,如果出现连续收到三个冗余ACK,则执行快速重传快速恢复过程,并再次执行拥塞避免;
在拥塞避免过程中,如果出现超时重传现象,则执行慢启动过程。
当网络出现拥塞时(有点拥塞或者严重拥塞),都需要更新ssthresh值为出现拥塞时cwnd值的一半。





