一、滑动窗口协议
滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。其中一个重要区别是,一个是针对于帧的传送,另一个是字节数据的传送。滑动窗口主要实现了流量的控制。在TCP连接建立的过程中,TCP中一个字段包含了窗口的大小,还包含了一个MSS大小(防止ip层数据分片)。
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为9,接收窗口尺寸为9):
如上图,序号为1、2、3的数据已经发送并且已经得到确认,所以滑动窗口开始于序号为4的数据。在这个滑动窗口中序号4-7是已经发送未被确认的数据,8-12是可以发送的数据。如果4-7得到确认,那么滑动窗口会往前移动4个数据单位。对于接收方,接收方维护一个接收窗口,第一个序号4号表示期望收到的字节序号,如果收到一个数据不是4号但是在接收窗口之内,接收窗口将不会对这个数据确认,如果在接收窗口之外,就会丢弃这个数据。如果收到的数据是4号,接收窗口会对4号数据确认,并将窗口移动一个位置。实际上接收窗口会使用延迟确认机制。在收到连续多个数据才会进行确认,提高确认效率。
发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口(rwnd)大小为止。当发送方和接收方处于同一个局域网时,这种方式 是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽缓存。现在,TCP需要支持一种被称为“慢启动(slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK, 拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd, cwnd)。
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK, 拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd, cwnd)。
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。
二、UDP特点及报文格式
UDP无连接,不可靠的协议,但是一般情况下UDP更加高效。
可以看出,UDP的头部只有8个字节,数据格式比较简单,在传输过程中效率可能会更高一点。