远程桌面MSTSC与ICMP协议【PING】的区别

发布于:2023-01-06 ⋅ 阅读:(1604) ⋅ 点赞:(1)

之前曾开发一个项目软件【Client】和一台检测设备【Server】进行TCP通信,假设检测设备【Server】的IP地址是192.168.1.100.使用CMD的ping 192.168.1.100 发现无法连接,但TCP通信的发送和接收居然完全正常,然后远程桌面mstsc也可以正常连接。查看资料,发现mstsc和ping命令属于不同的协议范畴。

MSTSC

Mstsc端口号是:3389。
Mstsc (Microsoft terminal services client)端口,是远程控制端口,创建与终端服务器或其他远程计算机的连接

mstsc 与远程客户端之间是用Microsoft的远程桌面协议(Remote Desktop Protocol,简称RDP) 连接的,而windows xp的rdp有1个并发数的连接限制。

远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或'本地计算机')连上提供微软终端机服务的计算机(称为服务端或'远程计算机')。

大部分的Windows版本都有用户端所需软件,有些其他操作系统也有这些用户端软件,例如Linux,FreeBSD,MacOSX,服务端计算机方面,则听取送到TCPport3389的数据。

 windows系统自带了远程桌面activex dll,所在路径:
   c:\Windows\System32\mstscax.dll
   此类库无法使用c#直接调用,介绍一个工具AxImp.exe,路径:
     C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\AxImp.exe
   ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件。
   控件转换:
在cmd输入以下命令
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\AxImp.exe" "c:\Windows\System32\mstscax.dll"
即可生成AxMSTSCLib.dll,MSTSCLib.dll

Visualstudio2017中新建窗体应用程序MstscDemo。添加对类库AxMSTSCLib.dll,MSTSCLib.dll的引用,主要源程序如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
/*
 * windows系统自带了远程桌面activex dll,所在路径:
   c:\Windows\System32\mstscax.dll
   此类库无法使用c#直接调用,介绍一个工具AxImp.exe,路径:
     C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\AxImp.exe
   ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件。
   控件转换:
在cmd输入以下命令
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\AxImp.exe" "c:\Windows\System32\mstscax.dll"
即可生成AxMSTSCLib.dll,MSTSCLib.dll
*/

namespace MstscDemo
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 继承于AxHost【ActiveX】的控件,将ActiveX作为控件使用
        /// </summary>
        AxMSTSCLib.AxMsRdpClient7 rdpClient = null;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            rdpClient = new AxMSTSCLib.AxMsRdpClient7();
            rdpClient.OnDisconnected += RdpClient_OnDisconnected;
            this.Controls.Add(rdpClient);
            rdpClient.Dock = DockStyle.Fill;
            rdpClient.BringToFront();
        }

        private void RdpClient_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e)
        {
            MessageBox.Show("连接已断开:" + e.discReason);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                rdpClient.Server = "192.168.5.222";
                rdpClient.AdvancedSettings2.RDPPort = 3389;
                rdpClient.UserName = "administrator";
                rdpClient.Domain = "DomainName";
                rdpClient.AdvancedSettings5.ClearTextPassword = "Password";
                //rdpClient.AdvancedSettings5.RedirectDrives = parMachine.ShareDiskDrives;
                //rdpClient.AdvancedSettings5.RedirectPrinters = parMachine.SharePrinters;
                rdpClient.Connect();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

ICMP

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 [1] 

ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 [3]  它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。 [1] 

从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。

其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。

即使PING不同,并不代表无法进行TCP-SOCKET协议。

ping不通并不一定代表网络不通,因为ping是一个基于ICMP协议的命令,我们发出去一个数据包后,对方收到后会返还给我们一个数据包。但这并不是绝对的,因为协议是可以禁止的。禁止之后,如果我们ping对方,对方收到数据包之后就不会给我们回馈,ping的结果就会显示不通,但实际上我们的网络却还是连通的。而端口对应的是一项项服务,只要服务的门没有关闭,那么我们就能顺利登录。

ping命令参考博客:

C#Ping命令【因特网控制消息协议ICMP】_斯内科的博客-CSDN博客_c# ping

禁止PING命令 就无法测试是否连接到主机,但并不会影响TCP-SOCKET通信。


网站公告

今日签到

点亮在社区的每一天
去签到