第02章 网络协议与套接字【研究材料】_第1页
第02章 网络协议与套接字【研究材料】_第2页
第02章 网络协议与套接字【研究材料】_第3页
第02章 网络协议与套接字【研究材料】_第4页
第02章 网络协议与套接字【研究材料】_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章 网络协议与套接字,2.1 网络协议简介 2.2 IP地址转换与域名解析 2.3 套接字 2.4 网卡信息检测与网络流量检测 2.5 字符编码与解码,2.1 网络协议简介,协议协议能确保网络上的计算机能相互识别对方的信息。计算机的通信协议精确地定义了计算机在彼此通信过程的所有细节。例如,每台计算机发送的信息格式和含义,在什么情况下应发送规定的特殊信息,以及接收方的计算机应做出哪些应答等等。 TCP/IP是一组协议的总称(Transmission Control Protocol/Internet Protocol) 网际协议(IP)对底层硬件设备进行封装,使之能适应各种网络硬件,确保任何

2、一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入 Internet 。,2.1 网络协议简介(续),传输控制协议(TCP) IP只是保证计算机之间可以发送和接收资料,但IP协议不能解决资料分组在传输过程中可能出现的问题。因此,计算机还需要安装TCP协议来提供可靠的并且无差错的通信服务。 TCP被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP会让它们建立一个连接、发送和接收资料以及终止连接。 TCP能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。

3、 TCP协议具有自动调整超时值的功能,能很好地适应 Internet 上各种变化,确保传输数值的正确。,2.1 网络协议简介(续),TCP/IP模型该模型将Internet分为五个层次,从高到低依次为:应用层、传输层、互联网层、网络接口层、物理层,2.1 网络协议简介(续),(1)应用层(第5层)定义了应用程序使用互联网的规范。如简单邮件传输(SMTP)文件传输协议(FTP)网络远程访问协议(Telnet)等。 (2)传输层(第4层) 提供节点间的数据传送服务,为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。包括:传输控制协议(TCP)用户数据报协议(UDP),2.1 网络协议简介

4、(续),(3)互连网层(第3层) 定义了互联网中传输的“信息包”格式,以及从一个用户通过一个或多个路由器到最终目标的信息包转发机制。 (4)网络接口层(第2层) 定义如何使用网络来传送数据。 (5)物理层(第1层) 对应于网络的基本硬件,即我们可以看得见的硬设备,如PC机、互连网服务器、网络设备等。该层对硬设备的电气特性作一个规范,使各设备能互相连接并兼容使用。,2.1 网络协议简介(续),IP地址:是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围内惟一的标识符。一个IP地址主要由两部分组成:网络地址和主机地址。 网络地址由因特网权力机构分配,主机地址由各个网络的管理员统一分配。

5、IP地址编制方案有两种:IPV4和IPV6IPV4:二进制表示共32位(4个字节)IPV6:二进制表示共128位(16个字节) 在IPV4编制方案中,一般使用点分十进制表示法表示IP地址。例如:,2.1 网络协议简介(续),端口:IP地址仅仅能够具体标识到某台主机,而端口则表示与计算机上的哪个进程通信。 根据IP地址找到是与哪台机器通信,根据端口号找到是与该机器的哪个进程通信。 (一个进程可能会使用多个端口) 端口地址的范围是十进制的065535,2.2 IP地址转换与域名解析,2.2.1 IPAddress类 提供了对IP地址的转换、处理 2.2.2 IPEndPoin

6、t类 IP地址和端口的组合 2.2.3 IPHostEntry类 将域名系统与一组匹配的IP地址关联在一起。 2.2.4 Dns类 提供域名解析及其与IP地址之间的相互转换功能,2.2.1 IPAddress类,IPAddress类(System.Net命名空间下):一般使用IPAddress的Parse方法将IP地址字符串转换为IPAddress的实例。例如:IPAddress ip = IPAddress.Parse(“”); 属性 Any 提供一个IPv4地址,指示服务器应侦听所有网络接口上的客户端活动。(等效于) Broadcast 提供IPv4广播

