套接字受限于通信区域(即网络体系结构),一个套接字只能与同一区域内的套接字交换数据。Berkeley Socket支持4种通信协议:UNIX Domain(AF_UNIX,AF_UNIX是指在Win-Sock2.h中定义的通信域类型,即UNIX内部协议)、Internet(AF_INET)、XeroxNS(AF_NS)和IMP链路层协议(AF_IMPLINK)。WinSock只能支持一种通信区域——网际域Internet(AF_INET),即使用TCP/IP协议的通信域。
Socket提供了3种类型的套接字,分别是流、数据报和原始套接字。
1)流式套接字(SOCK_STREAM,对应于TCP)。这是一个面向连接的、可靠的数据传输服务。在传输层使用TCP协议。
2)数据报套接字(SOCK_DGRAM,对应于UDP)。提供无连接服务,数据以独立的数据报形式被传送。在传输层使用UDP协议。(www.daowen.com)
3)原始套接字(SOCK_RAW,对应于IP)。该套接字允许对较底层协议(如网络层IP、ICMP)进行直接访问,用以实现对IP数据报的控制。因此IP数据报中的IP头部对于原始套接字是可见的。原始套接字可以处理IP数据报,而前两种套接字只能处理去除IP层头部的TCP和UDP数据包的应用层数据部分,这一点需要特别注意。它们之间的主要区别在于发送、接收缓冲区的数据不同,前两种可以处理的缓冲区数据只是需要发送和接收的应用层数据,不需要对传输层的TCP或UDP进行处理,而原始套接字无论发送和接收的缓冲区数据都是原始的IP数据报,因此,发送和接收都需要对IP数据报进行直接处理,这样增加了对底层访问的能力,但同时也加大了编程的难度。
需要注意的是,Windows XP SP2之后对原始套接字进行了一些限制,一是不能通过原始套接字发送TCP数据包,二是不能通过原始套接字发送伪造源IP的UDP数据包。在使用原始套接字编写相关程序时需要注意这一点。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。