滑动窗口算法原理
数据流处理中的滑动窗口算法

数据流处理中的滑动窗口算法随着物联网和智能设备的普及,数据流处理成为了一项重要的技术。
数据流处理是指对无限数据流进行实时处理和分析的方法。
在这个过程中,数据通常以流的形式传输,因此需要使用一些特殊的算法来处理这些数据流。
其中,滑动窗口算法是常用的一种。
什么是滑动窗口算法?滑动窗口算法是一种基于区间的算法,它可以在固定大小的区间内对数据流进行处理。
这个固定大小的区间就是滑动窗口。
滑动窗口由一个起点和一个终点组成,起点和终点都会随着数据流的更新而进行滑动。
当新的数据流进入滑动窗口时,算法会对滑动窗口内的数据进行分析和处理,然后将结果输出。
滑动窗口的大小可以根据不同的需求来设置。
例如,在网络流量分析中,如果我们想要知道最近10秒钟的网络带宽使用情况,我们可以将滑动窗口的大小设置为10秒钟,然后对这个滑动窗口内的数据进行统计。
滑动窗口算法的应用滑动窗口算法在数据流处理中有着广泛的应用。
下面列举一些常见的例子:1. 最近K次查询的平均响应时间在计算机网络中,我们通常需要对最近K次的查询响应时间进行统计来了解系统的负载情况。
这个问题可以通过滑动窗口算法来解决。
我们可以将滑动窗口的大小设置为K,然后在滑动窗口中计算查询响应时间的平均值。
2. 判定数据流中是否存在某个子序列在某些情况下,我们需要判断一个数据流中是否包含某个子序列。
这个问题可以使用滑动窗口算法来解决。
我们可以将滑动窗口的大小设置为子序列的长度,然后在滑动窗口内判断是否包含这个子序列。
3. 实时数据分析在实时数据分析中,我们需要对数据流进行实时处理和分析。
滑动窗口算法可以对数据流进行连续的实时处理和分析。
我们可以将滑动窗口的大小设置为一定的时间窗口,然后在滑动窗口内进行数据分析和处理。
滑动窗口算法的优点和缺点滑动窗口算法有着一些优点和缺点。
下面是一些常见的优点和缺点:优点:1. 实时性好:滑动窗口算法可以对数据流进行实时处理,这对于实时数据分析非常有用。
滑动窗口算法原理

滑动窗口算法原理滑动窗口算法(Sliding Window Algorithm)是一种用于解决字符串(或数组)问题的算法。
它通过使用一个固定长度的窗口,在字符串上滑动并保持窗口的大小不变,来寻找满足特定条件的子串(或子数组)。
滑动窗口算法的基本思想是通过两个指针,一个左指针和一个右指针,在给定字符串上移动这两个指针以定位子串。
右指针用于扩展窗口,而左指针用于收缩窗口。
通过不断的移动左右指针,可以在字符串上依次扫描每个可能的子串。
1. 找到满足特定条件的最小子串(Minimum Window Substring)。
2. 找到满足特定条件的最长子串(Longest Substring Without Repeating Characters)。
3. 找到满足特定条件的数组中的最长子数组(Maximum SumSubarray of Size K)。
下面详细解释滑动窗口算法的原理和步骤:1. 定义两个指针,即左指针(left)和右指针(right)。
初始时,左指针指向子串的起始位置,右指针指向子串的结束位置。
2.向右移动右指针,扩展窗口,直到满足特定条件为止。
在扩展窗口的过程中,可以更新一些数据结构来保存所需的信息,比如字符频率的哈希表。
3.当窗口满足特定条件时,开始收缩窗口,即向右移动左指针。
同时,更新所需的信息。
4.在收缩窗口的过程中,不断更新最优解。
如果当前窗口满足最优条件,可以更新最优解。
5.重复步骤2到步骤4,直到右指针到达字符串的末尾。
举个例子来说明滑动窗口算法的应用:问题:给定一个字符串s和一个目标字符串t,在字符串s中找到包含t所有字符的最短子串。
示例输入:s="ADOBECODEBANC",t="ABC"示例输出:"BANC"首先,我们可以使用一个哈希表来记录目标字符串t中每个字符的频率。
然后使用两个指针left和right来定义一个窗口,初始时left和right都指向字符串s的第一个位置。
滑动窗口协议书原理

