网络编程概述

    踌躇了好长时间,总是觉得应该学习,但是自制力不够啊,今天终于定下决心来学习。关于.NET的网络编程就从这个起点开始。

    在学习网络编程之前,首先要了解一些基本知识:网络体系结构,专用名词。

网络体系结构

    计算机网络是一个非常复杂的系统,需要解决的问题很多并且性质各不相同。在计算机网络产生之初,每个计算机厂商都有自己的一套网络体系结构,但是这就造成了不同体系结构之间的互不兼容性,为此,国际化标准组织在1979年成立了一个分委员会来专门研究一种专门用于开放系统互连的体系结构(Open System Interconnect,OSI)。当然这样的意思就是只要遵循OSI标准,一个系统可以和位于世界上任何地方的、也遵循OSI标准的其他任何系统进行连接。使用OSI模型虽然解决了不同厂商、不同结构之间互连时遇到的不兼容性问题,但是该模型的复杂性阻碍了其在计算机网络中的应用,而由技术人员自己开发的传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol,TCP/IP)协议族模型却获得了更为广泛的应用,成为因特网的基础。实际上,TCP/IP也是目前因特网范围内运行的唯一一种协议。

    OSI参考模型将计算机网络通信定义为一个七层框架模型,分别为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网际层、运输层、应用层。

专用名词
    主要有:IP地址、子网和子网掩码、端口号、地址解析、域名系统、数据封装与解封装。

  • IP地址

    IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。说的浅显一些就是告诉大众:“我就在******** ******** ******** ********,要找我将就来这里”,这样在网络里自己就有一个属于自己的地址,或者还可以说成是,我目前使用的这台计算机在网络里编号是“******** ******** ******** ********”。格式方面,目前使用的IPV4,就是有4段数字,每一段最大不超过255。那局域网怎么分配IP地址呢?互联网上的IP地址统一由一个叫“IANA”(Internet Assigned Numbers Authority,互联网网络号分配机构)的组织来管理(具体细节在这里不需要细究)。

  • 子网和子网掩码

    为了便于表达和识别,IP地址是以十进制形式表示的如210.52.207.2(称之为点分十进制),每段所能表示的十进制数最大不超过255。为什么要进行子网划分呢?因为子网的划分只是为了区分各个网络的不同,管理和访问性等,就好象每个省为什么要划分很多个市,每个市要划分很多个县一样的道理。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类,下面就是我们常用的A-C类地址:

 

网络类别 最大网络数 第一个可用的网络号 最后一个可用的网络号 每个网络中的最大主机数
A 126 1 126 16777214
B 16382 128.1 191.255 65534
C 2097150 192.0.1 223.255.255 254

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。简单来说,子网掩码就是把IP地址中属于网络号的位置的值用“1”代替,把属于主机号的位置的值用“0”代替。

     当然,我们要了解一下公有地址和私有地址。公有地址(Public address)由Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。而私有地址(Private address)属于非注册地址,专门为组织机构内部使用。但是注意,以下列出留用的内部私有地址
  A类 10.0.0.0--10.255.255.255
  B类 172.16.0.0--172.31.255.255
  C类 192.168.0.0--192.168.255.255

    至于为什么要这样分类?因为最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。

  • 端口号

    在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。当然在网络编程的时候使用的是后者,TCP/IP使用的是一个16位的整数来标识一个端口,由于TCP协议和UDP协议时两个完全独立的软件模块,因此各自的端口号也相互独立,比如说TCP中可以有一个8080号端口,UDP中也可以有一个8080号端口。

  • 地址解析

    地址解析(Address Resolution)是指转换或表达一个系统中的实体地址到第2个系统中相同实体中的等价地址的过程,当两个寻址系统是指相同实体时。例如,将一个 IP 地址转换为它特定的域名服务器名,或转换一个 IP 地址到它的 MAC 地址。实际上就是将计算机中的协议地址翻译成物理地址(或称为MAC地址,即媒体映射地址)。当然在TCP/IP协议中包含了地址解析协议(Address Resolution Protocol,ARP)。ARP标准定义了两种基本信息类型:请求和响应。当一台主机要求转换为一个IP地址的时候,它广播一个含有该IP地址的ARP请求,如果该请求与一台机器(之所以说机器而不说计算机,是由于除计算机外有些机器也拥有IP地址,如路由器等)的IP相匹配,则该机器发出一个含有所需物理地址的响应。响应是直接发给广播该请求的机器的。

  • 域名系统

    域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。一个系统全域名由主机名、域名和扩展名三部分组成,各部分之间用“.”分隔。使用域名的目的就是利用简单的词段来代替复杂的点分十进制IP地址,诚然,IP地址与域名之间需要转换,这就涉及到了“域名解析”(应该就是去查找数据库,找到匹配项)。

 

  • 数据封转与解封装

    当主机要通过网络向其他设备发送数据时,首先要对数据进行打包,这一过程就称之为数据封装。在TCP/IP中,为了实现通信并交换信息,每一层都有各自的协议数据单元(Protocol Data Units,PDU),通过封装使每个PDU附加到数据上。这一过程就是数据一步一步在经过的地方被操作了,如:链路层中被操作为数据帧,在网络层则是数据包,在传输层则是数据段。
    解封装则是数据封装的逆过程,当目的主机收到一个以太网中的数据帧是,数据就开始行协议栈中由底向上,同时去掉各层协议加上的报文首部。


了解了这些知识之后,就正式开始网络编程的基础知识。

 

C#中的网络编程

     C#所使用的类库是.Net框架中的类库——.Net Framework SDK,它提供了两个顶层的命名空间:System.Net和System.Web,当然这两个命名空间还有很多底层命名空间,这些就只有在用到的时候再去研究,但是要知道我们常用的有System.Net、System.Net.Sockets和System.Web这三个。


在编程中主要使用的类:IP地址类,DNS类。


    IP地址类主要在System.Net命名空间下,IPAddress类就是表示一个IP地址;IPHostEntry类是为Internet主机地址信息提供容器的类,它将DNS主机名与与一个别名数字和匹配的IP地址数组相关,它通常作为DNS的辅助类;IPEndPoint类是将IP地址和端口号的形式表示一个网络终端。该类中包含应用程序连接到主机服务时需要的主机和端口信息,通过组合主机的IP地址和端口号构成服务的一个连接点。
    DNS类是一个静态类,它提供了有关域名解析的操作。DnsPermission类则是控制对网络DNS服务器的访问。默认情况下,所有本地和Internet域中的应用程序都能访问DNS服务,并且对Internet应用程序无DNS许可。


例子:获取本机的IP和主机名

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Net;
6 using System.Management;
7
8 namespace 获取主机名和IP地址
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 string hostName = Dns.GetHostName();//获取本地计算机名
15 ShowMsg("本地计算机名",hostName);
16
17 IPHostEntry ip = Dns.GetHostEntry(hostName);//获取与主机关联的 IP 地址列表
18 IPAddress[] addr = ip.AddressList;
19 //显示本机ip
20 for (int i = 0; i < addr.Length; i++)
21 {
22 ShowMsg("IP地址"+i,addr[i].ToString ());
23 ShowMsg("IP地址类型"+i,addr[i].AddressFamily.ToString());
24 }
25 Console.ReadKey();
26 }
27
28 static void ShowMsg(string title,string msg)
29 {
30 Console.WriteLine(title+":"+msg);
31 }
32 }
33 }



posted on 2012-02-28 18:10  WaitingSky  阅读(616)  评论(0编辑  收藏  举报