网络基本理论
基于TCP的网络编程
基于UDP的网络编程
ISO/OSI模型简介
ISO:国际标准化组织
OSI:开放系统互联结构模型
ISO/OSI模型把网络分成了若干层,每层都实现特定的功能。
ISO/OSI模型把网络表示成竖直的线,模型中的每一层次至少包含有一个协议,所以也可以说是模型中的协议是逐个叠放的。协议栈是个由竖直的层和对方的协议抽象而来。
OSI不是一个实际的物理模型,而是一个将网络协议规范化了的逻辑参考模型
网络通讯原理:
网络通讯的沟通需要协议支持(想想为什么需要协议?):
常见的三种协议:
IP协议:网际协议(Internet Protocol)
TCP协议: 传输控制协议(Transmission Control Protocol)
UDP协议:用户数据协议(User Datagram Protocol)
Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。可以如下图示意:
可见,传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Ftp等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。
TCP编程
认识Socket
System.Net.IPAddress:提供网际协议(IP)地址
System.Net.Sockets.TcpListener:从TCP网络客户端侦听连接
System.Net.Sockets.TcpClient:为TCP网络服务提供客户端连接
System.Net.IPEndPoint:将网络端点表示为IP地址和端口号
System.Net.NetworkStream:提供用于网络访问的基础数据流
System.Net.Sockets.Socket:实现Berkeley套接字接口
Socket原义为“插座”,socket非常类似于电话插座。
我们所见到的一切网络通讯程序基本上都基于socket来建设。
在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
IPAddress
提供网际协议(IP)地址
主要方法:GetAddressBytes以字节数组形式提供IPAddress的副本
IsLoopback回环地址判断
NetworkToHostOrder将数字由网络字节顺序转换为主机字节顺序
TryParse确定字符串是否为有效的IP地址
主要字段:Boradcase提供IP广播地址。255.255.255.255
Loopback提供环回地址。127.0.0.1
主要属性:AddressFamily获取IP地址的地址族
TcpListener
从TCP网络客户端侦听连接
主要方法:AcceptSocket 接受挂起的连接请求
AcceptTcpClient 接受挂起的连接请求
BeginAcceptSocket 开始一个异步操作来接受一个传入的连接尝试
BeginAcceptTcpClient 开始一个异步操作来接受一个传入的连接尝试
EndAcceptSocket 异步接受传入的连接尝试,并创建新的Socket来处理远程主机通信
EndAcceptTcpClient异步接受传入的连接尝试,并创建新的TcpClient来处理远程主机通信。
Pending 确定是否有挂起的连接请求
Start 开始侦听传入的连接请求
Stop 关闭侦听器
主要属性:Active 获取一个值,用来指示TcpListener是否正主动侦听客户端连接
ExclusiveAddressUse 用来指定TcpListener是否只允许一个基础套接字来侦听特定端口
LocalEndpoint获取当前TcpListener的基础EndPoint
Server获取基础网络Socket
TcpClient
为TCP网络服务提供客户端连接
主要方法:BeginConnect 开始一个对远程主机连接的异步请求
Close 释放此TcpClient实例,而不关闭基础连接
Connect 使用指定的主机名和端口号将客户端连接到TCP主机
EndConnect异步接受传入的连接尝试
主要属性:Active 状态值,是否已建立连接
Available 获取已经从网络接收且可供读取的数据量
Client 获取或设置基础Socket
Connected 用来指示TcpClient的基础Socket是否已连接到远程主机
ExclusiveAddressUse 状态值,用来指定TcpClient是否只允许一个客户端使用端口
RecevieBufferSize 获取或设置接收缓冲区的大小
ReciveTimeOut 获取或设置在初始化一个读取操作以后,TcpClient等待接收数据的时间量
SendBufferSize 获取或设置发送缓冲区的大小
SendTimeOut 获取或设置TcpClient等待发送操作完成的时间量
IPEndPoint
将网络端点表示为IP地址和端口号
主要方法:Create 从套接字地址创建终结点
主要字段:MaxPort指定可以分配给Port属性的最大值。MaxPort值设置为0x0000FFFF。
MinPort指定可以分配给Port属性的最小值
主要属性:Address 获取或设置终结点的IP地址
AddressFamily 获取网际协议(IP)地址簇
Port 获取或设置终点的端口号
NetworkStream
提供用于网络访问的基础数据流
主要方法:BeginRead 从NetworkStream开始异步读取
BeginWrite 开始向流异步写入
EndRead 处理异步读取的结束
EndWrite 处理异步写入的结束
Flush 刷新流中的数据。(保留此方法供将来使用)
Read 从NetworkStream读取数据
ReadByte 从流中读取一个字节,并将流内的位置推进一个字节,如果已达到末尾,则返回-1
Write 将数据写入NetworkStream
WriteByte 将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。
主要属性:CanRead 获取一个值,用来说明NetworkStream是否支持读取
CanTimeout 指示超时属性是否可用于NetworkStream
CanWrite 指示NetworkStream是否支持写入
DataAvaiable 指示要读取的NetworkStream上是否有可用的数据
Readable 指示NetworkStream是否可以读取
Socket 获取基础Socket
Writeable 指示NetworkStream是否可写
WriteTimeOut 获取或设置写入操作阻止等待数据的时间量
Socket
主要方法:Accept 为新建连接创建新的Socket
AcceptAsync 开始一个异步操作来接受一个传入的连接尝试
BeginAccept 开始一个异步操作来接受一个传入的连接尝试
BeginConnect 开始一个远程主机连接的异步请求
BeginDisconnect 开始异步请求从远程终结点断开连接
BeginReceive 开始从连接的Socket中异步接收数据
BeginReceiveFrom 开始指定网络设备中异步接收数据
BeginReceiveMessageFrom 开始使用指定的SocketFlags将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储结点和数据包信息
BeginSend 将数据异步发送到连接的Socket
BeginSendFile 将文件异步发送到数据的Socket对象
BeginSendTo 向特定远程主机异步发送数据
Bind 使Socket与一个本地终点相关联
Close 关闭Socket连接并释放所有关联的资源
Connect 建立与远程主机的连接
ConnectAsync 开始一个对远程主机连接的异步请求
Disconnect 关闭套接字连接并允许重用套接字
DisconnectAsync 开始异步请求从远程终结点断开连接
Dispose 释放由Socket使用的非托管资源,并可根据需要释放托管资源
DuplicateAndClose 重复目标进程的套接字引用,并关闭此进程的套接字
EndAccept 异步接受传入的连接尝试
EndConnect 结束挂起的异步连接请求
EndDisconnect 结束挂起的异步断开连接请求
EndReceive 结束挂起的异步读取
EndReceiveFrom 结束挂起的、从特定终点进行异步读取
EndReceiveMessageFrom 结束挂起的、从特定结定进行异步读取。此方法还显示有关数据包而不是EndReceiveFrom的更多信息
EndSend 结束挂起的异步发送
EndSendFile 结束文件的挂起异步发送
EndSendTo 结束挂起的、向指定位置进行的异步发送
GetSocketOption 返回Socket选项的值
IOControl 为Socket设置低级别操作模式
Listen 将Socket置于侦听状态
Pool 确定Socket的状态
Receive 接收来自绑定的Socket的数据
ReceiveAsync 开始一个异步请求以便从连接的Socket对象中接收数据
ReceiveFrom 接收数据报并存储源终结点
ReceiveFromAsync 开始从指定网络设备中异步接收数据
ReceiveMessageFromAsync 开始使用指定的 SocketAsyncEventArgs.SocketFlags将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储结点和数据包信息
Select 确定一个或多个套接字的状态
Send 将数据发送到数据的Socket
SendAsync 将数据异步发送到连接的Socket对象
SendFile 将文件和可选数据异步发送到连接的Socket
SendPacketsAsync 将文件集合或者内存中的数据缓冲区以异步方法发送给连接的Socket对象
SendTo 将数据发送到特定终点
SendToAsync 向特定远程主机异点发送数据
SetSocketOption 设置Socket选项
Shutdown 禁用某Socket上的发送和接收
主要属性:AddressFamily获取Socket的地址族
Available 获取已经从网络接收且可供读取的数据量
Blocking 获取或设置一个值,该值指示Socket是否处于阻止模式
Connected 获取一个值,指示Socket是在上次Send还是Receive操作时连接到远程主机
DontFragment 指定Socket是否允许将Internet协议(IP)数据报分段
EnableBroadCast 指定Socket是否可以发磅或接收广播数据包
ExclusiveAddressUse 指定Socket是否公允许一个进程绑定到端口
IsBound 指示Socket是否绑定到特定本地端口
LingerState 指定Socket在尝试发送所有挂起数据时是否延迟关闭套接字
LocalEndPoint 获取本地终结点
MulticastLoopback 指定传出的多路广播数据包是否传递到发送应用程序
ProtocolType 得到Socket的协议类型
ReceiveBufferSize 指定Socket接收缓冲区的大小
ReceiveTimeout 指定之后同步Receive调用将超时的时间长度
RemoteEndPoint 得到远程终结点
SendBufferSize 指定Socket发送缓冲区的大小
SendTimeout 指定之后Send调用将超时的时间长度
SocketType 获取Socket的类型
UDP编程
主要方法:
Send:发送数据
Receive:接收数据
BeginSend:开始从连接的Socket中异步发送数据报
BeginReceive:开始从连接的Socket中异步接收数据
EndSend:结束挂起的异步发送数据报
EndReceive:结束挂起的异步接收数据报
JoinMulicastGroup:将UdpClient添加到多路广播
DropMulicastGroup:将UdpClient退出多路广播
主要属性:
Active:获取或设置一个值指示是否已建立默认远程主机
Avaiable:获取或设置缓冲中可用数据的数量
Client:获取或设置基础网络套接字
EnableBroadcast:是否接收发送广播包
ExclusiveAddressUse:是否允许一个客户端使用指定端口