P17. 考虑两个网络实体 A 和 B,它们由一条完善的双向信道所连接(即任何发送的报文将正确地收到;信道将不会损坏、丢失或重排序分组)。A 和 B 将以交互的方式彼此交付报文:首先,A 必须向 B 交付一个报文,B 然后必须向 A 交付一个报文,接下来 A 必须向 B 交付一个报文,等等。如果一个实体处于它不试图向另一侧交付报文的状态,将存在一个来自上层的类似于 rdt_send(data)
调用的事件,它试图向下传递数据以向另一侧传输,来自上层的该调用能够直接忽略对于 rdt_unable_to_send(data)
调用,这通知较高层当前不能够发送数据。【注意:做出这种简化的假设,使你不必担心缓存数据。】
对该协议画出 FSM 说明(一个 FSM 用于 A, 一个 FSM 用于 B)。注意你不必担心这里的可靠性机制,该问题的要点在于创建反映这两个实体的同步行为的 FSM 说明。应当使用与图 3-9 中协议 rdt 1.0 有相同含义的下列事件和动作:rdt_send(data)
, packet = make_pkt(data)
, udt_send(data)
, rdt_rct(packet)
, extract(packet, data)
, deliver_data(data)
。保证你的协议反映了 A 和 B 之间发送的严格交替。还要保证你的 FSM 描述中指出 A 和 B 的初始状态。
P18. 在 3.4.4. 节我们学习的一般性 SR 协议中,只要报文可用(如果报文在窗口中),发送方就会不等待确认而传输报文。假设现在我们要求一个 SR 协议,一次发出一对报文,而且只有在知道第一对报文中的两个报文都正确到达后才发送第二对报文。
假设该信道中可能会丢失报文,但报文不会发生损坏和失序。试为报文的单向可靠传输而设计一个差错控制协议。画出发送方和接送方的 FSM 描述。描述在发送方和接收方之间两个方向发送的报文格式。如果你使用了不同于 3.4 节(例如 udt_send()
、start_timer()
、rdt_rcv()
等)中的任何其他过程调用,详细地阐述这些动作。举例说明(用于发送方和接收方的时序踪迹图)你的协议是如何恢复报文丢失的。
下图是一般性的 SR 协议:
下图是按照题目要求重新设计的 SR 协议: