内容原创,未经本人同意请勿转载。联系本人:jianshu_kevin@126.com
拥塞窗口(congestion window, cwd)
顾名思义,拥塞窗口就是用来避免网络拥塞而设计的一个针对发送方保存的一个变量,是指发送方允许向网络发送的数据量。tcp在发送数据时不是随意发送的,要根据拥塞窗口来确定当前的可发送数据的大小。
初始拥塞窗口大小
初始拥塞窗口在RFC2581
中有明确的定义:
- 不超过发送放的2*MSS
- 不得超过两个TCP包
发送过程中的窗口变化(建议后面再看)
慢启动
当网络状况不好的情况下,为了避免网络状态进一步恶化,而采取的一种减少数据发送的一种策略。
慢启动门限值(ssthresh)
拥塞避免
系统采用满启动后,随着网络状况好转,如果发送方数据持续发送,那么数据量会越来越大。拥塞窗口CWD
会不断变大,为了避免数据量过大,就需要采取拥塞避免。
快速重传
快速重传用在网络状态有差变好的情况下。当发送方收到一个无序的确认报文后,就立即发送重复确认,为的是让对方早点知道有报文没有到达,而不是超时等待后再重传。
快速重传算法规定,当发送方收到连续的三次重复确认,就立即发送对方没有收到的报文段,而不必等待重传超时到期。
快速恢复
当接收方收到3次重复确认后,说明网络状况变好了,没有必要采用慢启动算法
,直接采用快速恢复。快速恢复和满启动的区别就是可以发送的数据量不同
。
RTT(Round Trip Time)
网络往返时间,等于一个数据包收到ACK-发送时的时间。
Nagle算法
防止小报数据,大量传输引起网络过载,因为即使1个字节的数据+头也得有41个字节了。所以为了避免小包数据,该算法采用了如下步骤避免这种情况:
- 缓冲区数量达到一定的上限才发送
- 等待了一段时间(200ms),才启动发送
socket接口有TCP_CORK选项开关Nagle算法
on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 */
立即/捎带/延迟 ACK
立即ACK
需要满足以下条件:
- 状态为SYN_SENT
- 接收到FIN包
- 整个数据包都在pcb->recv_nxt,立即发送dupack
- 接收到数据包长度为0
延迟ACK
接收到的数据不满足立即ACK
条件,就会将TF_ACK_DELAY
置位,等待到时发送延迟ACK
捎带ACK
在延迟ACK
到达之前,如果上层有数据要发送,那么就会将ACK
捎带在数据中发送,称为捎带ack