7、地址(等效于55) Loopback 表示IPv4回送地址(等效于) None 表示Socket不应侦听客户端活动(不使用任何网络接口)。 IPv6Any 提供可用的IPv6地址 IPv6Loopback 表示IPv6回送地址 IPv6None 提供不使用任何网络接口。,2.2.2 IPEndPoint类,IPEndPoint类包含了连接到主机上的服务所需的IP地址和端口信息。 IPEndPoint类常用的构造函数为: public IPEndPoint(IPAddress, int); 其中第一个参数指定IP地址,第二个参数指定端口号。,2.2.3

8、 IPHostEntry类,IPHostEntry类的实例对象中包含了与主机相关的信息。常用属性有:(1)AddressList属性:获取或设置与主机关联的IP地址列表,是一个IPAddress类型的数组,包含了指定主机的所有IP地址; (2)HostName属性:包含了服务器的主机名。 在Dns类中,有一个专门获取IPHostEntry对象的方法。 例如:IPAddress ips = Dns.GetHostEntry(“).AddressList;,2.2.4 Dns类,DNS(Domain Name System,域名系统)提供了一系列静态的方法,用于获取提供本地或远程域名等功能,常用方

9、法有: (1)GetHostAddresses方法 获取指定主机的IP地址,返回一个IPAddress类型的数组。格式为: public static IPAddress GetHostAddresses(string hostNameOrAddress); 例如:IPAddress ips=Dns.GetHostAddresses(); 注意:如果hostNameOrAddress是IP地址,则不查询DNS服务器,直接返回此地址。,2.2.4 Dns类(续),(2)GetHostEntry方法 在DNS服务器中查询与某个主机名或IP地址关联的IP地址。 当参数为空字符串时,此方法返回本地主机

10、的IPv4地址和主机名。 例如: IPHostEntry host = Dns.GetHostEntry(); listBox1.Items.AddRange(host.AddressList); /本机所有IPv4地址 listBox1.Items.Add(host.HostName); /本机主机名 (3) GetHostName方法 获取本机主机名。 例如:string hostname = Dns.GetHostName();,2.2.4 Dns类(续),【例 2-1】IPAddress类、Dns类、IPHostEntry类和IPEndPoint类的使用方法。,2.3 套接字,套接字是

11、支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字通常和同一个域中的套接字交换数据,各种进程使用这个相同的域互相之间用Internet协议进行通信。 用C#编写符合标准的网络应用程序时,应该尽可能使用TcpListener类、TcpClient类、UDPClient类或其它对应类。而不是直接用Socket类。 用C#编写非标准的网络应用程序时,只能使用Socket类。,2.3.1 同步套接字与异步套接字,套接字的类型有: 流式套接字:提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且接

12、收数据的顺序和发送数据的顺序是相同的。 数据报套接字:提供了面向无连接的服务,它以独立的数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序和接收顺序相同 ,因此,可能出现数据的重发、丢失等现象。 原始套接字:用于直接访问协议的较低层。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提倡直接使用原始套接字。,2.3.1 同步套接字与异步套接字(续),使用套接字处理数据有两种基本模式: 同步套接字:在通过Socket进行连接、接收、发送操作时,客户机或服务器在接受对方响应前会处于阻塞状态,即一直等到接受对方请求后才继续执行下面的语句。同步套接字

13、适用于对数据处理用时不多的场合。 异步套接字:通过Socket进行连接、接收或发送操作时,客户端或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收以及发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的语句。异步套接字适用于进行大量数据处理或者用时较多的场合。,2.3.2 Socket类,Socket类包含在System.Net.Sockets命名空间中。 一个Socket实例包含了一个本地或者一个远程端点的套接字信息。 使用Socket类编程,由于很多细节都需要自己考虑,相对来说复杂一些,易出错。一般对套接字编程比较熟悉的人,或者使用非标准协议(自定义的新

14、协议)进行编程的时候,才使用Socket类。 Socket类的构造函数为: public Socket( AddressFamily addressFamily, /网络类型 SocketType socketType, /套接字类型 ProtocolType protocolType); /使用的协议,2.3.2 Socket类(续),Socket构造函数的三个参数中,对于网络上的IP通信来说,AddressFamily总是使用AddressFamily.InterNetwork枚举值。而SocketType参数则与ProtocolType参数配合使用,不允许其他的匹配形式,也不允许混淆匹配

