TCP协议相关知识

 

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时会出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值