【问题标题】:What is Connection?什么是连接?
【发布时间】:2009-10-29 09:35:06
【问题描述】:

我对面向连接的 TCP 和无连接的 UDP 感到困惑,所以请有人澄清这一点。

  • 两台计算机之间的每次通信,无论其 TCP 还是 UDP 都是通过数据包进行的。无论是 TCP 还是 UDP,两个对等方之间都没有硬线连接。那为什么说 TCP 是面向连接的,只是因为它在没有收到确认的情况下重新传输数据包,或者它在数据包中嵌入序列号?

  • 连接的实际含义是什么?两个通信对等点之间路径上的路由器是否预定了一段时间来接受该特定连接的数据包?

编辑

  • 你什么时候说两点之间建立了连接?

谢谢

【问题讨论】:

    标签: networking tcp udp


    【解决方案1】:

    连接只是两个端点之间的虚拟路径。使用 TCP,您可以打开连接并开始发送数据。保证按顺序到达另一端(假设网络没有故障)。然后关闭连接。

    在连接期间,两端相互通信,确认收到数据包,以确保没有丢失或重复。

    使用 UDP,情况略有不同。你基本上只是把一个带有目标地址的数据包扔出去,它可能会也可能不会到达 - 那是 UDP 中的 U(不可靠)。

    您不应该误以为 TCP 的连接会导致所有数据包采用相同的物理路径。如有必要,他们将绕过问题区域。

    至于您的更新,在发生以下情况后建立连接:

    • 一个SYN 数据包已从发起方发送。
    • 响应者已发回一个SYN-ACK 数据包。
    • 发起方已发回另一个ACK 数据包。

    这是 TCP 的会话建立协议。数据包本身是在标头中设置了SYN 和/或ACK 标志的普通数据包。

    关于 TCP(和其他协议)的开创性书籍是 Stevens,如果您想要一个死树版本,请给自己一份副本 - 我已经拥有这个很久了。或者,当然,还有Wikipedia 的东西。对于不经意的询问者来说,这两者都相当繁重,但如果您有兴趣深入了解,这非常值得 - 我自己更喜欢这本书,它在我的书架上与 Knuth 并列。

    【讨论】:

      【解决方案2】:

      是的,TCP 嵌入序列号,并执行大量其他处理以“模拟”在面向数据包的无连接网络上的专用点对点连接。

      UDP 没有;每个数据报完全独立于任何其他数据报交付。

      【讨论】:

        【解决方案3】:

        我先回答你的第二个问题。您编写的(“建立路径”)发生在某些网络架构(例如 GSM 语音呼叫)中但未发生在 Internet 中的事情称为电路交换。通过电路交换,网络基础设施本身就知道两个端点之间发生的通信。然而,TCP/IP 堆栈被设计为分组交换。这意味着每个数据包都是一条单独的信息,它被传递到另一个端点,并且与任何其他数据包无关(例如发布消息)。

        因此,IP 堆栈中的较低级别协议不能保证:

        • 在目的地收到数据包
        • 以任何特定顺序接收数据包
        • 在目的地只收到一次数据包

        UDP 尤其没有尝试解决这些问题。另一方面,TCP 协议必须摆脱这些问题。它使用确认和数据包序列号来处理它们。在 TCP 中,单个数据包与其他数据包并非无关。因此,双方应协商建立在无状态 IP 之上的模拟通信路径。这种协商称为连接。它基本上是在链中的数据包之间建立关系。

        【讨论】:

          【解决方案4】:

          路由器不知道连接。连接是一个 TCP 逻辑概念,它增加了 UDP 缺乏的数据包传递的可靠性。然而,路由器只对 IP、TCP、UDP 感兴趣,无论是 IP 之上的其他层。路由器路由 IP 数据包而不考虑它们包含的高级协议。

          【讨论】:

            【解决方案5】:

            来自维基百科的two definitions 对我来说似乎很清楚

            在电信领域,无连接 描述了两个人之间的交流 消息所在的网络端点 可以从一个端点发送到 另一个没有事先安排。这 通信一端的设备 向对方传输数据,无需 首先确保收件人是 可用并准备好接收 数据。发送消息的设备 只需将其发送给 预期收件人。

            ...

            面向连接的网络 协议是提供流的协议 数据的顺序与原来相同 发送后,首先建立一个 交流会话。

            我认为我无法改进这些定义,但让我尝试从套接字编程的角度解释它,理解 socket is the programming interface for TCP/UDP。具体来说,如果您使用 Java 编写服务器套接字,您会注意到 TCP 和 UDP 的这种面向连接和无连接的特性分别如何影响编程模型。

            在基于 TCP 的客户端-服务器应用程序中,在完成任何数据通信之前,必须在客户端套接字与对应于该客户端套接字的服务器套接字之间建立连接。在服务器上,您需要创建一个ServerSocket,然后调用accept() 以获取与客户端连接对应的Socket。创建一个这样的套接字来与来自任何特定远程客户端的每个连接进行通信(通过实例化Socket 类来启动)。详情可以参考this code sample

            另一方面,如果您编写 UPD,您的服务器套接字基本上是一个 DatagramSocket 对象,它侦听端口并接收发送给它的所有数据报,并且能够将数据报发送回任何特定客户端的套接字。也就是说,一个服务器套接字为所有客户端服务,因为在任何客户端连接和服务器之间都没有端到端连接。 (请注意,也不需要“serverSocket#accept()”步骤。)换句话说,每个客户端和服务器都可以只发送数据报,而不必关心另一个端点是否准备好接收数据报。详情可以参考this code sample

            【讨论】:

              猜你喜欢
              • 2010-11-18
              • 2017-07-26
              • 1970-01-01
              • 1970-01-01
              • 2010-09-21
              • 2010-10-24
              • 2014-07-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多