一、TCP连接状态机的模拟
1.TCP连接状态机的原理及模拟方案
TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接包括三个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常进行,所以,我们主要关注的是TCP是如何建立连接以及释放连接的,即所谓的“三次握手”与“四次挥手”。
TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。实验中,我们把键盘和显示器分别作为“客户”和“服务器”。
2. TCP的连接建立的模拟实现
连接建立为“三次握手”,服务器要确认客户的连接请求,然后客户要对服务器的确认进行确认,具体过程为:
第一次握手:客户端的应用进程主动打开,并向服务器发出请求报文段。其首部中:SYN=1,seq=x。
第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。
第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。
TCP建立连接的过程及TCP进程所处状态的变化如下图所示。
程序测试输入情况
最初客户端和服务端都为CLOSED状态。运行后,服务端进入监听状态,等待客户连接请求。
客户端发出连接请求,并进入SYN_SENT状态。
当SYN输入不为1时,出错。
服务端受到连接请求,同意建立连接,并向客户端发送确认,进入SYN_RCVD状态。
若输入错误,则报错。
客户端受到服务端的确认号,并发送确认号给服务端,服务端受到确认号,连接建立。
若继续连接,则出现
3. TCP的连接释放的模拟实现
连接释放为“四次挥手”,任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接释放通知,对方确认后就完全关闭了TCP连接。具体过程为:
第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。
第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。
第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。
第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。
TCP释放连接的过程及TCP进程所处状态的变化如下图所示。
程序测试输入情况
若断开连接,客户端向服务端发送连接释放报文段,进入FIN_WAIT_1状态。
服务端受到连接释放报文段后,发出确认号,进入CLOSE_WAIT状态。
若FIN输入不为1,报错。
客户端受到服务端的确认号,进入FIN_WAIT_2状态,等待服务端的连接释放报文段。
服务端发送完数据后,向客户端发送连接释放报文段,进入LAST_ACK状态,等待确认。
判断是否超时,若是,则重传。
若未超时,客户端受到服务端的连接释放报文段后,发出确认,进入TIME_WAIT状态,客户端经过2MSL后,断开连接。
受到确认,服务端断开连接。
4. 总结
整体程序流程:
首先客户端发出链接请求,经过三次握手后,客户端与服务端建立连接,可进行数据传输。数据传输完后,客户端发起连接释放请求,经过四次挥手后,断开连接。
TCP连接的各种状态可以通过下图所示的有限状态机来表示。
客户端的状态可以用如下的流程来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。
服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN收->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。
在实验中,基本实现了整个有限状态机,基本看出了TCP连接的各种状态之间的关系,较完备地处理了此机制的各种处理能力。
2、 随机早期检测RED机制的模拟
1.随机早期检测RED的原理及模拟方案
TCP的拥塞控制与网络层采取的策略有着密切的关系。在最简单的情况下,路由器的队列通常都是按照“先进先出”FIFO的规则处理到来的分组。由于队列的长度有限,当队列已满,以后再到达的所有分组都将被丢弃,叫做采取尾部丢弃策略,导致一连串分组的丢失,造成了网络中的全局同步现象。为了避免发生这一现象,可以在路由器中采用随机早期检测RED的措施。实现RED的要点如下:
(1)若平均队列长度小于最小门限THmin,则把新到达的分组放入队列进行排队;
(2)若平均队列长度超过最大门限THmax,则把新到达的分组丢弃;
(3)若平均队列长度在最小门限THmin和最大门限THmax之间,则按照某一概率将新到达的分组丢弃。
下图中,RED把路由器的分组到达队列划分为三个区域,即正常排队、以概率p丢弃和必须丢弃的区域。
我们通过键盘输入的字符串表示接收的数据,对于每一组输入的数据分别给出它们丢弃的概率和是否丢弃。
2. RED模拟算法的理论基础
RED采用了和计算平均往返时间RTT类似的加权平均的方法来计算平均队列长度LAV,并根据这个平均队列长度LAV求出分组丢弃概率p。
平均队列长度Lav的计算方法
LAV=(1-δ)*(旧的LAV)+δ*(当前的队列长度样本)
δ是在0到1之间的数。若δ足够小,则平均队列长度LAV取决于队列长度的长期变化趋势,而不受持续时间短的数据突发的影响。
先求分组丢弃概率p:
式中,count是一个变量,它代表新到达的分组有多少个已经进入了队列;Ptemp是过渡的分组丢弃概率:
3.RED机制的模拟实现
程序测试输入情况
随机输入一组数据。
当最小门限大于等于当前队列时,数据不会被丢弃。
当最小门限小于当前队列,最大门限大于当前队列时,后面数据可能被丢弃。
最大门限小于当前队列时,接收到的数据都会被丢弃。
4.总结
分组丢弃概率p、最大门限THmax和最小门限THmin的关系如下图所示。
分组丢弃概率p不仅与平均队列长度有关,而且还随着队列中不被丢弃的分组数目的增多而逐渐增大,就可以避免分组的丢弃过于集中。
随机早期检测RED的好处就是当平均队列长度超过门限值THmin时,就会有少量的分组被丢弃,这就使得有少量的TCP连接会减小其窗口值,使得到达路由器的分组的数量减少。结果,队列平均长度就减小了,从而避免了网络拥塞的发生。应当注意到,网络的吞吐量仍然保持在较高的数值,因此丢弃的分组的数量是很少的。
而路由器在某一时刻的瞬时队列长度完全可能远远超过平均队列长度。如果算出的丢弃概率很小,但路由器的队列已经没有空间可接纳新到达的分组,那么这时RED的操作和“尾部丢弃”方式是一样的。RED只是在可能的条件下尽量使“尾部丢弃”不要发生。同时,RED机制还可以使得路由器可以更好地管理其队列长度。
在实验中,基本实现了RED机制的各项处理能力。