涉及到运输层可靠传输协议

设计一个可靠传输协议时,如果出现以下两种情况分别如何处理?假设发送方为A,接收方为B,网络数据为M。

(1)B接收M时检测发现了差错;

(2)M在发送过程中丢失了;

每种情况,都从发送方A和接收方B来分别描述如何处理。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7540586
  • 这篇博客也不错, 你可以看下在下图所示的网络配置中,发现工作站B无法与服务器A通信,()故障影响了两者之间的通信
  • 除此之外, 这篇博客: 计算机网络 华东理工大学 第4章测试中的 4.考虑一个与主机 A 和 B 连接的交换机 (其他端口是空的)。交换机刚刚开始启动和运作。A发送一帧到B,然后B回复一帧到A。检查下列所有语句,当第二个帧 (从 B 发送给 A) 被交换机处理时,哪些是正确的? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 编号选项
    A交换机不会学习 B的端口
    B交换机通过广播帧到达 A.
    C该交换机不学习任何新的东西。
    D交换机将帧直接转发到 A。
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    涉及到运输层可靠传输协议时,如果发送方A向接收方B发送数据M时,出现以下两种情况,应该如何处理?

    1. 当B接收M时检测出现差错,应该如何处理?请分别描述A和B各自应该如何处理此种情况。

    在出现差错时,可以使用可靠传输协议(如TCP)来进行重传,保证数据传输的可靠性。具体处理步骤如下:

    • 当B检测到数据出现差错时,会向A发送一个带有“确认丢包”的消息(ACK),告知A数据未成功到达。
    • A接收到B的“确认丢包”消息后,会重新发送数据M。
    • B收到A重新发送的数据M后,会再次检查数据是否出现差错,如果仍有差错,B会重复以上步骤,直到数据无差错。

    • 当M在发送过程中丢失了,应该如何处理?请分别描述A和B各自应该如何处理此种情况。

    在数据丢失时,也可以使用可靠传输协议来进行重传,保证数据传输的可靠性。具体处理步骤如下:

    • A发送数据M后,等待接收B的ACK消息,如果在规定的时间内未收到ACK消息,A会认为数据M丢失了。
    • A会重新发送数据M,重传次数不断增加,直到收到B的ACK消息。
    • B收到数据M后,会向A发送一个带有“确认收到”的ACK消息,告知A数据已经成功到达。
    • 如果B接收到了重复的数据M,B会丢弃该数据,并重新发送ACK消息,以确保数据的正确性。

    代码演示:

    以下是使用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收到后会重新发送消息,直到收到了正确的响应。