c#网络编程(一)
c#网络编程也是我这学期学习的重点,虽然现在知道的网络知识很少,我会努力的,↖(^ω^)↗
一、四种IP广播地址
受限的广播
受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
一个未解的问题是:如果一个主机是多接口的,当一个进程向本网广播地址发送数据报时,为实现广播,是否应该将数据报发送到每个相连的接口上?如果不是这样,想对主机所有接口广播的应用必须确定主机中支持广播的所有接口,然后向每个接口发送一个数据报复制。
大多数BSD系统将255.255.255.255看作是配置后第一个接口的广播地址,并且不提供向所属具备广播能力的接口传送数据报的功能。不过,routed(见10.3节)和rwhod(BSDrwho客户的服务器)是向每个接口发送UDP数据报的两个应用程序。这两个应用程序均用相似的启动过程来确定主机中的所有接口,并了解哪些接口具备广播能力。同时,将对应于那种接口的指向网络的广播地址作为发往该接口的数据报的目的地址。
HostRequirementsRFC没有进一步涉及多接口主机是否应当向其所有的接口发送受限的广播。
指向网络的广播
指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
指向子网的广播
指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址。
指向所有子网的广播
指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如,如果目的子网掩码为255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。
二、必须知道的一些特殊IP地址
一、0.0.0.0
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的"不清楚"是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个"收容所",所有不认识的"三无"人员,一律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。
二、255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言,应该是这样:"这个房间里的所有人都注意了!"这个地址不能被路由器转发。
三、127.0.0.1
本机地址,主要用于测试。用汉语表示,就是"我自己"。在Windows系统中,这个地址有一个别名"Localhost"。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为"127.0.0.1"的数据包。
四、224.0.0.1
组播地址,注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP(Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。
五、169.254.x.x
如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。
六、10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x
私有地址,这些地址被大量用于企业内部网络中。一些宽带路由器,也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。在Internet上,这类地址是不能出现的。
对一台网络上的主机来说,它可以正常接收的合法目的网络地址有三种:本机的IP地址、广播地址以及组播地址。
三、网络字节序与主机字节序
1、不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
Little endian:将低序字节存储在起始地址
Big endian:将高序字节存储在起始地址
2、网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的字节序.
四、网络编程中常用的类
与IP地址相关的类有IPAddress类、IPHostEntry类、IPEndPoint类等
1、IPAddress类
<1>构造函数列表:
IPAddress(Byte[] address)
用于指定为byte数组的地址初始化IPAddress类的新实例。address表示IP地址的字节数组值
IPAddress(long address)
用指定为long的地址初始化IPAddress类的新实例。address:IP地址的长值。例如,big-endian格式的值0x2414188f肯能为IP地址“143.24.20.36”
IPAddress(byte[] address,long scopeid)
用指定的地址和范围初始化IPAddress类的新实例。此构造函数实例化一个IPv6地址。address:IP地址的字节数组值;scopeid:范围标识符的长值。
<2>公共字段
public static readonly IPAddress Any
提供一个IP地址,指示服务器应侦听所有网络接口上的客户端活动。Any字段等效于以点分割的四部分表示法格式的0.0.0.0
public static readonly IPAddress Broadcast
提供IP广播地址。该字段等效于以点分割的四部分表示法格式的255.255.255.255
public static readonly IPAddress Loopback
提供IP环回地址。该字段等效于以点分表示法格式的127.0.0.1
public static readonly IPAdress None
提供指示不应使用任何网络接口的IP地址。该字段等效于以点分割的四部分表示法格式的255.255.255.255
<3>公共属性
public AddressFamily AddressFamily{get;}
获取IP地址的地址类型。对于IPv4,返回InterNetwork;对于IPv6,返回internetnetworkV6。
<4>公共方法
public byte[] GetAddressBytes()
以字节数组形式提供IPAddress的副本
返回值:字节数组
IPAddress.Host ToNetworkOrder(int16/int32/int64)(重载)
将主机字节顺序转换为网络字节顺序
IPAddress.NetworkToHostOrder(int16/int32/int64)(重载)
将数字由网络字节顺序转换为主机字节顺序
public static bool IsLoopback(IPAddress address)
指示指定的IP地址是否是环回地址。
参数:address 表示IP地址
返回值:如果address是环回地址,则为true;否则为false
IsLoopback方法将address与Loopback进行比较,如果是IPV4,则IsLoopback方法将为任何形如127.x.y.z的IP地址返回true,而不仅仅限于127.0.0.1
public static IPAddress Parse(string ipString)
将IP地址字符串转换为IPAddress实例
参数:ipString包含IP地址(IPv4使用以点分隔的四部分表示,IPv6使用冒号十六进制表示法)的字符串
返回值:一个IPAddres实例。
部分数和示例 ipString IPAddress的IPv4地址
65536 0.0.255.255
20.2 20.0.0.2
20.65535 20.0.255.255
128.1.2 128.1.0.2
public static bool TryParse(string ipString ,out IPAddress address)
确定字符串是否为有效的IP地址
参数:ipString 要验证的字符串;address 字符串的IPAddress版本
返回值:如果ipString是有效IP地址,则为true;否则为false。
2、IPHostEntry类(为Internet主机地址信息提供容器类)
<1>构造函数
public IPHostEntry()
初始化IPHostEntry类的一个新实例
<2>公共属性
public IPAddress [] AddressList{get;set;}
获取或设置与主机关联的IP地址列表。
属性值
一个IPAddress类型的数组,包含解析为Aliases属性中包含的主机名的IP地址。
public string [] Aliases{get;set;}
获取或设置与主机关联的别名列表
属性值
一组字符串,包含解析为AddressList属性中的IP地址的DNS名称。
public string HostName{get;set;}
获取或设置主机的DNS名称
属性值
包含服务器的主要主机名的字符串。
3、IPEndPoint类(将网络端点表示为IP地址和端口号)
<1>构造函数
public IPEndPoint(int64,int32)
用指定的地址和端口号初始化IPEndPoint类的新实例。
public IPEndPoint(IPAddress,int32)
用指定的地址和端口号初始化IPEndPoint类的新实例。
<2>公共字段
public const int MaxPort
指定可以分配给Port属性的最大值。此字段为只读。
public const int MinPort
指定可以分配给Port属性的最小值。此字段为只读。
<3>公共属性
public IPAddress Address {get;set;}
获取或设置终结点的IP地址。
public override AddressFamily AddressFamily{get;}
获取网际协议(ip)地址类型。
属性值:返回 AddressFamily.InterNetwork
public int Port{get;set;}
获取或设置终结点的端口号。
属性值:介于minport到maxport之间的整数值,指示终结点的端口号。
<4>公共方法
public override EndPoint Create(SocketAddress socketAddress)
从套接字地址创建终结点。
public override SocketAddress Serialize()
将终结点信息序列化为SocketAddress实例
4、Dns类(提供简单的域名解析功能)
<1>公共方法
public static IPAddress [] GetHostAddresses(string hostNameOrAddress)
返回指定主机的Internet协议地址。
参数:
hostNameOrAddress 要解析的主机名或IP地址
public static IPHostEntry GetHostByName(string hostName)
参数:hostName:主机的DNS名称
public static IPHostEntry GetHostEntry(IPAddress address)
将IP地址解析为IPHostEntry实例
public static IPHostEntry GetHostEntry(string hostNameOrAddress)
将主机名或IP地址解析为IPHostEntry实例
参数:hostNameOrAddress 要解析的主机名或IP地址
public static string GetHostName()
获取本地计算机的主机名
返回值:包含本地计算机的DNS主机名的字符串
public static IPHostEntry Resolve(string hostName)
将DNS主机名或IP地址解析为IPHostEntry实例