滑动窗口协议书原理滑动窗口协议(Sliding Window Protocol)是一种用于数据传输的协议,其原理是通过设置一个固定大小的窗口来管理发送方和接收方之间的数据传输。
该协议主要用于解决数据传输中的流量控制和可靠性问题。
在本文中,我将详细介绍滑动窗口协议的原理。
滑动窗口协议的核心概念是窗口,它定义了发送方和接收方之间的传输范围。
窗口的大小取决于网络的带宽和延迟。
发送方在窗口范围内发送数据包,而接收方则在相应的窗口范围内确认和接收数据包。
通过动态调整窗口的大小,滑动窗口协议可以实现数据传输的流量控制,以防止网络拥塞和数据丢失。
滑动窗口协议的工作原理如下:1. 发送方将数据拆分成多个数据包,并按照顺序发送给接收方。
发送方设置一个窗口大小,即一次可以发送的数据包的数量。
2. 发送方发送窗口内的数据包,并启动一个定时器来检测数据包是否发送成功。
如果定时器超时,发送方将对应数据包重新发送。
3. 接收方按照顺序接收数据包,并发送确认消息给发送方。
确认消息包含已成功接收的数据包的序号。
4. 发送方接收到确认消息后,将窗口向前滑动,即将已经确认的数据包从窗口中删除,并发送新的数据包。
5. 如果发送方在定时器超时之前收到了确认消息,则停止定时器,并将窗口向前滑动。
6. 如果接收方在接收窗口范围内收到了重复的数据包,则忽略该数据包,并重新发送上一次确认消息。
滑动窗口协议的优点是可以提高数据传输的效率和可靠性:1. 流量控制:通过动态调整窗口的大小,滑动窗口协议可以适应网络的带宽和延迟,避免数据包的拥塞和丢失,从而提高数据传输的效率。
2. 自动重传:发送方通过定时器来检测数据包的丢失,并及时重发未确认的数据包,确保数据的可靠传输。
3. 确认机制:接收方发送确认消息给发送方,告知已成功接收的数据包的序号,以保证数据传输的正确性。
然而,滑动窗口协议也存在一些缺点:1. 延迟增加:由于发送方需要等待接收方发送确认消息,所以在发送端和接收端之间会增加一定的延迟,对于实时应用可能造成影响。
什么是滑动窗口滑动窗口的机制

什么是滑动窗⼝滑动窗⼝的机制 滑动窗⼝概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。
那么你对滑动窗⼝了解多少呢?以下是由店铺整理关于什么是滑动窗⼝的内容,希望⼤家喜欢! 滑动窗⼝的概念 滑动窗⼝(Sliding window)是⼀种流量控制技术。
早期的⽹络通信中,通信双⽅不会考虑⽹络的拥挤情况直接发送数据。
由于⼤家不知道⽹络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗⼝机制来解决此问题。
参见滑动窗⼝如何根据⽹络拥塞发送数据仿真视频。
图⽚是⼀个滑动窗⼝的实例: 滑动窗⼝协议是⽤来改善吞吐量的⼀种技术,即容许发送⽅在接收任何应答之前传送附加的包。
接收⽅告诉发送⽅在某⼀时刻能送多少包(称窗⼝尺⼨)。
TCP中采⽤滑动窗⼝来进⾏传输控制,滑动窗⼝的⼤⼩意味着接收⽅还有多⼤的缓冲区可以⽤于接收数据。
发送⽅可以通过滑动窗⼝的⼤⼩来确定应该发送多少字节的数据。
当滑动窗⼝为0时,发送⽅⼀般不能再发送数据报,但有两种情况除外,⼀种情况是可以发送紧急数据,例如,允许⽤户终⽌在远端机上的运⾏进程。
另⼀种情况是发送⽅可以发送⼀个1字节的数据报来通知接收⽅重新声明它希望接收的下⼀字节及发送⽅的滑动窗⼝⼤⼩。
滑动窗⼝的机制 滑动窗⼝协议的基本原理就是在任意时刻,发送⽅都维持了⼀个连续的允许发送的帧的序号,称为发送窗⼝;同时,接收⽅也维持了⼀个连续的允许接收的帧的序号,称为接收窗⼝。
发送窗⼝和接收窗⼝的序号的上下界不⼀定要⼀样,甚⾄⼤⼩也可以不同。
不同的滑动窗⼝协议窗⼝⼤⼩⼀般不同。
发送⽅窗⼝内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
下⾯举例说明,假设发送窗⼝尺⼨为2,接收窗⼝尺⼨为1: 分析:①初始态,发送⽅没有帧发出,发送窗⼝前后沿相重合。
接收⽅0号窗⼝打开,等待接收0号帧;②发送⽅打开0号窗⼝,表⽰已发出0帧但尚确认返回信息。
滑动窗口算法原理

