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

时间:2014-01-11 02:35:34

标签: sockets port bidirectional

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

在客户端,调用bind()是可选的,因为如果尚未调用connect()bind()将隐式绑定。如果客户端安装了多个网络适配器并希望指定与哪个网络适配器连接,或者客户端必须使用特定的本地端口(由数据协议,防火墙规则等规定),则bind()非常有用。 p>

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

答案 1 :(得分:0)

Websockets试图解决http的拉模型,例如客户端执行http查询,服务器执行http响应,这就是谈话的结束。但通常需要更多,例如服务器推送或仅仅是经典的双向通信,不仅限于请求+响应。在没有防火墙的世界中,人们会使用经典套接字来完成这项任务,但在当今世界,许多通信受到限制,与任意端口的直接连接将不再起作用。

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

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

如果您了解德语https://blog.genua.de/blog/post/loecher-in-der-firewall-mit-websockets.html可能会给您一个有趣的读物,介绍Websockets如何适应网络堆栈及其安全隐患。