15、。下表列出了可用于IP通信的组合。,2.3.3 面向连接的套接字编程,2.3.3 面向连接的套接字编程(续),服务器端部分代码举例: IPHostEntry local = Dns.GetHostByName(Dns.GetHostName(); IPEndPoint iep = new IPEndPoint(local.AddressList0, 1180); Socket localSocket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); localSocket.Bind(i

16、ep); locatSocket.Listen(10); Socket clientSocket = localSocket.Accept();,2.3.3 面向连接的套接字编程(续),客户端部分代码举例: IPAddress remoteHost = IPAddress.Parse(); PEndPoint iep = new IPEndPoint(remoteHost, 1180); Socket localSocket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.

17、Tcp); localSocket.Connect(iep); 关闭连接的典型用法: sock.Shutdown(SocketShutdown.Both); sock.Close();,2.3.4 无连接的套接字编程,2.3.5 对套接字封装后的类,TcpClient类和TcpListener类 TcpClient类是与TCP客户端相关的类,而TcpListener则用于在服务器端监听(Listen)客户端传来的连接请求。 两个类均对流式套接字进行了封装,简化了编程难度。 传输的数据可以使用.NET Framework中的流处理技术进行读写。 UdpClient类 对数据报套接字进行了封装 该

18、类使用UdpClient类的Send方法向网络发送数据,使用Receive方法接收传入的数据文报。,2.4 网卡信息检测与网络流量检测,System.Net.NetworkInformation命名空间提供了: 对本机网卡相关信息的检测比如本机有多少网卡,网卡名称、速度、硬件地址等。 对本机网络流量的检测比如网络连接配置、接收与发送的数据包等。 Ping类检测本机是否可访问网络上的其它计算机。 这些类在高级网络信息处理中很有用。,2.4.1 获取网卡信息,NetworkInterface类NetworkInterface类提供了网络适配器的配置和统计信息。可以利用这个类检测本机有多少个网络适配

19、器、网络适配器型号以及网络适配器的速度等。 IPInterfaceProperties类可以利用这个类检测本机所有网络适配器支持的各种地址 PhysicalAddress类提供了网络适配器的媒体访问控制(MAC)地址。,2.4.1 获取网卡信息(续),NetworkInterface类常用的属性和方法,2.4.1 获取网卡信息(续),IPInterfaceProperties类(抽象类)常用的属性和方法,2.4.1 获取网卡信息(续),【例2-2】获取本机网络适配器的个数、型号、速度、MAC地址以及DNS服务器信息。,2.4.2 获取网络流量信息,IPGlobalProperties类 提供本

20、地计算机网络连接相关的信息。例如网络连接配置、接收与发送的数据包等。 一般用法: using System; using System.Net.NetworkInformation; IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); IPGlobalStatistics ipstat = properties.GetIPv4GlobalStatistics(); listBox1.Items.Add(接收数据包数: + ipstat.ReceivedPackets); listBox1.Ite

21、ms.Add(转发数据包数: + ipstat.ReceivedPacketsForwarded); listBox1.Items.Add(传送数据包数: + ipstat.ReceivedPacketsDelivered); listBox1.Items.Add(丢弃数据包数: + ipstat.ReceivedPacketsDiscarded);,2.4.2 获取网络流量信息(续),TcpConnectionInformation类提供有关本地计算机上的传输控制协议(TCP)连接的信息。 IPGlobalProperties properties = IPGlobalProperties.

22、GetIPGlobalProperties(); TcpConnectionInformation connections = properties.GetActiveTcpConnections(); foreach (TcpConnectionInformation t in connections) string str = ; str += Local endpoint: + t.LocalEndPoint.Address; str += , Remote endpoint: + t.RemoteEndPoint.Address; str += , + t.State; listBox

