【问题标题】:How does the client knows which transport protocol to use?客户端如何知道使用哪种传输协议?
【发布时间】:2020-05-31 08:44:23
【问题描述】:

假设我在我的专用网络 (192.168.10.10:9900) 中的一台计算机上启动了一个服务器。

现在,当从同一网络中的其他计算机发出请求时,客户端计算机(操作系统?)如何知道要使用哪个协议/服务器遵循哪个协议? [TCP 或 UDP]

编辑:正如答案中提到的,我基本上是在寻找一个默认协议,在没有任何传输协议信息的情况下客户端将使用该协议。

【问题讨论】:

  • 客户端应用程序在创建套接字时通知操作系统。没有默认值。

标签: networking tcp udp


【解决方案1】:

TCP / UDP协议工作在传输层级别(TCP / IP MODEL),其主要区别在于TCP有一种方法可以确保消息的到达,而UDP更轻,因为它的优点是信息传递速度更快. 一种或另一种协议的使用始终由使用它的应用程序定义。

因此,您在 ip: 端口 192.168.10.10:9900 的私有服务器上的引用非常模糊,更准确地说,我们可以说我们有一个 Apache Web 服务器在 ip: 端口 192.168.10.10:9900 上运行(安装服务器时默认端口为80,可在配置中更改)。

现在 Web 服务器(apache、IIS 等)使用 TCP 协议工作,因为当客户端(计算机、手机等)通过浏览器(Chrome、Firefox 等)访问页面时,理想的事情是所有的网站,而不仅仅是一些片段。这就是为什么这类服务器首先选择并使用该协议的原因,因为他们寻求最终的结果是用户获得完整的页面,而不管是否在使用 TPC 所涉及的验证中牺牲了几毫秒。

现在转到客户端。用户从任何浏览器(Chrome、Firefox 等)访问网页时都将使用 TCP,因为该协议已在浏览器中配置以发送查询消息并随后接收具有相同表单网站信息的消息。

现在,任何客户端/服务器应用程序都会重复此行为。例如,要更改 UDP 端的应用程序类型,我们可以观察 DHCP 服务的运行情况,这些服务用于在将任何设备连接到 Wi-Fi 网络时接收 IP。在这种情况下,此服务寻求尽可能快(而不是最可靠的),因为您希望设备尽快连接到网络,所以使用 UDP 协议,在这种情况下,连接到WIFI 网络,您将使用此协议发送消息。

最后,如果您想及时了解特定应用程序使用的 TCP/UDP 协议类型,您可以搜索Wireshark 应用程序,该应用程序允许您扫描离开设备的消息或显示使用的协议在应用程序的不同层中。

【讨论】:

  • 我了解 TCP 和 UDP。只是我对在没有明确/派生信息的情况下客户如何做出决定感到困惑。根据答案,它似乎完全取决于客户端程序要遵循的默认协议(几乎总是 TCP)
  • 应用程序总是在其配置中的某个点定义要使用的协议,因为在设计服务时(dhcp、http 等),有必要确定消息是否可靠或快。
【解决方案2】:

任何客户端都没有理由向您的服务器发出请求,那么它为什么会关心它遵循什么协议呢?客户端不只是随机连接到事物以查看那里是否有服务器。所以它对任何客户都没有任何影响。

【讨论】:

  • 我的意思是如果我是客户。我只是想了解这里的流程。这是否意味着每个客户端都应该有一些关于服务器期望的协议的现有信息?或者这些信息是通过标准查询机制发现的?
  • @indiansher 我不明白“我是客户”是什么意思。你是做什么的?你是电脑吗?一个程序?要不然是啥?你的意思是你是一个实现某些特定协议的特定程序吗?如果是这样,为什么你需要知道使用什么协议?你想象的场景到底是什么?
  • @indiansher 我不明白“当我请求某个页面时”是什么意思。你的意思是你启动浏览器?如果是这样,浏览器知道使用 HTTP,因为它们是浏览器。没有办法“请求某个页面”而不知道它是您所追求的页面,这意味着基于 TCP 的 HTTP,因为这就是网页的工作方式。
  • 如果你不指定,curl 程序会尝试猜测协议。在这种情况下,它猜测 HTTP over TCP。
  • @indiansher 你可能会也可能不会,这取决于所有情况。您需要足够的信息来了解用作客户端的程序以及客户端需要的任何信息。这完全取决于具体情况的细节。例如,对于 VNC,您可能需要了解很多协议细节,包括正在使用哪种加密或压缩。
【解决方案3】:

通常,客户端计算机将默认使用 TCP 协议。如果您使用 UDP 协议模式启动服务器,那么当您使用 curl -XGET 192.168.10.10:9900/test-page 时,它会返回一个 curl: (7) Failed to connect to 192.168.10.10 port 9900: Connection refused 错误。你可以试试,使用nc -lvp 9900 -u,它会给你这个结果。

【讨论】:

  • 知道了。谢谢你。这是我想知道的。默认假设是 TCP。
  • curl 默认使用 TCP。也许其他一些客户端程序可能默认使用 UDP?
  • 不,大多数客户端程序默认使用TCP,因为所有服务器程序都默认使用TCP。 Internet 的默认设置是 TCP。 :D。 UDP 只是一种选择。
  • 你应该知道,无论接收者是否收到,UDP都会向接收者发送数据报。
【解决方案4】:

这里的答案指向一些默认协议。不是这样,每当你启动一个应用程序,比如说 HTTP 服务器,服务器的内部都有代码来打开一个套接字(可以是 TCP 或 UDP),因为HTTP:80 是一个 TCP 协议code 创建一个 TCP 套接字。类似地,对于其他网络应用程序,这取决于他们要求使用哪种传输层协议(TCP Or UDP)。就像一个 DNS 客户端会创建一个 UDP 套接字来连接到 DNS 服务器,因为DNS:53 主要是通过 UDP。 TCP 和 UDP 都有不同的用例、优点和缺点。根据 UDP/TCP 的用例/优点/缺点,决定使用它们中的任何一个来实现服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2016-03-14
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多