1. 滑动窗口算法--------------------------------------------------------------------------------滑动窗口算法工作过程如下。
首先,发送方为每1帧赋一个序号(sequence number),记作S e q N u m 。
现在,让我们忽略S e q N u m是由有限大小的头部字段实现的事实,而假设它能无限增大。
发送方维护3个变量:发送窗口大小(send window size),记作S W S ,给出发送方能够发送但未确认的帧数的上界;L A R 表示最近收到的确认帧(last acknowledgement re c e i v e d)的序号;L F S 表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式:LAR-LFR≤RWS当一个确认到达时,发送方向右移动L A R,从而允许发送方发送另一帧。
同时,发送方为所发的每个帧设置一个定时器,如果定时器在A C K到达之前超时,则重发此帧。
注意:发送方必须存储最多S W S个帧,因为在它们得到确认之前必须准备重发。
接收方维护下面3个变量:接收窗口大小(receive window size),记为RW S,给出接收方所能接收的无序帧数目的上界;L A F表示可接收帧(l a rgest acceptable frame)的序号;L F R表示最近收到的帧(last frame re c e i v e d)的序号。
接收方也维持如下不变式:LFS-LAR≤SWS当一个具有顺序号S e q N u m的帧到达时,接收方采取如下行动:如果S e q N u m≤L F R 或S e q N u m > L A F,那么帧不在接收窗口内,于是被丢弃;如果L F R<Se q N u m≤L A F,那么帧在接收窗口内,于是被接收。
现在接收方需要决定是否发送一个A C K。
tcp滑动窗口机制原理

tcp滑动窗口机制原理TCP滑动窗口机制原理。
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它为应用层提供可靠的数据传输服务。
在TCP协议中,滑动窗口机制是一种重要的流量控制机制,它能够有效地提高网络传输的效率和可靠性。
滑动窗口机制是指发送方和接收方通过动态调整窗口大小来控制数据流量的一种机制。
在TCP连接中,发送方和接收方各自维护一个窗口,用来控制数据的发送和接收。
发送方的窗口大小取决于接收方的窗口大小和网络的拥塞情况,发送方只能发送窗口范围内的数据,而接收方则根据自身处理能力和缓存大小确定窗口大小,控制发送方的发送速度。
滑动窗口机制的原理如下,当发送方发送数据时,如果接收方的窗口大小为0,发送方将停止发送数据;当接收方准备好接收数据时,它会通知发送方它的窗口大小,发送方会根据接收方的窗口大小和网络状况来确定发送数据的大小和速度。
如果网络拥塞,接收方的窗口大小会减小,发送方需要相应地调整发送速度;如果网络畅通,接收方的窗口大小会增大,发送方也会相应地提高发送速度。
这样,通过动态调整窗口大小,滑动窗口机制能够实现网络传输的流量控制,提高网络的利用率和可靠性。
滑动窗口机制的优点在于它能够根据网络状况动态调整数据的发送速度,避免了网络拥塞和数据丢失的问题。
同时,滑动窗口机制还能够充分利用网络带宽,提高网络传输的效率。
另外,滑动窗口机制还能够保证数据的有序传输,确保数据的完整性和可靠性。
总之,TCP滑动窗口机制是一种重要的流量控制机制,它能够有效地提高网络传输的效率和可靠性。
通过动态调整窗口大小,滑动窗口机制能够根据网络状况实现流量控制,避免网络拥塞和数据丢失的问题。
因此,了解和掌握滑动窗口机制的原理对于理解TCP协议和网络通信具有重要意义。
滑动窗口协议的工作原理