23、1.Items.Add(str); ,2.4.2 获取网络流量信息(续),【例2-3】检测本机网络流量以及TCP连接信息。,2.4.3 Ping类,可以使用Ping类检测本机是否可访问网络上的其它计算机。类似于Ping.exe命令行工具。 该类提供的Send和SendAsync方法将Internet控制消息协议(ICMP)回送请求消息发送到远程计算机并等待来自该计算机的ICMP回送答复消息。 与Ping类一起使用的类型有: IPStatus枚举:定义描述 ICMP 回送请求消息结果的状态代码 PingOptions类:控制如何传输 Ping 数据包(见下页) PingReply类:提供有关 S

24、end 或 SendAsync 操作的状态及产生的数据的信息,2.4.3 Ping类(续),PingOptions类:控制如何传输 Ping 数据包。与此类相关的属性有: Ttl 属性为 Ping 类发送的数据包指定生存时间。此值指示在丢弃 Ping 数据包之前可以转发此数据包的路由节点数。如果要测试将数据包从源计算机发送到目标计算机所需的转发数(也称为跃点),设置此选项很有用。 DontFragment 属性控制是否可将发送到远程主机的数据分成多个数据包。如果要测试用于传输数据包的路由器和网关的最大传输单元 (MTU),此选项很有用。,2.4.3 Ping类(续),用法 string ipS

25、tring = ; Ping pingSender = new Ping(); PingOptions options = new PingOptions(); options.DontFragment = true; string data = 12345678901234567890; byte buffer = Encoding.ASCII.GetBytes(data); int timeout = 120; PingReply reply = pingSender.Send(ipString, timeout, buffer, options); if (reply.

26、Status = IPStatus.Success) listBox1.Items.Add(Address: + reply.Address.ToString(); listBox1.Items.Add(RoundTrip time: + reply.RoundtripTime); listBox1.Items.Add(Time to live: + reply.Options.Ttl); listBox1.Items.Add(Buffer size: + reply.Buffer.Length); ,2.4.3 Ping类(续),【例2-4】Ping类的用法。,2.5 字符编码与解码,编码:

27、是指将一组字符转换为一个字节序列的过程。 解码:将一个编码字节序列转换为一组字符的过程。 为什么需要编码和解码因为通过网络传递的数据必须是字节序列。 常用编码 ASCII码:每个字符均为7位,主要针对英文。 UNICODE码:每个字符均占两个字节。 UTF码:通用转换码,主要解决编码容量问题,常用有(1)UTF-8:用1到4个字节编码一个UNICODE字符 (2)UTF-16:将每个字符编码为1至2个16位整数组成的序列 (3)UTF-32:将每个字符编码为一个32位整数 国标码:常用有 GB2312(1980年公布,提供65535个汉字) GB18030(2000年公布,提供27484个汉字

28、),2.5.1 Encoding类,Encoding类位于System.Text命名空间中。,2.5.1 Encoding类(续),用法举例: Encoding GB2312 = Encoding.GetEncoding(GB2312); Encoding GB18030 = Encoding.GetEncoding(GB18030); /将Unicode字符串转换为UTF8字符串: string unicodeString = 该字符串包含unicode字符Pi(u03a0); Encoding utf8 = Encoding.UTF8; Encoding unicode = Encodin

29、g.Unicode; / 将字符串转换为字节数组 byte unicodeBytes = unicode.GetBytes(unicodeString); / 将unicode字节数组转换为utf8字节数组 byte utf8Bytes = Encoding.Convert(Encoding.Unicode,Encoding.UTF8, unicodeBytes); /将字节数组转换为字符串 string utf8String = Encoding.UTF8.GetString(utf8Bytes);,2.5.2 Encoder类和Decoder类,Encoder类:将一组字符转换为一个字节序列。举例: Char chars = new Char u0023, / # u0025, / % u03a0, / Pi u03a3 / Sigma ; /显示原始Unicode字符串 listBox1.Items.Add(new string(chars); Encoder encoder = Encoding.UTF8.GetEncoder(); Byte bytes = new Byteencoder.GetByteCount( chars, 0, chars.Length, true); encoder.G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论