第四章 套接口的类型与协议
4.1指定套接口的域
在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.
这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
**建议:对于socketpair与socket的domain参数,使用PF_LOCAL系列,而在初始化套接口地址结构时,则使用AF_LOCAL.
例如:
z = socket(PF_LOCAL, SOCK_STREAM, 0);
adr_unix.sin_family = AF_LOCAL;
4.3选择套接口
在函数socketpair与socket中选择代表协议族的参数domain:
-PF_LOCAL:表明指定的协议族是本地UNIX协议族
-PF_INET:表明指定的是Internet协议族
在函数socketpair与socket中type的参数:
-SOCK_STREAM:常用
-SOCK_DGRAM:常用
-SOCK_SEQPACKET:X.25,AX.25使用
-SOCK_RW:表示编程者要一个原始(raw)套接口界面.可以对通信和分组进行更直接的控制,但它要编程式者对协议和底层分组结构非常熟悉.本书没有介绍.略.....
4.3.1 SOCK_STREAM套接口
套接口中的流与UNIX中管道的概念相近.
字节流中没有分界线,也没有边界;没有记录的长度工块的大小,在接收端也不存在分组的概念,在接收端获得的所有数据都返回到调用者的缓冲区中.
例如:
1)本地进程写入25字节数据,通过套接口发到远程进程
2)本地进程再写30字节数据,发出.
3)远程进程从套接口接收数据,共收到本地进程在1)和2)中发送的55字节.
另一重要性质:有序性
SOCK_STREAM 套接口
1)不保留消息边界:接收端无法知道发送端发送数据时共执行了几次write
2)保证接收数据字节与发送时顺序一致
3)保证写入的数据在接收端被无错接收
4.3.2 SOCK_DGRAM
当我们不需要数据传输的绝对有序性时和有需要数据传输的可靠性时,可以考虑使用SOCK_DGRAM.
特性:
1)分组发送后,可能无序的到达接收端。
2)分组可以可能发生丢失。
3)数据报分组有尺寸的大小限制,如果超出,可能会无法传送。
4)分组可以在不建立连接的情况下被发送到远程进程,这就允许本地进程每次将消息发送给不同IP地址上的同样的端口。
4.3.3 SOCK_SEQPACKET
本套接口对于X.25和AX.25协议非常重要,它与SOCK_STREAM的差别:SOCK_STERAM不保留消息边界,而SOCK_SEQPACKET保留.
特性:
1)保留消息边界
2)数据字节的接收顺序与发送顺序一致
3)保证发送数据字节被无错地传送到接收端
4)数据是通过一对连接的套接口进行传送的
============================================
注意:不是每个协议族都可以使用所有的套接口类型,如:PF_INET协议族支持SOCK_STREAM类型,但不支持SOCK_SEQPACKET类型,对于PF_X25协议族则相反,支持SOCK_SEQPACKET类型,但不支持SOCK_STREAM类型
============================================
4.4 选择协议
域(Domain) 套接口类型(socket type) 协议(Protocol) 描述(Description)
PF_LOCAL SOCK_STREAM 0 本地流套接口
PF_LOCAL SOCK_DGRAM 0 本地数据报套接口
PF_INET SOCK_STREAM 0或IPPROTO_TCP TCP/IP流套接口
PF_INET SOCK_DGRAM 0或IPPROTO_UDP UDP数据报套接口
4.6 linux支持的协议
socket()参数
域(Domain) 套接口类型(Socket Type) 描述
PF_LOCAL SOCK_STREAM 本地主机上提供面向流的套接口.该服务是一各面向连接的可靠有序的服务.注意:PF_UNIX=PF_LOCAL
PF_LOCAL SOCK_DGRAM 在本地主机上提供数据服务.该服务是一种可靠的非连接的服务,但在内核缓冲耗尽时也可能会发生分组丢失
PF_INET SOCK_STREAM 为面向Internet连接套接口提供流I/O服务.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET SOCK_DGRAM 为面向Internet连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_INET6 SOCK_STREAM 为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET6 SOCK_SEQPACKET 为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的,且保留了消息的边界
PF_INET6 SOCK_DGRAM 为面向IPv6连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_X25 SOCK_DGRAM (????) 为X.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25 SOCK_STREAM 为AX.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25 SOCK_DGRAM 为面向AX.25连接套接口提供数据报I/O服务,是不可靠的
PF_APPLETALK SOCK_DGRAM (????) 为AppleTalk的套接口提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的
PF_APPLETALK SOCK_STREAM 是一个扩展
PF_ECONET SOCK_DGRAM Acorn Econet和AUN协议的实现
PF_IPX SOCK_STREAM IPX协议,流套接口
PF_IPX SOCK_DGRAM IPX协议,数据报套接口
PF_IPX SOCK_SEQPACKET IPX协议,有序分组套接口
PF_IRDA SOCK_STREAM 支持IrDA子系统,使用流套接口(红外线通信)
PF_IRDA SOCK_SEQPACKET 支持IrDA子系统,使用保留消息边界的流套接口(红外线通信)
PF_NETROM SOCK_SEQPACKET 业余无线电NetROM协议
PF_ROSE SOCK_SEQPACKET 业余无线电X.25PLP协议
===========================================
上面带问号的是我不明白的:SOCK_DGRAM -> 提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的(????) 不明白
===========================================
有关协议族的一些宏定义在下面的头文件中
#include <sys/socket.h>
实际上这个文件包含了另外一个定义协议宏常量:
/usr/include/bits/socket.h
/* Protocol families. */
#define PF_UNSPEC 0 /* Unspecified. */
#define PF_LOCAL 1 /* Local to host (pipes and file-domain). */
#define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */
#define PF_FILE PF_LOCAL /* Another non-standard name for PF_LOCAL. */
#define PF_INET 2 /* IP protocol family. */
#define PF_AX25 3 /* Amateur Radio AX.25. */
#define PF_IPX 4 /* Novell Internet Protocol. */
#define PF_APPLETALK 5 /* Appletalk DDP. */
#define PF_NETROM 6 /* Amateur radio NetROM. */
#define PF_BRIDGE 7 /* Multiprotocol bridge. */
#define PF_ATMPVC 8 /* ATM PVCs. */
#define PF_X25 9 /* Reserved for X.25 project. */
#define PF_INET6 10 /* IP version 6. */
#define PF_ROSE 11 /* Amateur Radio X.25 PLP. */
#define PF_DECnet 12 /* Reserved for DECnet project. */
#define PF_NETBEUI 13 /* Reserved for 802.2LLC project. */
#define PF_SECURITY 14 /* Security callback pseudo AF. */
#define PF_KEY 15 /* PF_KEY key management API. */
#define PF_NETLINK 16
#define PF_ROUTE PF_NETLINK /* Alias to emulate 4.4BSD. */
#define PF_PACKET 17 /* Packet family. */
#define PF_ASH 18 /* Ash. */
#define PF_ECONET 19 /* Acorn Econet. */
#define PF_ATMSVC 20 /* ATM SVCs. */
#define PF_SNA 22 /* Linux SNA Project */
#define PF_IRDA 23 /* IRDA sockets. */
#define PF_PPPOX 24 /* PPPoX sockets. */
#define PF_WANPIPE 25 /* Wanpipe API sockets. */
#define PF_BLUETOOTH 31 /* Bluetooth sockets. */
#define PF_MAX 32 /* For now.. */
/* Address families. */
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
#define AF_ROSE PF_ROSE
#define AF_DECnet PF_DECnet
#define AF_NETBEUI PF_NETBEUI
#define AF_SECURITY PF_SECURITY
#define AF_KEY PF_KEY
#define AF_NETLINK PF_NETLINK
#define AF_ROUTE PF_ROUTE
#define AF_PACKET PF_PACKET
#define AF_ASH PF_ASH
#define AF_ECONET PF_ECONET
#define AF_ATMSVC PF_ATMSVC
#define AF_SNA PF_SNA
#define AF_IRDA PF_IRDA
#define AF_PPPOX PF_PPPOX
#define AF_WANPIPE PF_WANPIPE
#define AF_BLUETOOTH PF_BLUETOOTH
#define AF_MAX PF_MAX
4.1指定套接口的域
在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.
这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
**建议:对于socketpair与socket的domain参数,使用PF_LOCAL系列,而在初始化套接口地址结构时,则使用AF_LOCAL.
例如:
z = socket(PF_LOCAL, SOCK_STREAM, 0);
adr_unix.sin_family = AF_LOCAL;
4.3选择套接口
在函数socketpair与socket中选择代表协议族的参数domain:
-PF_LOCAL:表明指定的协议族是本地UNIX协议族
-PF_INET:表明指定的是Internet协议族
在函数socketpair与socket中type的参数:
-SOCK_STREAM:常用
-SOCK_DGRAM:常用
-SOCK_SEQPACKET:X.25,AX.25使用
-SOCK_RW:表示编程者要一个原始(raw)套接口界面.可以对通信和分组进行更直接的控制,但它要编程式者对协议和底层分组结构非常熟悉.本书没有介绍.略.....
4.3.1 SOCK_STREAM套接口
套接口中的流与UNIX中管道的概念相近.
字节流中没有分界线,也没有边界;没有记录的长度工块的大小,在接收端也不存在分组的概念,在接收端获得的所有数据都返回到调用者的缓冲区中.
例如:
1)本地进程写入25字节数据,通过套接口发到远程进程
2)本地进程再写30字节数据,发出.
3)远程进程从套接口接收数据,共收到本地进程在1)和2)中发送的55字节.
另一重要性质:有序性
SOCK_STREAM 套接口
1)不保留消息边界:接收端无法知道发送端发送数据时共执行了几次write
2)保证接收数据字节与发送时顺序一致
3)保证写入的数据在接收端被无错接收
4.3.2 SOCK_DGRAM
当我们不需要数据传输的绝对有序性时和有需要数据传输的可靠性时,可以考虑使用SOCK_DGRAM.
特性:
1)分组发送后,可能无序的到达接收端。
2)分组可以可能发生丢失。
3)数据报分组有尺寸的大小限制,如果超出,可能会无法传送。
4)分组可以在不建立连接的情况下被发送到远程进程,这就允许本地进程每次将消息发送给不同IP地址上的同样的端口。
4.3.3 SOCK_SEQPACKET
本套接口对于X.25和AX.25协议非常重要,它与SOCK_STREAM的差别:SOCK_STERAM不保留消息边界,而SOCK_SEQPACKET保留.
特性:
1)保留消息边界
2)数据字节的接收顺序与发送顺序一致
3)保证发送数据字节被无错地传送到接收端
4)数据是通过一对连接的套接口进行传送的
============================================
注意:不是每个协议族都可以使用所有的套接口类型,如:PF_INET协议族支持SOCK_STREAM类型,但不支持SOCK_SEQPACKET类型,对于PF_X25协议族则相反,支持SOCK_SEQPACKET类型,但不支持SOCK_STREAM类型
============================================
4.4 选择协议
域(Domain) 套接口类型(socket type) 协议(Protocol) 描述(Description)
PF_LOCAL SOCK_STREAM 0 本地流套接口
PF_LOCAL SOCK_DGRAM 0 本地数据报套接口
PF_INET SOCK_STREAM 0或IPPROTO_TCP TCP/IP流套接口
PF_INET SOCK_DGRAM 0或IPPROTO_UDP UDP数据报套接口
4.6 linux支持的协议
socket()参数
域(Domain) 套接口类型(Socket Type) 描述
PF_LOCAL SOCK_STREAM 本地主机上提供面向流的套接口.该服务是一各面向连接的可靠有序的服务.注意:PF_UNIX=PF_LOCAL
PF_LOCAL SOCK_DGRAM 在本地主机上提供数据服务.该服务是一种可靠的非连接的服务,但在内核缓冲耗尽时也可能会发生分组丢失
PF_INET SOCK_STREAM 为面向Internet连接套接口提供流I/O服务.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET SOCK_DGRAM 为面向Internet连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_INET6 SOCK_STREAM 为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET6 SOCK_SEQPACKET 为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的,且保留了消息的边界
PF_INET6 SOCK_DGRAM 为面向IPv6连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_X25 SOCK_DGRAM (????) 为X.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25 SOCK_STREAM 为AX.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25 SOCK_DGRAM 为面向AX.25连接套接口提供数据报I/O服务,是不可靠的
PF_APPLETALK SOCK_DGRAM (????) 为AppleTalk的套接口提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的
PF_APPLETALK SOCK_STREAM 是一个扩展
PF_ECONET SOCK_DGRAM Acorn Econet和AUN协议的实现
PF_IPX SOCK_STREAM IPX协议,流套接口
PF_IPX SOCK_DGRAM IPX协议,数据报套接口
PF_IPX SOCK_SEQPACKET IPX协议,有序分组套接口
PF_IRDA SOCK_STREAM 支持IrDA子系统,使用流套接口(红外线通信)
PF_IRDA SOCK_SEQPACKET 支持IrDA子系统,使用保留消息边界的流套接口(红外线通信)
PF_NETROM SOCK_SEQPACKET 业余无线电NetROM协议
PF_ROSE SOCK_SEQPACKET 业余无线电X.25PLP协议
===========================================
上面带问号的是我不明白的:SOCK_DGRAM -> 提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的(????) 不明白
===========================================
有关协议族的一些宏定义在下面的头文件中
#include <sys/socket.h>
实际上这个文件包含了另外一个定义协议宏常量:
/usr/include/bits/socket.h
/* Protocol families. */
#define PF_UNSPEC 0 /* Unspecified. */
#define PF_LOCAL 1 /* Local to host (pipes and file-domain). */
#define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */
#define PF_FILE PF_LOCAL /* Another non-standard name for PF_LOCAL. */
#define PF_INET 2 /* IP protocol family. */
#define PF_AX25 3 /* Amateur Radio AX.25. */
#define PF_IPX 4 /* Novell Internet Protocol. */
#define PF_APPLETALK 5 /* Appletalk DDP. */
#define PF_NETROM 6 /* Amateur radio NetROM. */
#define PF_BRIDGE 7 /* Multiprotocol bridge. */
#define PF_ATMPVC 8 /* ATM PVCs. */
#define PF_X25 9 /* Reserved for X.25 project. */
#define PF_INET6 10 /* IP version 6. */
#define PF_ROSE 11 /* Amateur Radio X.25 PLP. */
#define PF_DECnet 12 /* Reserved for DECnet project. */
#define PF_NETBEUI 13 /* Reserved for 802.2LLC project. */
#define PF_SECURITY 14 /* Security callback pseudo AF. */
#define PF_KEY 15 /* PF_KEY key management API. */
#define PF_NETLINK 16
#define PF_ROUTE PF_NETLINK /* Alias to emulate 4.4BSD. */
#define PF_PACKET 17 /* Packet family. */
#define PF_ASH 18 /* Ash. */
#define PF_ECONET 19 /* Acorn Econet. */
#define PF_ATMSVC 20 /* ATM SVCs. */
#define PF_SNA 22 /* Linux SNA Project */
#define PF_IRDA 23 /* IRDA sockets. */
#define PF_PPPOX 24 /* PPPoX sockets. */
#define PF_WANPIPE 25 /* Wanpipe API sockets. */
#define PF_BLUETOOTH 31 /* Bluetooth sockets. */
#define PF_MAX 32 /* For now.. */
/* Address families. */
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
#define AF_ROSE PF_ROSE
#define AF_DECnet PF_DECnet
#define AF_NETBEUI PF_NETBEUI
#define AF_SECURITY PF_SECURITY
#define AF_KEY PF_KEY
#define AF_NETLINK PF_NETLINK
#define AF_ROUTE PF_ROUTE
#define AF_PACKET PF_PACKET
#define AF_ASH PF_ASH
#define AF_ECONET PF_ECONET
#define AF_ATMSVC PF_ATMSVC
#define AF_SNA PF_SNA
#define AF_IRDA PF_IRDA
#define AF_PPPOX PF_PPPOX
#define AF_WANPIPE PF_WANPIPE
#define AF_BLUETOOTH PF_BLUETOOTH
#define AF_MAX PF_MAX