设计一个可靠传输协议时,如果出现以下两种情况分别如何处理?假设发送方为A,接收方为B,网络数据为M。
(1)B接收M时检测发现了差错;
(2)M在发送过程中丢失了;
每种情况,都从发送方A和接收方B来分别描述如何处理。
编号 | 选项 |
---|---|
A | 交换机不会学习 B的端口 |
B | 交换机通过广播帧到达 A. |
C | 该交换机不学习任何新的东西。 |
D | 交换机将帧直接转发到 A。 |
答案:
涉及到运输层可靠传输协议时,如果发送方A向接收方B发送数据M时,出现以下两种情况,应该如何处理?
在出现差错时,可以使用可靠传输协议(如TCP)来进行重传,保证数据传输的可靠性。具体处理步骤如下:
B收到A重新发送的数据M后,会再次检查数据是否出现差错,如果仍有差错,B会重复以上步骤,直到数据无差错。
当M在发送过程中丢失了,应该如何处理?请分别描述A和B各自应该如何处理此种情况。
在数据丢失时,也可以使用可靠传输协议来进行重传,保证数据传输的可靠性。具体处理步骤如下:
代码演示:
以下是使用Python实现的一个简单的TCP可靠传输示例,其中client是发送方,server是接收方。当接收方检测到数据出现差错时,会向发送方发送一个带有“确认丢包”的消息;当数据丢失时,发送方会对数据进行重新发送,直到收到接收方的“确认收到”消息。
# server code
import socket
def server():
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
# 模拟数据出现差错的情况
if b'error' in data:
print("数据出现差错,发送确认丢包消息")
conn.sendall(b'ACK-error')
else:
conn.sendall(b'ACK')
print("接收到数据:", repr(data))
# client code
def client():
HOST = 'localhost' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
# 发送数据
for i in range(3):
msg = b'TCP message ' + bytes(str(i), 'utf-8')
print("发送数据:", msg)
s.sendall(msg)
# 接收确认消息
data = s.recv(1024)
while data != b'ACK':
print("收到确认丢包消息,重新发送数据")
s.sendall(msg)
data = s.recv(1024)
print("收到确认消息:", data)
# 模拟数据出现差错的情况
if i == 1:
data = s.recv(1024)
if b'ACK-error' in data:
print("收到确认丢包消息,重新发送数据")
s.sendall(msg)
data = s.recv(1024)
print("收到确认消息:", data)
else:
print("收到确认消息:", data)
else:
print("收到确认消息:", data)
if __name__ == "__main__":
import threading
t1 = threading.Thread(target=server)
t2 = threading.Thread(target=client)
t1.start()
t2.start()
t1.join()
t2.join()
在这个示例中,当client发送数据时会向服务器发送tcp message(0~2),接收到server返回的确认消息“ACK”之后才会继续发送。当client发送第二条消息时,模拟数据出现差错,server会返回“ACK-error”消息,client收到后会重新发送消息,直到收到了正确的响应。