创建一个连接后,就可以在两个机器之间进行通信,实现原理是什么?
创建一个连接后,就可以在两个机器之间进行通信,有一些关于原理的问题。
服务端向客户端返回信息的本质是什么?
是服务器向客户端所在的机器发送数据吗?客户端即使在内网中也能得到响应,是因为路由器向内网转发了吗?那么路由器如何区分数据是一个响应还是一个请求?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1.服务端向客户端返回信息的本质是什么?
基本上我们能想到的通信C/S通信模式都是基于Socket,Socket的本质是IO流。
Socket的定义是一种线程间通信的方式,Socket依赖于TCP/IP协议,但Socket本身不是一种协议,它是BSD基于TCP/IP协议封装出来的一套标准C库,其他语言再对socket.h进行改良、改进演变成其他库,例如node.js使用的socket.io
我从12年开始做即时通信,如果有这方面的疑问可以私信我。
2.是服务器向客户端所在的机器发送数据吗?
基于第一点,Socket是线程间的通信,所以严格讲通信的最小单元是线程而不是机器,这个很好理解,你同一个机器可以有很多程序,每个程序还能有很多线程,各自都有自己的IO流。每个线程都有自己的端口(不管是静态端口或动态端口),在socket相关定义中,这个单位叫做地址结构ipaddr,即IP+端口。响应同理,是对应线程的Socket IO流上从S端往C端进行的O,也是C端对于S端的I,谁是I谁是O取决于你从哪儿观察。
3.客户端即使在内网中也能得到响应,是因为路由器向内网转发了吗?
局域网的IP寻址与广域网的IP寻址略有不同。局域网中的IP寻址会先从消息生产者的电脑上查找缓存的ARP表(MAC地址映射为IP地址),然后去网关查找缓存的ARP,等等,如果能够找到消费者的IP地址,就会进行后续的连接建立或其他操作。如果一直往更高级的网关(如果把自己的电脑也看成一级网关)查询都不到正确的ARP映射,就会放弃。
其中每一级的网关查询ARP失败,就会在这一层网络进行广播,如果目的机(消费者的MAC地址)做出了回应,那么就不用再往上查询。但这种回应可以进行欺骗,详情可了解一下ARP欺骗。
跨网段的IP寻址会有更复杂的情况。
4.那么路由器如何区分数据是一个响应还是一个请求?
响应,请求有很多地方都有这个概念,比如应用层中的响应和请求(HTTP REQUEST/RESPONSE)和数据链路层的响应和请求(例如第三点提到的ARP请求 与 ARP响应),这个问题应该要分开作答。
目测题主是想问链路层的REQUEST/RESPONSE,例如ARP请求与ARP响应,请求与响应分别对应ARP数据包中的opcode字段 request 与 reply。
ARP请求为广播,ARP响应为单播,详细过程可以自己阅读相关文章。
如果是应用层的REQUEST/RESPONSE,那么首先是什么应用层协议,例如HTTP协议,通过报文头中的字段进行区分。又如XMPP协议中的IQ流,当type属性为get/set时通常就是请求,当type属性为其他,例如cancel/error/result时通常为响应。特别的,在XMPP协议中,客户端也可以响应服务端。
要讲清楚的话内容就很多了,大概如下:
服务器向客户端所在机器传递数据?
需要看其处于哪个层次。
内网属于同一网段,当路由器检测到分组的IP地址的网络号属于本网络时,路由器并不会将其转发。事实上是通过查找到目的IP地址对应的MAC地址,在本网内直接到达目的客户端(很可能经由交换机转发)。
基本上来说,路由器并不需要区分数据是响应还是请求,路由器的作用就是路由选择,目的就是如何将数据从一个网络转发到另一个网络,并最终到达目的网络,这个选择的过程是很复杂的。建议了解下计网知识,可以参考自顶向下。