双向和方向插座之间的主要区别是什么?

use*_*505 6 sockets port bidirectional

双向意味着数据传入和传出数据流经同一个通道(套接字),在经典套接字中就是这种情况.例如,您想要连接到服务器:您创建一个套接字,通过同一个通道发送和接收数据.这不是双向的吗?

websockets(双向)有什么不同,只是它们可以在浏览器上运行?这有区别吗?

另一个问题是bind()在服务器端期间会发生什么; 这是用于说OS的TCP堆栈实现,消息必须在该端口上传递到哪个套接字?

Rem*_*eau 7

双向意味着数据在两个方向上流动,而单向意味着数据仅在一个方向上流动.套接字被创建为双向资源(能够发送和接收),即使它仅在代码中以单向方式使用.shutdown()如果您不打算使用它(例如,shutdown(SD_SEND)在仅接收套接字或shutdown(SD_RECEIVE)仅发送套接字上),您可以选择使用关闭数据流的一个方向.

WebSocket仍然是一个套接字,只是一个在Web浏览器中运行的套接字,其传输的数据必须根据WebSocket规范以特定格式构建.WebSocket可以发送/接收任意数据,就像普通的套接字一样,它只需要将数据包装在需要在接收端解码的帧中.

bind()无论是在客户端还是服务器端调用(是的,它都可以在两者上调用),告诉OS在建立连接之前哪个本地IP /端口对与套接字关联.套接字由其套接字协议类型(UDP,TCP等),其本地绑定IP /端口对及其连接的远程IP /端口对唯一标识.与已建立的套接字连接不匹配的网络数据包将被丢弃.

在客户端,调用bind()是可选的,connect()如果bind()没有调用则会隐式绑定. bind()如果客户端安装了多个网络适配器并且想要指定与哪个网络适配器连接,或者客户端必须使用特定的本地端口(由数据协议,防火墙规则等规定),则此选项很有用.

在服务器端,bind()需要建立服务器侦听的IP /端口以接受客户端.


Ste*_*ich 6

Websockets 是围绕HTTP 拉模型的一种尝试,例如,客户端执行HTTP 查询,服务器执行HTTP 响应,这就是谈话的结束。但通常需要的不仅仅是这些,例如服务器推送或只是经典的双向通信,不限于请求+响应。在没有防火墙的世界中,人们将使用经典套接字来完成此任务,但在当今世界中,许多通信受到限制,并且与任意端口的直接连接将不再有效。

Websocket 通过升级已建立的 HTTP 通信来解决此问题。例如,客户端请求 HTTP 升级,如果服务器同意,那么从现在起双方就可以在该 HTTP 连接内进行通信,就像使用简单的 TCP 连接一样。实际上,它们内部有一些框架和数据处理,但这些细节对用户是隐藏的。在某种程度上,它类似于浏览器用于通过 Web 代理建立 (https) 隧道的 CONNECT 方法。

当然,这意味着 Websocket 连接只能在支持该协议的 Web 客户端(大多数最新浏览器都支持)和实现 Websocket 的 Web 服务器之间建立。这尤其意味着您不能使用 WebSocket 连接到 UDP 套接字或任意 TCP 套接字(除非 Web 服务器转发这些数据)。但这也意味着,如果您将 HTTPS 连接升级到 WebSockets,则 WebSockets 连接也将受到透明的 SSL 保护。但是,即使客户端和服务器支持 Websockets,如果中间存在不理解 WebSockets 或明确阻止它们的 Web 代理,连接升级也可能会失败。

如果您懂德语,https://blog.genua.de/blog/post/loecher-in-der-firewall-mit-websockets.html可能会给您带来有关 Websockets 如何适应网络堆栈及其安全性的有趣读物影响。