滑动窗口协议的工作原理
滑动窗口协议是一种在数据通信中,为了保证数据传输的可靠性而采用的一种流量控制和错误恢复机制。
它的工作原理如下:
1. 发送方将要发送的数据分成固定大小的数据块,并为每个数据块编号。
2. 发送方维护一个滑动窗口,窗口的大小决定了可以连续发送的数据块的数量。
3. 发送方将窗口内的数据块发送给接收方,并启动定时器等待确认。
4. 接收方收到数据后,检查接收到的数据块的编号是否按照顺序进行接收。
如果是,将数据块发送到上层应用,然后发送确认给发送方。
5. 发送方一旦收到确认,就将窗口向前滑动一个位置,允许发送下一个数据块。
如果接收方未能按序接收到某个数据块,发送方会继续重传该数据块。
6. 如果发送方的窗口已满,即所有的数据块都发送出去且未收到确认,发送方将进入阻塞状态,等待接收方发送确认或超时。
7. 一旦接收方收到一个丢失的数据块后,它会向发送方发送一个选择确认,指示发送方从该丢失数据块开始重新发送。
这样,通过滑动窗口协议,发送方可以根据接收方的能力和网络状况动态调整窗口大小,从而实现数据的可靠传输。
同时,滑动窗口协议还可以通过选择确认机制来进行错误恢复和丢包重传,确保数据的完整性和正确性。
挖掘滑动窗口中的数据流频繁项算法

