两台主机之间如何进行通信

本文深入解析了同网段和跨网段下两台主机如何通过TCP/IP协议进行通信的详细过程,包括应用层、传输层、网络层、数据链路层及物理层的数据封装与解封装,以及交换机和路由器在数据传输中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两台主机通信分为:同网段下通信和不同网段下通信
1、同网段下:
两台主机之间如何进行通信
应用层:主机通过tcp/ip协议中的tcp应用端口进行通信要求,主机通过打开一个会话应用窗口,通过逻辑软件的链接和相互配合(检查ARP缓存),将数据传到下一层;
传输层:进行分段,添加tcp报头(源端口,目的端口),分段为了节省时间、传输占用率和解决错误麻烦率以及解决传输单元限制问题;
网络层:给数据添加IP报头(源IP,目的IP)封装成数据包,将封装数据包又传输到下一层;
数据链路层:在数据包前加入数据帧头(源物理地址,目的物理地址),后加入校验位封装成数据帧,将数据帧传输到下一层;
物理层:将数据帧转换成可以在物流链路进行传输的电子信号并送达交换机,交换机:通过数据流里数据帧的物理地址地址找寻目的主机的地址,将数据发送到目的主机;
目的主机:通过比对目的物理地址,确认为自己接收数据,则拆去数据帧头,发往网络层,网络层比对目的IP,相同则拆包发往传输层,传输层再比对目的端口,相同则拆去数据段交给应用程序进行数据组装,完成本次同网段下通信。
两台主机之间如何进行通信

2、不同网段下:
两台主机之间如何进行通信
主机在应用层—网络层—数据链路层—物理层—交换机时需要像在同网段一样进行传输,当数据帧到达交换机时,需将数据帧传输到三层路由器,通过路由器的找寻目的主机物理地址所处的路由器,在经过路由器找寻所处主机物理地址进行分配,将数据帧根据目的主机物理地址传输,然后进行拆包等一系列的过程传输到目的主机。
两台主机之间如何进行通信

转载于:https://blog.51cto.com/14205480/2355632

### 配置和实现两台主机之间基于ROS2的通信 #### 网络配置 确保两台计算机位于同一网络内并能相互访问。这可以通过检查双方IP地址以及尝试ping命令验证连通性来完成。 #### ROS 2环境准备 确认ROS 2已经成功部署于每一台目标设备之上,包括但不限于安装必要的依赖库、源码编译或是二进制包形式的安装方式[^1]。 #### 设置`ROS_DOMAIN_ID` 对于参与分布式计算场景下的节点而言,在每台机器上合理设定`ROS_DOMAIN_ID`环境变量至关重要;此操作有助于区分不同的DDS域从而避免冲突。具体做法是在终端执行如下指令: ```bash export ROS_DOMAIN_ID=<your_domain_id> ``` 其中 `<your_domain_id>` 是一个介于0至232间的整数值。 #### 启动Talker与Listener节点 - **主机A**:负责发送消息的角色,即启动talker程序; ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_publisher') publisher = node.create_publisher(String, 'topic', 10) msg = String() i = 0 while True: msg.data = f'Hello World: {i}' i += 1 node.get_logger().info(f'Sending message: "{msg.data}"') publisher.publish(msg) time.sleep(1) if __name__ == '__main__': main() ``` - **主机B**:作为接收方监听来自其他节点的消息,也就是listener部分; ```python import rclpy from std_msgs.msg import String def callback(message): print(f'Received message: "{message.data}"') def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_subscriber') subscription = node.create_subscription( String, 'topic', callback, 10) try: rclpy.spin(node) finally: node.destroy_node() if __name__ == '__main__': main() ``` 上述代码片段展示了如何创建一对简单的发布者/订阅者应用实例以测试跨主机间的信息交换功能。 #### Docker容器化方案(可选) 当涉及到更复杂的生产环境中时,采用Docker镜像打包应用程序不失为一种有效手段。此时需注意调整宿主机上的路由规则以便让不同物理位置处运行着各自独立容器集群得以顺利交互数据流。针对此类情况的具体实践方法已在参考资料中有提及[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值