1. 注意:一般提到“发送窗口”(send window)时,我们指的不是SND.WND,而是SND.UNA+SND.WND-SND.NXT。但是提到“接收窗口”(receive window)时,我们指的就是RCV.WND。(见3.2节)
2. 一个ACK被接受当且仅当 SND.UNA < SEG.ACK =< SND.NXT。
3. 一个数据报文段被接受的条件:
报文 接收
长度 窗口 测试条件
------- ------- -------------------------------------------
0 0 SEG.SEQ = RCV.NXT
0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0 0 not acceptable
>0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
4. 在提到MSL的选取时,Jon写道:"For this specification the MSL is taken to be 2 minutes. This is an engineering choice, and may be changed if experience indicates it is desirable to do so." 读懂了这句话,就不难理解缺省的MSS(536)以及fast retransmit中的dupACK(3)这种"engineering choice"了,从而也不难理解为什么Dave Clark那句"rough consensus & running code"会成为Internet社区的经典了。
5. 在SYN_SENT状态,如果一个RST确认了先前发出的SYN,那它就是合法的。在其它状态,一个RST合法当且仅当它的序号在接收窗口内。
6. 对RST的反应:如果当前是在LISTEN状态,不理它;如果当前是在(从LISTEN进入的)SYN_RCVD状态,返回LISTEN状态;其它情况,进入CLOSED状态。
On Modeling Feedback Congestion Control Mechanism of TCP...
On Modeling Feedback Congestion Control Mechanism of TCP using Fluid Flow Approximation and Queueing Theory
作者将TCP主机和网络(路由器)看作是相互作用的两种动态系统,主机通过分组丢失率来调整窗口大小,网络通过负载大小来调整分组丢失率。对于TCP主机,作者改了一下文献中的一个模型;对于路由器,作者假设其为M/M/1/m(他使用符号m而不是通常的K)系统。作者希望导出能够描述单一瓶颈链路情况下TCP瞬态特性的结果。
RFC 2581
1. terms
SMSS:发送者准许传输的最大报文大小,不包括TCP/IP头部。
RMSS:接收者愿意接收的最大报文大小,不包括TCP/IP头部(MSS,OR 536)。
rwnd:最近通告的接收者窗口。
cwnd: current_snd_seq <= min(cwnd,rwnd)+ highest_snd_seq
IW:三次握手之后发送者的窗口大小
LW(LOSS WINDOW):重传定时器溢出之后的拥塞窗口大小
RW(RESTART WINDOW):TCP在一个闲期之后重新开始传输数据时的拥塞窗口大小FLIGHT SIZE:已发送但未确认的数据大小
2. a TCP sender may be more conservative, but MUST NOT be more aggressive than RFC2581!
3. slow start & congestion avoidance (MUST be used)
IW<=2*SMSS
(1) cwnd < ssthresh ==> slow start
(2) cwnd > ssthresh ==> congestion avoidance
(3) cwnd = ssthresh ==> either
slow start: 对每个ACK,cwnd增加量最多为SMSS;直到(2)(或(3))或者拥塞出现。
congestin avoidance: 对每个不重复的ACK,cwnd += SMSS*SMSS/cwnd 直到拥塞出现。
重传定时器溢出: ssthresh = max(FlightSize/2,2*SMSS) 注意不是cwnd。重传了丢失的报文后,cwnd MUST <= LW = SMSS,即重新进入慢启动。
4. fast retransmit & fast recovery (SHOULD be used)
对每一个乱序报文,接收者都SHOULD马上发送一个dupACK。对每一个填充了待确认的序列空间中一个“缺口”的报文,接收者都SHOULD马上发送一个ACK。
快速重传: 4个identical ACKs挨个到达 ==> 重传,并进入快速恢复。
(1). ssthresh = max(FlightSize/2,2*SMSS)
(2). 重传,cwnd = ssthresh +3
(3). 对每个dupACK,cwnd += SMSS,此时,窗口大小允许的话发送一个报文。
(4). 当确认了新数据的ACK到达时,cwnd <== ssthresh,即进入拥塞避免。
5. TCP进入闲期之后若用户突然又有大量数据要发送,则cwnd那么多的数据会以线速涌向网络。JAC88提出在一个相对长的闲期之后TCP应该返回慢启动状态。其实现如下:(按:本文在这里的描述好像将几个“发送”写成了“接收”?见JAC88:p22。不过作者好像说的是某些实际的实现,并且说这样不照。总之从我的角度看,说的不太清楚)若TCP在一个往返时间内没有收到任何报文段,则令RW=TW。附JAC88的实现:当有一个报文要发送时,如果(1)此前发送的报文都已经被确认了(2)上一次发送报文的时间距今已超过当前的rto,则认为这是一个闲期的结束,应该进入慢启动。
(6)推迟确认算法 (SHOULD be used)
每收到2*RMSS数据,至少应该发送一个确认。但一般以SMSS算,否则当SMSS小于RMSS时会出问题。