协议的一些特性:
1、 面向消息:网络之间传输的就是消息,通过消息进行通信
2、 面向连接和无连接:
a) 连接(TCP):必须先建立连接后才能进行通信,即上一条消息通信
b) 无连接(UDP):不管三七二十一发消息发过去就好了,不关心客户端能否接到到发出的信息,发 邮件即使如此,网那个地址发就好了
3、 可靠性和次序性:它与第二条关系密切,有怎么样的连接就有怎么样的可靠性
4、 从容关闭:面向连接的特性,在结束发送是会想客户端发送结束发送标志
5、 广播数据
6、 多播数据:广播的扩展,指定广播的地址
7、 服务质量(QOS)
8、 部分消息:只用于面向连接的特性,这就是我们建立TCP连接时,接受数据长度过长,可以在下一次接 收中接收,协议会告诉我们还有信息没有接收完毕
9、 路由选择的考虑:
协议的类型:
1、 IP
2、 红外线套接字
3、 IPX/SPX:互联网包交换,提供两个进程间的无连接通信,它是Novell公司为了适应网络的发展而开发的通信协议,具有很强的适应性,安装方便,同时还具有路由功能,可以实现多网段间的通信。其中,IPX协议负责数据包的传送;SPX负责数据包传输的完整性。在微软的NT操作系统中,一般使用NWLink IPX/SPX兼容协议和NWLink NetBIOX两种IPX/SPX的兼容协议,即NWLink协议,该兼容协议继承了IPX/SPX协议的优点,更适应Windows的网络环境。IPX/SPX协议一般可以应用于大型网络(比如Novell)和局域网游戏环境中(比如反恐精英、星际争霸)。不过,如果不是在Novell网络环境中,一般不使用IPX/SPX协议,而是使用IPX/SPX兼容协议,尤其是在Windows 9x/2000组成的对等网中
4、 NetBIOS:在前面的上一骗NetBOIS中已详细说明
5、 AppleTalk:AppleTalk 是由 Apple 公司推出的一种多层协议,支持网络路由选择、事务服务、数据流服务以及域名服务,并且通过 Apple 硬件中的 LocalTalk 接口全面实现 Apple 系统间的文件和打印共享服务。通过以太网网桥使用 LocalTalk 或者 Apple 机制提供以太网扩展板(add-in boards)等途径能够实现其它网络媒体(如以太网)与 AppleTalk 之间的连接。另外 AppleTalk 协议中包含很多第三方(third-party)应用程序。
6、 ATM(Asynchronous Transfer Mode)异步传输模式):流媒体传输使用(语音,图象,文件传输)
Windows 环境下可以通过WSAEnumProtocols 获取协议支持的协议:
int WSAEnumProtocols(
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength
);
WSAPROTOCOL_INFO返回的就是协议的信息:
typedef struct _WSAPROTOCOL_INFO {
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlags4;
DWORD dwProviderFlags;
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily;
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
TCHAR szProtocol[WSAPROTOCOL_LEN+1];
} WSAPROTOCOL_INFO,
*LPWSAPROTOCOL_INFO;
主要的字段如下:
1、 dwServiceFlags1,不同协议属性的一个位字段
2、 iProtocol:定义该条目属于哪个协议
3、 iSocketType:定义套间字类型
4、 iAddressFamily:区分正确协议的定义结构
WSADATA wd;
WSAStartup(MAKEWORD(2,2),&wd);
LPWSAPROTOCOL_INFO lpInfo = new WSAPROTOCOL_INFO;
//memset(&info, 0, sizeof(WSAPROTOCOL_INFO));
// must set MAX
DWORD dwLength = 25600;
int iRet = WSAEnumProtocols(NULL, lpInfo, &dwLength);
if ( iRet != SOCKET_ERROR )
{
}