我在面向连接的TCP和无连接的UDP之间感到困惑,所以请有人澄清这一点。
两台计算机之间的每次通信,无论其TCP还是UDP都是通过数据包。两个对等体之间没有硬连线,无论是TCP还是UDP。那么为什么TCP被称为面向连接只是因为它在没有收到确认的情况下重新传输数据包或者在数据包中嵌入了序列号?
连接的实际含义是什么?两个通信对等体之间的路径上的路由器是否已预订一段时间来接受该特定连接的数据包?
修改
由于
答案 0 :(得分:8)
连接只是两个端点之间的虚拟通路。使用TCP,您可以打开连接并开始发送数据。它保证按顺序到达另一端(假设网络没有失败)。然后关闭连接。
在连接期间,两端相互通信,确认收到数据包,以确保没有丢失或重复。
使用UDP,它略有不同。你基本上只是用一个目的地址抛出一个包,它可能会或可能不会到达 - 这是UDP中的U(不可靠)。
在使用相同物理路径的所有数据包中,不应该考虑TCP连接的结果。如有必要,它们将在问题区域周围布线。
对于您的更新,在发生以下情况后建立连接:
SYN
数据包。SYN-ACK
数据包。ACK
数据包。这是TCP的会话建立协议。数据包本身是正常数据包,标头中设置了SYN
和/或ACK
标志。
关于TCP(和其他协议)的开创性书籍是Stevens,如果你想要一个死树版本,请给自己一个副本 - 我已经这么久了。或者,当然,还有Wikipedia的东西。对于偶然的询问者来说,这两者都非常重要,但是如果你有兴趣深入了解它是值得的 - 我自己喜欢这本书,它与我书架上的Knuth排在一起。
答案 1 :(得分:5)
是的,TCP嵌入了序列号,并进行了大量其他处理,以“模拟”通过面向数据包的无连接网络上的专用点对点连接。
UDP没有;每个数据报完全独立于任何其他数据报传递。
答案 2 :(得分:4)
我先回答你的第二个问题。您编写的内容(“建立路径”)在某些网络架构(例如GSM语音呼叫)中发生但在Internet中没有,称为电路交换。通过电路交换,网络基础设施本身可以识别两个端点之间发生的通信。但是,TCP / IP堆栈设计为数据包交换。这意味着每个数据包都是一个单独的信息,传递给另一个端点,与任何其他数据包无关(如发布消息)。
因此,IP堆栈中的低级协议无法保证:
答案 3 :(得分:2)
路由器不知道连接。连接是TCP逻辑概念,增加了UDP缺乏的数据包传输的可靠性。然而,路由器只对IP,TCP,UDP感兴趣,而其他任何层都在IP之上。路由器路由IP数据包而不考虑它们包含的高协议。
答案 4 :(得分:2)
来自维基百科的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了解详细信息。