窗口:
tcp从客户端每次发送一次数据服务器返回一个确认,这样效率非常的低,所以就有窗口这个概念,每一次最大报文段长度(mss)都是1024,设定窗口为2048的话第一次发送1024(1~1024)后不等他的确认,再次发送1024(1025~2048),而后服务端一次性确认之前的数据,ack序号为2049(之前总量加1,也就是下次的开始号),这个节省了开销,增加了网络的吞吐量。
两种窗口:
服务端和客户端都有流量控制,服务端有接收窗口(rwnd),算出窗口大小加在TCP的首部窗口大小中,由于rwnd对网络无影响,这里主要讨论客户端的流量控制,拥塞窗口(cwnd)。
TCP真正的发送窗口为接受窗口和拥塞窗口的最小值。
两种重传情况:
1.(发多了)比如窗口为6倍1024,但是服务端只能接受4份1024,所以他的确认序号为4097,当客户端搜到三次这个确认序号的时候,才知道自己发多了,之前发出去的5,6份需要重发,或者说补发。
2.(超时或者发丢了)比如从第一份发送成功,但是第二份和第三份丢失,剩下的三分成功,对于服务器来说他只会确认第一份的数据,所以ack序号为1025,当客户端在指定(RTO)时间都没有收到第二份的确认的时候它才知道它的报文段丢失了,所以它需要从1025开始重发。(重复确认应答)
慢启动:
客户端的拥塞窗口进过一次RTT后,也就是收到一次ACK后拥塞窗口就翻倍,也就是指数型增长。
阀值作用:
使正在进行慢启动的拥塞窗口到达阀值后就成线性增长,当然对拥塞避免阶段没用。
两种重传情况下阈值和拥塞窗口的变化不一样:
1.(发多了)先把阈值设置为拥塞窗口一半,再把拥塞窗口设置为阈值大小,拥塞窗口为指数增加(慢启动阶段,虽然有慢字,但是是指数型增长,一点不慢)。
2.(超时或者发丢了)先把阈值设置为拥塞窗口一半,拥塞窗口为一,拥塞窗口为线性增加(拥塞避免阶段)。