###########################################################
unix域(本地IPC):
###########################################################
在单个主机上执行客户服务器程序,可视为IPC方法之一.
unix域(本地IPC)地址结构:
struct sockaddr_un
{
sa_family_t sun_family; //AF_LOCAL instead of AF_UNIX
char sun_path[104]; //addressname
};
int socket(int family, int type, int protocol);
family:(网络层协议)
bsd和linux:(AF:地址族)
AF_LOCAL(unix域)=PF_LOCAL=AF_UNIX=PF_UNIX
type:
SOCK_STREAM(字节流套接字)(tcp、sctp)
SOCK_DGRAM(数据报套接字)(udp)
protocol:(传输层协议)
0:tcp和udp,一般用这个,表示默认值
IPPROTO_SCTP: sctp用这个。
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int family, inttype, int protocol, int sv[2]);
创建两个连接起来的套接字.
family=AF_LOCAL
type=SOCK_STREAM or SOCK_DGRAM
protocol=0
fcntl()函数
ioctl函数
###########################################################
路由域
###########################################################
路由域地址结构:
struct sockaddr_dl
{
uint8_t sdl_len;
sa_family_t sdl_family; // AF_LINK
uint16_t sal_index;
uint8_t sdl_type; // IFT_ETHER
uint8_t sdl_neln;
uint8_t sdl_alen;
uint8_t sdl_slen;
char sdl_data[12];
};
int socket(int family, int type, int protocol);
路由域字只支持原始套接字
family:(网络层协议)
AF_ROUTE(路由域)=PF_ROUTE
type:
SOCK_RAW(原始套接字)(ipv4、ipv6)
protocol:(传输层协议)
0:tcp和udp,一般用这个,表示默认值
IPPROTO_SCTP: sctp用这个。
路由套接字支持三种操作和12个路由消息:
1.往内核发消息,有5种消息可用,使用结构struct rt_msghdr.
RTM_ADD 增加路径
RTM_DELETE 删除路径
RTM_CHANGE 改动网关,测度或标志
RTM_GET 报告测度和其它路径信息
RTM_LOCK 锁住给定的测度
2.从内核接收消息,有12种消息可用,使用结构struct rt_msghdr, if_announcemsghdr,if_msghdr,ifa_msghdr,ifma_maghdr.
3.使用sysctl函数倾斜处路由表或已配置的接口.
接口名字和索引相关的 库函数:
每个接口都有一个唯一的名字和一个唯一的正值索引.
#include <net/if.h>
unsigned int if_nametoindex(constchar *ifname);
根据名字ifname返回对应的索引.
char *if_indextoname(unsignedint ifindex, char *ifname);
返回指向接口名字的指针.
sturct if_nameindex
*if_nameindex(void);
动态分配空间存放名字和索引
返回指向if_nameindex结构数组的指针
struct if_nameindex
{
unsigned int if_index;
char *if_name; // null terminated
};
void if_freenameindex(structif_nameindex *ptr);
释放动态分配的空间
sysctl函数:检查路由表和接口列表.
###########################################################
秘钥管理套接字
###########################################################
int socket(int family, int type, int protocol);
秘钥域只支持原始套接字
family:(网络层协议)
AF_KEY(秘钥域)=PF_KEY
type:
SOCK_RAW(原始套接字)(ipv4、ipv6)
protocol:(传输层协议)
0:tcp和udp,一般用这个,表示默认值
IPPROTO_SCTP: sctp用这个。
打开原始秘钥管理套接字需要root权限;
Ipsec(IP安全体系结构)基于SA(安全关联),
SA的集合称为SADB(安全关联数据库).
IPsec还需要SPSB(安全策略数据库).
秘钥管理套接字支持三种操作:
1.往内核和其它打开的秘钥管理套接字发消息,9个消息可用.
2.从内核收消息,9个消息可用.
3.往内核发送倾泻消息,内核应答当前的SADB.(调试用)
消息返回的结构为structsadb_msg.
秘钥管理消息有10个:
SADB_EXPIRT:只能从内核发往进程.
SADB_REGISTER:只能从进程发往内核.
SADB_DUMP:倾泻SADB,调试用.
###########################################################
数据链路层的访问接口:
访问数据链路层常用的三种方法:
1.BPF:BSD分组过滤器
2.DLPI:数据链路提供者接口
3.socket函数的AF_PACKET选项
一般使用与实现无关的两个库:
1.libpcap,只支持分组的读入.
2.libnet,构造任意协议的分组输出到网络接口.
补充:
原始套接字:
原始套接字的创建:
只有超级用户能创建原始套接字
sockfd = socket(AF_INET, SOCK_RAW, ?);
原始套接字的作用:
1.进程可以读写ICMPV4,ICMPV6 和 IGMPV4的分组
2.进程可以读写内核不处理其协议字段的IP数据报
3.进程可以自行构造IPv4首部,用于诊断.
ping和traceroute使用原始套接字.
###########################################################
IP地址分为三类:
单播:ipv4和ipv6和tcp和udp,一个进程就与另一个进程通信.
广播:ipv4和udp支持.一个和一组通信.
多播:ipv6和udp支持.一个和所有通信.
IP地址有五种格式:
A:网络号.主机号.主机号.主机号(0.0.0.0-127.255.255.255)
B:网络号.网络号.主机号.主机号(128.0.0.0-191.255.255.255)
C:网络号.网络号.网络号.主机号(192.0.0.0-223.255.255.255)
D:多播地址(224.0.0.0-239.255.255.255)
E:预留地址,试验用(240.0.0.0-255.255.255.255)
IP地址组成:网络号+主机号(子网号+主机号)。
子网掩码:32bit,值=1的位表示IP对应位留给网络号和子网号,值=0的位表示IP对应位留给主机号。
tcp只支持单播;ipv6不支持广播,ipv4可以支持多播,udp支持所有.
单播:单播IP数据报仅通过目的IP地址指定的单个主机接收,子网上的其它主机不受影响。
广播地址分两类:
1.子网定向广播地址:*.*.*.255,指定子网*.*.*上所有接口的广播地址。
2.受限广播地址:255.255.255.255,路由器从不转发目的地址为受限广播地址的IP数据报。
广播:广播分组去往子网上所有分组,包括自己,一般用于局域网。
竞争状态:多个进程访问共享的数据,正确的结果取决于进程执行的顺序。
解决竞争状态的三个方法:
1.使用pselect
2.使用sigsetjmp和siglongjmp
3.使用从信号处理函数到函数主循环的IPC(管道)。
在非阻塞的时候超时时间到,会出现竞争状态,所以要在非阻塞时候禁止发出超时信号。
多播:多播地址标识一组IP接口,局域网和广域网都可以用。
IPv4的D类地址是IPv4的多播地址,是一个32位的组地址,低28位位组ID,该地址是一个统一管理了的组地址。
特殊IPv4多播地址:
主机组:244.0.0.1
路由组:244.0.0.2
IPv6的多播地址:
多播相对于广播的优势就是不会给对多播组不感兴趣的主机增加额外负担。
###########################################################
B/S架构的客户服务器程序设计
迭代服务器iterate
并发服务器(每个客户一个子进程)concurrent
预先派生子进程服务器程序(accept无上锁保护)
预先派生子进程服务器程序(accept使用文件上锁保护)
预先派生子进程服务器程序(accept使用线程上锁保护)
预先派生子进程服务器程序(传递描述符)
并发服务器(每个客户一个子线程)thread
预先创建线程服务器程序(每个线程各自accept)
预先创建线程服务器程序(主线程统一accept)
###########################################################