![任何两个使用套接字的程序之间的通信是否必须存在应用层协议?](https://linux22.com/image/148838/%E4%BB%BB%E4%BD%95%E4%B8%A4%E4%B8%AA%E4%BD%BF%E7%94%A8%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E7%A8%8B%E5%BA%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1%E6%98%AF%E5%90%A6%E5%BF%85%E9%A1%BB%E5%AD%98%E5%9C%A8%E5%BA%94%E7%94%A8%E5%B1%82%E5%8D%8F%E8%AE%AE%EF%BC%9F.png)
当任何两个程序,无论多么简单或复杂,通过互联网域套接字(或Unix域套接字)进行通信时,是否一定意味着存在应用层协议 为了他们的沟通?
这样的应用层协议可以是众所周知的和定义的(例如HTTP)还是临时的(没有明确定义)?
例如,通过unix或internet域套接字psql
进行postgresql server
通信,而Virtual Machine Manager和KVM/QEMU通过unix或internet域套接字进行通信。我想知道像它们这样的程序是否必须使用自己的协议进行通信。
这将帮助我理解协议(特别是应用层协议)的概念。
谢谢。
答案1
协议只是一套通信方式。没有其他的。它们有多严格或多宽松是另一回事。
没有什么可以阻止沟通变得完全混乱。您可以使用netcat
它来通信两个端点,并且您之间发送的数据仅受数据交换要实现的目标的限制。如果你愿意的话,这可以是纯粹的废话,这意味着没有任何限制。
答案2
是的。两个相互通信的程序必须遵循某种协议来确定如何进行通信。该协议不需要是标准或正式的(如发布的,甚至写下来的)协议,但他们必须以某种方式就应该以什么方式和以什么顺序进行通信,以及他们传递给每个协议的数据达成一致。其他意思。
打个比方,一个人离开杂货店,在收银台付款。那里有一个协议协议,其中包括关于使用什么语言以及应该使用什么货币进行货币交易等事项的非正式协议。该协议还规定了事情需要按什么顺序发生才能让人们能够然后带着新买的杂货(合法地)离开商店。该协议还涉及人们选择是否使用现金或借记卡付款所需的信息交换。要求用其他东西付款,或者在退房过程中要求太早或太晚付款,都会让柜台后面的人感到困惑,就像用未知(不兼容)的语言说话一样。
有时,您想在只能使用银行卡的结帐柜台用现金支付,从而违反了该协议。然后,您将在接受现金的柜台重新开始该程序。此信息是在早期交易消息(一个标有“仅限借记卡”的标志)中提供给您的,但您忽略了。
ssh
您可以看到使用连接到 SSH 服务器时在服务器和客户端之间来回发送协议消息的一些示例-vvv
。在客户端,您将看到有关识别远程服务器的 SSH 协议版本并发送我们自己的客户端版本的消息。将会有关于同意使用什么密码以及尝试什么身份验证方法等的消息。如果您在调试模式下启动 SSH 守护程序并使用客户端连接到它,您还可能会看到相应的服务器端消息。