TCP协议软件通过滑动窗口机制解决传输效率和流量控制的问题,它可以在收到确认信息前发送多个数据分组。这种机制使得网络处于忙碌状态,提高了整个网络的收发率,它还解决了端到端通信流量的控制问题,允许接收端在拥有足够数据的缓冲前对传输进行限制。在实际的运行中,TCP滑动窗口的大小是可随时调整的。收发端TCP协议软件在进行分组通信确认时,还需要交换滑动窗口控制信息,使双方滑动窗口的大小可以根据需要动态变化,以达到既能提高数据传输效率,又能防止拥塞的发生的效果。
通常称窗口左边沿向右边沿靠近的现象为窗口合拢,这种现象发生在数据被发送和确认时。而当窗口右边沿向左移动时会允许发送更多的数据,称之为窗口张开,这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。当左边沿向右移动时,称为窗口收缩,Host Requirements RFC强烈建议不要使用这种方式,但TCP必须能够在某一端产生这种情况时进行处理。如果左边沿到达右边沿,则称其为一个零窗口。
2.2 滑动窗口算法
滑动窗口算法的工作过程如下:
首先,发送方为每1帧赋一个序号(sequence number),记作SeqNum。我们先忽略SeqNum是由有限大小的头部字段实现的事实,而假设它能够无限的增大。发送方文护3个变量:发送窗口大小(send window size),记作SWS,给出发送方能够发送但未确认的帧数的上界;最近收到的确认帧(last acknowledgement received)的序号,记作LAR;最近发送的帧(last frame sent)的序号,记作LFS。发送方还应符合不等式:LAR-LFS≤SWS。示意图如下图4:
图4 滑动窗口算法的时间线
当一个确认到达时,发送方就会向右移动LAR,并允许发送方发送下一帧。此时,发送方为所发的每个帧都设置一个定时器,如果在ACK到达之前定时器超时,则将要重发此帧。注意:发送方必须最多存储SWS个帧,因为在它们得到确认之前必须准备重新发送。接收方文护下面3个变量:接收窗口大小(receive window size),记作RWS,给出接收方所能接收的无序帧数目的上界;可接收帧(largest acceptable frame)的序号,记作LAF;最近收到的帧(last frame received)的序号,记作LFR。接收方也要符合不等式:LFS-LAR≤SWS。示意图如下图5:
图5 接收方的滑动窗口
当一个具有顺序号SeqNum帧到达时,接收方会采取如下行动:当SeqNum≤LFR或SeqNum> LAF时,帧不在接收窗口内,于是被丢弃;当LFR<SeqNum≤LAF时,帧在接收窗口内,于是被接收。现在接收方需判定是否发送一个ACK。设SeqNum To ACK表示未被确认帧的最大序号,那么序号小于或等于SeqNum To ACK的帧都已收到。即使已经收到更高序号的分组,接收方仍确认SeqNum To ACK的接收。这种确认被称为累积的(cumulative)。然后它设置LFA = SeqNum To ACK,并作出调整满足公式:LFA = LFR + RWS。
因此窗口协议算法具有三个功能:
(1)、在不可靠链路上可靠地传输帧;
(2)、保持帧的传输顺序;
(3) 、支持流量控制。
3 开发设计环境
3.1 Microsoft Visual Studio 2010
Microsoft Visual Studio 2010是微软公司推出的开发环境。是目前最流行的Windows平台应用程序开发环境。Microsoft Visual Studio 2010版本于2010年4月12日上市,其集成开发环境(IDE)的界面被重新设计和组织,变得更加简单明了。Microsoft Visual Studio 2010同时带来了NET Framework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持开发面向Windows 7的应用程序。除了Microsoft SQL Server,它还支持IBM、DB2和Oracle数据库。 C#滑动窗口协议的软件设计与实现(3):http://www.751com.cn/jisuanji/lunwen_8003.html