云南大学软件学院计网实验五传输层可靠传输协GBN编程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct pkt { int seqnum; int acknum; int checksum; char payload[20]; };
创建A端发送的数据包到达B端事件,插入到事件 队列中
B_input(packet)
当发送端发送的数据到达接收端时,接收
端的传输层调用此函数从网络层接收数据 如数据正确,则构造响应包发送到网络层, 同时将数据提交到接收端的应用层 tolayer5(calling_entity,message)。 否则,构造NACK包,通过网络层发送给发 送端
stoptimer(AorB)
由发送端或接收端调用,终止定时器
A_timerinterrupt()
超时事件发生时,调用此函数 功能:重传所有发送但为确定的包
初始化操作
init()
– 在真实的网络环境中,应用层的消息按照一定 的速率到达运输层(100个消息每秒?),而 且在可靠数据传输协议中,丢包概率和坏包概 率都不为0,我们分别设置成0.2。
常量TRACE
TRACE=1,模拟了丢包和产生坏包的情 况; TRACE >= 2,正常的发送和接收数据包
随机数的产生
产生的随机数在(0.25,0.75)范围内,否
则不符合要求,将最大整数值 2147483647改为65535。
运行结果
运行结果
实验5
设计图
函数的功能A_output(message)
当发送端应用层有数据时调用此函数, message是要发送的数据。协议要保证 接收端是按序、正确的接收到发送的数据。
struct msg { char data[20]; };
starttimer(calling_entity,increment)
A_input(packet)
当接收端B有数据包发送到发送端A时,发
送端的网络层调用此函数接收B端的数据包 如果数据正确并且是确认包,则从缓冲区 中删除正确接收到的包,并移动窗口,停 止定时器 如果还有未确认的数据包,则发送新的数 据包并启动定时器 如果应用层有数据,则创建数据包并放在 缓冲区中
设置定时器,经过increment件 calling_entity = 0 :表示发送端A调 用;calling_entity = 1:表示接收端B 调用。
tolayer3(calling_entity,packet)
A端向网络层发送数据时,calling_entity = 0 ;如B端向网络层发送数据时calling_entity = 1。
A_init() B_init()
事件管理
事件链表 按照事件产生的时间进行排序 generate_next_arrival:定义了应用层
有新数据要发送事件 starttimer:定义了定时器超时事件 TIMER_INTERRUPT tolayer3函数中定义了A端发送的数据到达 B端事件何时产生
创建A端发送的数据包到达B端事件,插入到事件 队列中
B_input(packet)
当发送端发送的数据到达接收端时,接收
端的传输层调用此函数从网络层接收数据 如数据正确,则构造响应包发送到网络层, 同时将数据提交到接收端的应用层 tolayer5(calling_entity,message)。 否则,构造NACK包,通过网络层发送给发 送端
stoptimer(AorB)
由发送端或接收端调用,终止定时器
A_timerinterrupt()
超时事件发生时,调用此函数 功能:重传所有发送但为确定的包
初始化操作
init()
– 在真实的网络环境中,应用层的消息按照一定 的速率到达运输层(100个消息每秒?),而 且在可靠数据传输协议中,丢包概率和坏包概 率都不为0,我们分别设置成0.2。
常量TRACE
TRACE=1,模拟了丢包和产生坏包的情 况; TRACE >= 2,正常的发送和接收数据包
随机数的产生
产生的随机数在(0.25,0.75)范围内,否
则不符合要求,将最大整数值 2147483647改为65535。
运行结果
运行结果
实验5
设计图
函数的功能A_output(message)
当发送端应用层有数据时调用此函数, message是要发送的数据。协议要保证 接收端是按序、正确的接收到发送的数据。
struct msg { char data[20]; };
starttimer(calling_entity,increment)
A_input(packet)
当接收端B有数据包发送到发送端A时,发
送端的网络层调用此函数接收B端的数据包 如果数据正确并且是确认包,则从缓冲区 中删除正确接收到的包,并移动窗口,停 止定时器 如果还有未确认的数据包,则发送新的数 据包并启动定时器 如果应用层有数据,则创建数据包并放在 缓冲区中
设置定时器,经过increment件 calling_entity = 0 :表示发送端A调 用;calling_entity = 1:表示接收端B 调用。
tolayer3(calling_entity,packet)
A端向网络层发送数据时,calling_entity = 0 ;如B端向网络层发送数据时calling_entity = 1。
A_init() B_init()
事件管理
事件链表 按照事件产生的时间进行排序 generate_next_arrival:定义了应用层
有新数据要发送事件 starttimer:定义了定时器超时事件 TIMER_INTERRUPT tolayer3函数中定义了A端发送的数据到达 B端事件何时产生