文章目录
网络编程——第一章
1.1 网络应用编程模型
**数据通信模式:**分散式系统、集中式系统、分布系统式
-
在分布式系统的基础上进一步抽象出来的编程模型:
-
C/S模式(Client/Server):
-
主要特点:胖客户端应用程序变成架构,主要工作都是在客户端完成
-
C/S模式将网络事务处理分为两部分 客户端和服务端Client用于位用户提供操作,通识向网络提供请求服务, Server负责接受并处理客户端发出的服务请求,将处理结果返回客户端
编写服务端应用程序建议使用WCF,客户端建议使用WPF
-
-
P2P模式(peer to peer)
-
B/S(Browse/Server):B/S模式的应用程序也叫WEB应用程序
-
仅用HTTP(Hypertext Transfer Protocol,超文本传输协议)进行通信
-
优点:单台计算机可以访问认可Web服务器
-
采用三层架构:
-
-
1.2 TCP/IP网络协议
TCP/IP四层协议中将五层结构中的物理层和数据链路层的功能全都放到了网络接口层中,五层结构主要是将OSI中的会话层和表示层放到了应用层中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5Cm0PdF-1587011641639)(https://img2018.cnblogs.com/blog/1941724/202002/1941724-20200229164237727-1018421075.png)]
数据链路层之间传输的是真
网络层发送的是数据报 给数据加上IP得知
传输层给数据加上端口号
-
应用层:负责应用程序之间的沟通,主要协议有简单SMTP(邮件传输)、FTP(文件传输协议)、Telnet(网络远程访问协议)
-
传输层:该层提供节点间的数据传送以及应用程序之间的通信服务,主要功能是格式化数据、数据确认和丢失重传等,把数据报加入传输数据并把它传送到下一层中。主要协议有:TCP(传输控制协议)、UDP(用户数据报协议) TCP是面向连接的 UDP无连接
-
网际层:主要功能是把数据报通过最佳路径送到目的端,不检查数据包是否被正常接收,核心协议——ip协议
-
网路接口层层:mac地址 完成点到点的运输 扶着接收ip数据报转交给下一层。
1.3 传统的网络编程技术
1. 套接字编程(socket)(作用在网络层和传输层之间的)
- 套接字是支持TCP/IP网络通信的基本操作单元
- 一个套接字实例中保存有本地的IP地址和端口、对方的IP地址和端口、双方通信才有的网络协议等信息
- 套接字的三种不同类型:
- 流式套接字(SOCK_STREAM):实现面向连接的TCP通信
- 数据报套接字(SOCK_DGRAM):实现无连接的UDP通信
- 原始套接字:实现IP数据报通信
- 基于TCP和UDP的应用程序中,可以使用TcpListener类、TcpClient类、UdpClient类或Socket类实现。而编写自定义的新网络协议程序时,则只能用Socket类来实现。
2. TCP应用编程(TCPClient类、TcpListener类)
- IP连接领域有两种通信类型:面向连接的(Connection-Oriented)和无连接的(Connectionless)
- 在面向连接的套接字中,使用TCP来建立两个IP地址端点之间的会话。一旦建立了这种连接,就可以在设备之间进行可靠的数据传输。
- TCP应用编程具体实现上:服务端使用TcpListener类,客户端使用TcpClient类;或者全部使用Socket实现。
3. UDP应用编程
- UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。因此,在程序中很难确定有哪些服务器和客户端。
- 具体实现:UdpClient类是在UDP层面对套接字编程的进一步封装。
1.4 IP地址转换与域名解析(IP地址转换与域名解析在System.Net命名空间下进行)
1.IP地址与端口
- 在网络上,识别远程主机的信息主要由:
- 主机标识(IP)号:确定主机
- 端口号:确定进程
注意私有IP和公有IP的区别私有IP是一个封闭网络中对内部的主机进行分配的 , 公有ip是在全网范围内不同的主机所分配的标识
- IP地址:
-
子网掩码:用于屏蔽IP地址的一部分以区分网络标识和主机标识
-
子网掩码把所有的网络位用1来表示,主机位用0来标识
- eg: 如果将子网掩码设置为255.255.255.0,则对于IP地址192.168.1.X,其网络标示部分为192.168.1;主机标示为:X -
目前IP地址主要有两种编址方案:
-
IPV4编址方案:用点分十进制法共分为五类
-
A类:0.x.x.x~127.x.x.x (32位最高位为0)
-
B类:128.x.x.x~191.x.x.x (32位最高2位为10)
-
C类:192.x.x.x~223.x.x.x (32位最高3位为110)
-
D类:224.x.x.x~239.x.x.x(32位最高4位为1110)
-
E类:240.x.x.x~255.x.x.x(32位最高5位为11110)
A类:网络位·主机位·主机位·主机位 可容纳1600万台机器 A类中有一个特殊IP地址127.0.0.1用于本机的回路测试
B类:网络位·网络位·主机位·主机位 65535台机器
C类:网络位·网络位·网络位·主机位 255台机器
D类用于组播,E类用于科学研究。 TCP/IP协议规定用1110开始的地址都为多点广播地址
-
-
-
- 端口:
- 物理意义上的端口
- 逻辑意义上帝的端口,即进程标识,端口号的范围从0到65535 HTTP的端口号为80 FTP为21
- 网络编程中的端口为逻辑意义上的端口
- 1000以内的端口号大多被标准协议所占用;应用程序中可以自由使用的端口号一般都使用大于1000的值。
2. IP地址转换成相关类
需要掌控的几个基本类:
-
IPAddress类 提供网际协议IP地址:
-
IPAdress位于System.Net命名空间下,提供对IP地址的转换和处理功能。
-
常用方法:Parse类将IP地址字符串类型转化为IPAddress类型:
-
Try { IPAddress ip = IPAddress.Parse("143.24.20.36"); } Catch { MessageBox.Show("请输入正确的IP地址!"); }
-
-
如果IP地址字符串格式不正确,调用Parse方法时会出现异常。
-
利用实例的AddressFamily属性可以判断IP地址的类型
`IPAddress ip = IPAddress.Parse("::1"); if (ip.AddressFamily == AddressFamily.InterNetworkV6) { MessageBox.Show("这是IPv6地址"); }`
-
IPAdress类还提供了7个只读字段,分别代表程序中使用的特殊IP
-
-
包含IP地址和端口号的IPEndAddress类:
-
IPEndPoint描述应用程序连接到主机上的服务所需的主机和端口信息
-
public IPEndPoint(IPAddress address, int port);
第一个参数指定IP地址,第二个参数指定端口号。
-
eg:
IPAddress localAddress = IPAddress.Parse("192.168.1.1"); IPEndPoint iep = new IPEndPoint(localAddress, 65000); string s1 = "IP地址为:" + iep.Address; string s2 = "IP端口为:" + iep.Port;
-
-
-
为Internet或Intranet主机体统信息容器的IPHostEntry类:
-
IPHostEntry类将一个域名系统(DNS)的主机名与一组别名和一组匹配的IP地址关联。该类和一般Dns类一起使用。
DNS(域名系统)是用来将域名和IP地址进行映射转换的分布式数据库
-
-
常用属性:
- AddressList属性:获取或设置与主机关联的IP地址列表(包括IPv4和IPv6)
- HostName属性:包含了指定主机的主机名
- Dns类的静态方法GetHostEntry()能够获得IPHostEntry对象:
- eg :
IPAddress[] ips = Dns.GetHostEntry(“news.sohu.com”).AddressList;
- eg :
3. 域名解析
-
Donmain Name system(域名系统)DNS
-
-
-
Dns类常用方法:
方法名称 | 说明 |
---|---|
GetHosstAddressess | 返回指定主机的Internet协议IP地址,与该方法对应的还有异步方法 |
GetHostEntry | 将主机名或IP地址解析为IPHostEntry实例,与该方法对应的还有异步方法 |
GetHostName | 获取本地计算机的主机名 |
-
GetHostAddresses方法:
-
利用GetHostAddresses方法可以获取指定主机的IP地址,该方法返回一个IPAddress类型的数据
-
方法原型为 public static IPAddress[] GetHostAddress(string hostNameOr Address)
参数是要解析的主机名或IP地址
-
eg: IPAddress[] ip = Dns.HostAddress(“www.cctv.com”)
-
若hostNameOrAddress是IP地址,则直接返回此地址;若hostNameOrAddress是空字符串,则返回本机所有IPv4和IPv6地址。
-
-
-
GetHostEntry方法:
-
GetHostEntry方法可返回一个IPHostEntry实例,用于在DNS服务器中查询与某个主机名或IP地址关联的IP地址列表。
-
方法原型为:public static IPHostEntry GetHostEntry (string hostNameOrAddress)
参数中的hostNameOrAddress表示要解析的主机名或IP地址
-
-
当参数为空字符串时,返回本地主机的IPHostEntry实例。
- eg:
IPHostEntry host = Dns.GetHostEntry("");
var ipAddresses = host.AddressList; //获取本机所有IP地址
string name = host.HostName; //获取本机主机名
- eg:
-
-
GetHostName方法
-
该方法用于获取本机主机名
-
eg:
string hostname = Dns.GetHostName( );
-
-
1.5网卡信息检测和网络流量检测
1. 网卡信息检测相关类
-
**网络适配器:**又称网卡或网络接口卡(NIC),是连接计算机与网络的硬件设备。整理计算机上发往网线上的数据,并将数据分解为适当大小的数据包之后向网络上发送。
-
System.Net.NetworkInformation命名空间提供了:
- 对本机网卡相关信息的检测比如本机有多少网卡,网卡名称、速度、硬件地址等。
- 对本机网络流量的检测比如网络连接配置、接收与发送的数据包等。
-
NetworkInterface类:
-
NetworkInterface类提供了网络适配器的配置和统计信息。可以利用这个类检测本机有多少个网络适配器、网络适配器型号以及网络适配器的速度等。
-
本机的每一个网络适配器都包含一个NetworkInter对象与之相对应
-
可以通过静态方法获取网络适配器对象
- NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterface();
-
NetworkInterface常用的属性:
属性及方法 说明 Name属性 网络适配器名称 Speed属性 网络适配器速度 GetAllNetwordInterfaces方法 返回描述本地计算机上的所有网络适配器对象 GetIPProperties方法 返回描述此适配器配置的对象 GetIsNetworkAvailable方法 指示是否有任何可用的网络连接 GetPhysicalAddress方法 返回此适配器的媒体访问控制(MAC)地址 Supports方法 指示接口是否支持指定的协议(IPv4或IPv6)
-
-
IPInterfaceProperties类
-
可以利用这个类检测本机所有网络适配器支持的各种地址。检测本机所有网络适配器支持的各种地址(IPv4和IPv6的网络适配器地址信息),如Dns服务器的IP地址、网关地址以及多路广播地址。
-
IPInterfaceProperties类是抽象类,不能实例化。可以通过NetworkInterface对象的GetIPProperties()获得其实例
- eg:
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
IPInterfaceProperties adapterProperties = adapters[0].GetIPProperties();
- eg:
-
IPInterfaceProperties类常用的方法:
-
属性及方法 说 明 AnycastAddresses属性 获取分配给此接口的任意广播P地址 DhcpServerAddresses属性 获取此接口的动态主机配置协议(DHCP)服务器的地址 DnsAddresses属性 获取此接口的域名系统(DNS)服务器的地址 DnsSuffix属性 获取与此接口关联的域名系统(DNS)后缀 GatewayAddresses属性 获取此接口的网关地址 MulticastAddresses属性 获取分配给此接口的多路广播地址 UnicastAddresses属性 获取分配给此接口的单播地址 GetIPv4Properties方法 获取此网络接口的Internet协议版本4(IPv4)配置数据 GetIPv6Properties方法 获取此网络接口的Internet协议版本6(IPv6)配置数据
-
-
2.网络流量检测相关类:
-
IPGlobalProperties:
-
提供了本地计算机网络连接和统计数据的信息
- eg: 接受的数据包个数、丢失的数据包个数等
-
检测网络流量时,首先调用IPGlobalProperties类提供的静态方法GetIPGlobalProperties得到IPGlobalProperties的实例,然后通过该实例的相关属性即可得到需要的信息。
-
eg:
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties()
-
名 称 说 明 GetActiveTcpConnections 返回有关本地计算机上的 Internet 协议版本 4 (IPV4) 传输控制协议 (TCP) 连接的信息 GetActiveTcpListeners 返回有关本地计算机上的 Internet 协议版本 4 (IPV4) 传输控制协议 (TCP) 侦听器的终结点信息 GetActiveUdpListeners 返回有关本地计算机上的 Internet 协议版本 4 (IPv4) 用户数据报协议 (UDP) 侦听器的信息 GetIPv4GlobalStatistics 提供本地计算机的 Internet 协议版本 4 (IPv4) 统计数据 GetIPv6GlobalStatistics 提供本地计算机的 Internet 协议版本 6 (IPv6) 统计数据 GetTcpIPv4Statistics 提供本地计算机的传输控制协议**/Internet** 协议版本 4 (TCP/IPv4) 统计数据 GetTcpIPv6Statistics 提供本地计算机的传输控制协议**/Internet** 协议版本 6 (TCP/IPv6) 统计数据
-
-
-
**TcpConectionInformation类:**提供本机传输控制协议(TCP)连接的信息
-
eg:
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); TcpConnectionInformation[] connections = properties.GetActiveTcpConnections(); foreach (TcpConnectionInformation t in connections) { string str = "本机:" + t.LocalEndPoint.Address+ ",远程:" + t.RemoteEndPoint.Address+ ", 状态:" + t.State; listBox1.Items.Add(str); }
-