4. 套接口的类型与协议

# 无名套接口

套接口不一定需要地址,比如socketpair生成了一对互相链接但是没有地址的套接口,这就是无名套接口。因为只有这一对套接口相连所以没有必要使用地址。

# 域

 int socket(int domain, int type, int protocol);

int socketpair(int domain, int type, int protocol, int sv[2]);

domain: 指定了通信使用的协议族,而不是某个特定的协议。PF_LOCAL 表明指定的协议族是本地UNIX套接口协议族。PF_INET表明的是Internet协议族。

type:指定了通信的逻辑,即,套接口的类型。

protocol:指定通信协议族中的某中协议。

 

AF_LOCAL的前缀AF_表示 地址族(address family)。

PF_LOCAL的前缀PF_表示协议族。

BSD套接口设计经历了一系列变化.初期,设计者考虑到指定套接口时要:

@  某个协议族中的一个或者多个协议

@  某个协议的一个或者多个地址格式

所以,生成套接口前要指定:

1> 使用的协议族

2> 使用协议族的某个特定协议

3>  使用的地址族

经验说明,对于任何一个给定的协议族,都只有一种地址格式.在Linux所使用的现代套接口也继承了这一结果.这意味着,套接口在指定 domain参数时,既可以用 PF_XX 也可以用 AF_XX.


* 下面说明了怎么使用PF_LOCAL 和 AF_LOCAL

struct sockaddr_un addr_unix; /* AF_LOCAL */

socketpair(PF_LOCAL, SOCK_STREAM, 0, sp);

...

adr_unix.sun_family = AF_LOCAL;

就是,使用 PF_LOCAL 指定协议族,建立套接口地址结构时使用 AF_LOCAL.

 

*地址族

每一种通信协议都对网络地址格式做了明确说明.地址族的作用就是指明使用哪一种地址类型。AF_LOCAL(AF_UNIX)表示使用本地地址规则,而 AF_INET表示使用IP地址规则生成地址。

#选择套接口的类型
一般为如下选项,
SOCK_STREAM
SOCK_DGRAM
SOCK_SEQPACKET
SOCK_RAW
SOCK_RDM
SOCK_PACKET
我们一一介绍,
@ SOCK_STREAM:
特点:1.不保留消息边界。A进程向远程进程B发送数据,第一次发了30字节,第二次发了40字节。B的数据缓冲区为256字节。那么B把70字节看作整体。
      2.保证接受的数据字节与发送时的顺序一致。
      3.可以保证无错地接收。如果发送不成功,发送端,接收端都会收到有关报告.
它的数据是通过一对连接的套接口传输的。在通信之前必须建立了一个连接。
@ SOCK_DGRAM:
特点:1.分组发送后,可能无序地到达接收端。
      2.分组可能丢失。丢失时没有采取任何措施,接收端也不必知道有分组丢失。
      3.数据报有尺寸大小的限制,如果超出限制,在某些路由器和节点上就无法传送。
      4.分组是在不建立连接的情况下被发送到远程进程的。这就允许本地进程每次将消息发送给不同IP地址上的同样的端口。
@ SOCK_SEQPACKET:
特点:1.保留消息边界。
      2.数据字节的接收顺序与发送顺序保持一致。
      3.保证数据字节被无错地传送到接收端。如果发生错误经过自动恢复仍然无法消除,那么在接收端和发送端都会收到错误报告。
      4.数据是通过一对套接口进行传送的。
@ SOCK_RAW:(在后面的文章里我会重点的介绍)
 这部分转载自:[http://simon.blog.51cto.com/80/76043]
 In computer networking, a raw socket is a socket that allows direct access to packet's headers. Due to the fact that raw sockets allow users to craft packets' headers, their power can be abused to perform attacks such as IP address spoofing in hand with denial-of-service.
Raw Socket的最大特点就是允许用户自己定义packet header,如果这一功能被滥用,就可以被用来实现IP地址欺骗,以及DoS攻击。
 
Raw sockets are not a programming language-level construct, they are part of the underlying operating system's networking API. Most socket interfaces, especially those based on the Berkeley sockets, support them.
Raw Socket不是编程语言级别的标准构造,由OS里面的低层API支持,大多数的网络接口都支持Raw Socket。
 
Usually raw sockets receive packets containing the header, as opposed to standard sockets, which receive just the payload with the headers stripped for programmer's convenience. For outgoing packets, whether or not a header is automatically prepended is usually a raw socket's configurable option.
通过Raw Socket接收到的数据包带有包头,通过标准Socket只能接收到净载,通过Raw Socket发出数据时,要不要自动生成pocket header是可配置的。
 
Raw sockets are usually used on the network's transport layer or network layer.
Raw Socket通常用在传输层和网络层。
你还可以看看这篇:http://blog.csdn.net/liqinghua1653/archive/2009/02/20/3914523.aspx
#选择协议

4. 套接口的类型与协议_第1张图片

你可能感兴趣的:(socket,unix,header,domain,networking,Sockets)