挖掘滑动窗口中的数据流频繁项算法随着互联网和大数据时代的到来,数据量的增加让数据处理变得越来越复杂,因此频繁项集挖掘成为了一项非常重要的数据挖掘技术。
频繁项集挖掘的一种实现方式就是滑动窗口中的数据流频繁项算法,本文将详细介绍这种算法的原理和实现。
一、滑动窗口中的数据流频繁项算法的原理滑动窗口中的数据流频繁项算法是一种流式数据挖掘方法,它通过维护一个滑动窗口来处理动态数据流。
滑动窗口是指在一个固定的时间段内,能够容纳一定数量的数据,当时间推移时,窗口会向后移动一个固定的步长,将新的数据插入到窗口的最后,同时将窗口的第一个数据删除,这样就保证了窗口中的数据始终是最新的。
滑动窗口中的数据流频繁项算法主要是基于Apriori算法的改进。
Apriori算法是一种从数据集中发现频繁项集的算法,其基本思想是通过逐层扫描数据集来实现频繁项集挖掘。
但是Apriori算法不适用于处理动态数据流,因为数据流是不断变化的,频繁项集也在不断变化中。
因此,我们需要一种能够处理动态数据流的改进算法。
滑动窗口中的数据流频繁项算法通过维护一个滑动窗口,对窗口内的数据进行频繁项集挖掘。
算法的核心思想是每次新读入一个数据时,都要对窗口内的数据进行一次频繁项集挖掘,并更新频繁项集的统计信息。
具体实现中首先要对窗口内的数据进行预处理,对所有项进行标号,然后对窗口内的所有事务进行扫描,以判断其中是否包含频繁项集。
然后统计出窗口内每个项的频数,并将它们插入到一个哈希表中。
接下来,我们可以使用Apriori算法来识别频繁项集。
由于滑动窗口中的数据流频繁项算法需要频繁地更新频繁项集的统计信息,因此,在实现中需要考虑如何有效地维护这些信息,以保证算法的时间和空间效率。
二、滑动窗口中的数据流频繁项算法的实现滑动窗口中的数据流频繁项算法的实现涉及到许多细节问题,下面我们将简要介绍一些关键的实现技巧。
1. 预处理项在滑动窗口中的数据流频繁项算法中,对所有项进行标号是一个非常关键的步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 滑动窗口算法--------------------------------------------------------------------------------滑动窗口算法工作过程如下。
首先,发送方为每1帧赋一个序号(sequence number),记作S e q N u m 。
现在,让我们忽略S e q N u m是由有限大小的头部字段实现的事实,而假设它能无限增大。
发送方维护3个变量:发送窗口大小(send window size),记作S W S ,给出发送方能够发送但未确认的帧数的上界;L A R 表示最近收到的确认帧(last acknowledgement re c e i v e d)的序号;L F S 表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式:LAR-LFR≤RWS当一个确认到达时,发送方向右移动L A R,从而允许发送方发送另一帧。
同时,发送方为所发的每个帧设置一个定时器,如果定时器在A C K到达之前超时,则重发此帧。
注意:发送方必须存储最多S W S个帧,因为在它们得到确认之前必须准备重发。
接收方维护下面3个变量:接收窗口大小(receive window size),记为RW S,给出接收方所能接收的无序帧数目的上界;L A F表示可接收帧(l a rgest acceptable frame)的序号;L F R表示最近收到的帧(last frame re c e i v e d)的序号。
接收方也维持如下不变式:LFS-LAR≤SWS当一个具有顺序号S e q N u m的帧到达时,接收方采取如下行动:如果S e q N u m≤L F R 或S e q N u m > L A F,那么帧不在接收窗口内,于是被丢弃;如果L F R<Se q N u m≤L A F,那么帧在接收窗口内,于是被接收。
现在接收方需要决定是否发送一个A C K。
设S e q N u m To A C K表示未被确认帧的最大序号,则序号小于或等于S e q N u m To A c k的帧都已收到。
即使已经收到更高序号的分组,接收方仍确认S e q N u m To A c k的接收。
这种确认被称为是累积的(c u m u l a t i v e)。
然后它设置L F R = S e q N u m To A c k,并调整L A F = L F R + RW S。
例如,假设L F R= 5(即,上次接收方发送的A C K是为了确认顺序号5的),并且RWS = 4。
这意味着L A F = 9。
如果帧7和8到达,则存储它们,因为它们在接收窗口内。
然而并不需要发送A C K,因为帧6还没有到达。
帧7和8被称为是错序到达的。
(从技术上讲,接收方可以在帧7和8到达时重发帧5的A C K。
)如果帧6当时到达了(或许它在第一次丢失后又重发从而晚到,或许它只是被延迟了),接收方确认帧8,L F R置为8,L A F置为1 2。
如果实际上帧6丢失了,则出现发送方超时,重发帧6。
我们看到,当发生超时时,传输数据量减少,这是因为发送方在帧6确认之前不能向前移动窗口。
这意味着分组丢失时,此方案将不再保证管道满载。
注意:分组丢失时间越长,这个问题越严重。
注意,在这个例子中,接收方可以在帧7刚一到达时就为帧6发送一个认帧N A K(negative acknowl edgment)。
然而,由于发送方的超时机制足以发现这种情况,发送N A K反而为发送方增加了复杂性,因此不必这样做。
正如我们已提到的,当帧7和8到达时为帧5发送一个额外的A C K是合理的;在某些情况下,发送方可以使用重复的A C K作为一个帧丢失的线索。
这两种方法都允许早期的分组丢失检测,有助于改进性能。
关于这个方案的另一个变种是使用选择确认(selective acknowledgements)。
即,接收方能够准确地确认那些已收到的帧,而不只是确认按顺序收到最高序号的帧。
因此,在上例中,接收方能够确认帧7、8的接收。
如果给发送方更多的信息,就能使其较容易地保持管道满载,但增加了实现的复杂性。
发送窗口大小是根据一段给定时间内链路上有多少待确认的帧来选择的;对于一个给定的延迟与带宽的乘积,S W S是容易计算的。
另一方面,接收方可以将RW S设置为任何想要的值。
通常的两种设置是:RW S= 1,表示接收方不存储任何错序到达的帧;RW S=S W S,表示接收方能够缓存发送方传输的任何帧。
由于错序到达的帧的数目不可能超过S W S个,所以设置RWS >S W S没有意义。
2. 有限顺序号和滑动窗口--------------------------------------------------------------------------------现在我们再来讨论算法中做过的一个简化,即假设序号是可以无限增大的。
当然,实际上是在一个有限的头部字段中说明一个帧的序号。
例如,一个3比特字段意味着有8个可用序号0 ~ 7。
因此序号必须可重用,或者说序号能回绕。
这就带来了一个问题:要能够区别同一序号的不同次发送实例,这意味着可用序号的数目必须大于所允许的待确认帧的数目。
例如,停止等待算法允许一次有1个待确认帧,并有2个不同的序号。
假设序号空间中的序号数比待确认的帧数大1,即S W S ≤M A a x S e q N u m -1 ,其中M a x Seq N u m 是可用序号数。
这就够了吗?答案取决于RW S 。
如果RW S = 1,那么MaxSeqNum≥SWS+1是足够了。
如果RW S等于S W S,那么有一个只比发送窗口尺寸大1的M a x S e q N u m是不够的。
为看清这一点,考虑有8个序号0 ~ 7的情况,并且S W S = RW S = 7。
假设发送方传输帧0 ~ 6,并且接收方成功接收,但A C K丢失。
接收方现在希望接收帧7,0 ~ 5,但发送方超时,然后发送帧0 ~ 6。
不幸的是,接收方期待的是第二次的帧0 ~ 5,得到的却是第一次的帧0 ~ 5。
这正是我们想避免的情况。
结果是,当RW S = S W S时,发送窗口的大小不能大于可用序号数的一半,或更准确地说,SWS<(Maxseqnum+1)/2直观地,这说明滑动窗口协议是在序号空间的两半之间变换,就像停止等待协议的序号是在0和1之间变换一样。
唯一的区别是,它在序号空间的两半之间连续滑动而不是离散的变换。
注意,这条规则是特别针对RW S = S W S的。
我们把确定适用于RW S和S W S的任意值的更一般的规则留做一个练习。
还要注意,窗口的大小和序号空间之间的关系依赖于一个很明显以至于容易被忽略的假设,即帧在传输中不重新排序。
这在直连的点到点链路上不能发生,因为在传输过程中一个帧不可能赶上另一个帧。
然而,我们将在第5章看到用在一个不同环境中的滑动窗口算法,并且需要设计另一条规则。
3. 滑动窗口的实现--------------------------------------------------------------------------------下面的例程说明我们如何实现滑动窗口算法的发送和接收的两个方面。
该例程取自一个正在使用的协议,称为滑动窗口协议S W P(Sliding Window Pro t o c o l)。
为了不涉及协议图中的邻近协议,我们用H L P(高层协议)表示S W P上层的协议,用L I N K(链路层协议)表示S W P下层的协议。
我们先定义一对数据结构。
首先,帧头部非常简单:它包含一个序号(S e q N u m)和一个确认号(A c k N u m)。
它还包含一个标志(F l a g s)字段,表明帧是一个A C K帧还是携带数据的帧。
其次,滑动窗口算法的状态有如下结构。
对于协议发送方,该状态包括如上所述的变量L A R和L F S,以及一个存放已发出但尚未确认的帧的队列(s e n d Q)。
发送方状态还包含一个计数信号量(counting semaphore),称为s e n d Wi n d o w N o t F u l l。
下面我们将会看到如何使用它,但一般来说,信号量是一个支持s e m Wa i t和s e m S i g n a l操作的同步原语。
每次调用S e m S i g n a l,信号量加1,每次调用S e m Wa i t,信号量减1。
如果信号量减小,导致它的值小于0,那么调用进程阻塞(挂起)。
一旦执行了足够的s e m S i g n a l 操作而使信号量的值增大到大于0,在调用s e m Wa i t的过程中阻塞的进程就允许被恢复。
对于协议的接收方,如前所述,该状态包含变量L F R ,加上一个存放已收到的错序帧的队列(r e c v Q)。
最后,虽然未显示,发送方和接收方的滑动窗口的大小分别由常量S W S 和RW S表示。
S W P的发送方是由s e n d S W P过程实现的。
这个例程很简单。
首先,s e m Wa i t使这个进程在一个信号量上阻塞,直到它可以发另一帧。
一旦允许继续,s e n d S W P设置帧头部中的顺序号,将此帧的拷贝存储在发送队列(s e n d Q)中,调度一个超时事件以便处理帧未被确认的情况,并将帧发给低层协议。
值得注意的一个细节是刚好在调用m s g A d d H d r之前调用s t o r e _ s w p _ h d r。
该例程将存有S W P头部的C语言结构(s t a t e - > h d r)转化为能够安全放在消息前面的字节串(h b u f)。
该例程(未给出)必须将头部中的每一个整数字段转化为网络字节顺序,并且去掉编译程序加入C语言结构中的任意填充。
7 . 1节将详细讨论字节顺序的问题,但现在,假设该例程将多字整数中最高有效位放在最高地址字节就足够了。
这个例程的另一个复杂性是使用s e m Wa i t 和s e n dW i n d o w N o t F u l l 信号量。
S e n dWi n d o w N o t F u l l被初始化为发送方滑动窗口的大小S W S(未给出这一初始化)。
发送方每传输一帧,s e m Wa i t操作将这个数减1,如果减小到0,则阻塞发送方进程。
每收到一个A C K,在d e l i v e r S W P中调用s e m S i g n a l操作(见下面)将此数加1,从而激活正在等待的发送方进程。
在继续介绍S W P的接收方之前,需要调整一个看上去不一致的地方。