Xerox IDP:Internet 数据报协议
Internet 数据报协议(IDP)是一种简单的不可靠数据报协议,主要用来为网际协议(IP)族支持 SOCK_DGRAM 抽象概念。IDP 套接字(sockets)是无连接,通常应用于 sendto 和 recvfrom 子程序。而连接子程序也可用来为未来数据报包固定目的地,在这种情况下,可以运用 recv 或 read 子程序以及 send 或 write 子程序。
Xerox 协议(XNS 协议组)垂直建立在 IDP 上,因此,IDP 地址格式与序列分组协议(SPP:Sequenced Packet Protocol)使用的格式一样;两者的端口空间相同,即如果囟ǖ难∠羁捎茫琁DP 端口可以“连接”到 SPP 端口。另外,通过预留广播地址,可以发送广播数据包(假设底层网络支持该操作),这里的地址指网络相关接口。
下面的例子阐述了 IDP 如何使用 SOCK_DGRAM 机制的过程:
#include <sys/socket.h>#include <netns/ns.h>#include <netns/idp.h>s = socket(AF_NS, SOCK_DGRAM, 0);
IDP 的 Socket 选项
SO_HEADERS_ON_INPUT
设置时,从读或 recvfrom 子程序返回的任何数据的前30个字节被作为 IDP 数据包的初始位(30字节),描述如下:
struct idp {
u_short idp_sum;
u_short idp_len;
u_char idp_tc;
u_char idp_pt;
struct ns_addr idp_dna;
struct ns_addr idp_sna;
};
用户可以决定数据包类型,或决定数据包是组播数据包还是本地主机指定数据包。当 getsockopt 子程序发送请求时,SO_HEADERS_ON_INPUT 选项提供当前选项的状态:NSP_RAWIN 或0。
SO_HEADERS_ON_OUTPUT
设置时,对于发送的任何数据,其前30个字节作为 IDP 数据包的初始位(30字节)。用户可以决定数据包类型,或决定数据包是组播数据包还是本地主机指定数据包。用户也可以误传数据包的发送方。当 getsockopt 子程序发送请求时,SO_HEADERS_ON_OUTPUT 选项提供当前选项的状态:NSP_RAWOUT 或0。
SO_DEFAULT_HEADERS
用户为 kernel 提供一个 IDP 头。通过 IDP 头,kernel 决定数据包类型。当 getsockopt 子程序发送请求时,kernel 会提供一个 IDP 头,显示默认数据包类型、本地和外地地址。
SO_ALL_PACKETS
设置时,该选项失去自动处理差错协议数据包和 SPP 数据包的能力。
SO_SEQNO
当 getsockopt 子程序发送请求时,S0_SEQNO 选项返回一个不会重复的序列号。它对于构建分组交换协议(PEP)数据包而言是非常有用的。
如果有以下一种或多种情形出现,那么 IDP 协议会失败:
EISCONN
Socket 已在该系统上建立一个连接。
ENOBUFS
该系统为内部数据结构耗尽所有内存。
ENOTCONN
Socket 没有被连接或在发送数据报时没有指定目的地址。
EADDRINUSE
尝试通过已分配端口创建 socket。
EADDRNOTAVAIL
在没有网络接口的情况下,尝试通过网络地址创建 socket。