日期:2014-05-16  浏览次数:20663 次

Linux协议栈之BSD和INET socket层(二)

BSD socket层几个函数的介绍:

sock_alloc()获取一个inode结构,并初始化返回所需socket结构

sock_release_peer()仅用于UNIX域

sock_release()用于释放关闭一个套接字,调用sock_ops_release,sock_ops是一个proto_ops结构,是一个操作函数的集合;

sock_close()call sock_release() call sock_release_peer();

sock_socket(),其中type的判断如下:

SOCK_STREAM:流式数据交换TCP

SOCK_DGRAM:报文数据交换UDP

SOCK_SEQPACKET:序列报文套接字,内核树立方式

SOCK_RAW:原始套接字,直接传输层发送数据,应用程序自行建立传输首部

SOCK_PACKET:包类型套接字,直接网络层发送,应用程序自行建立网络层首部

?

sock_socketpair()只用于UNIX域,应用于两个进程间交换数据,类似于管道;

?

sock_accept()判断SO_ACCEPTCON标志置1,然后调用sock_alloc()分配一个新的套接字,再用sock->ops->dup拷贝监听套接字设置到新的套接字。

?

INET层:

proto数据结构,定义了传输层操作的一些列函数指针和字段,每个传输层协议都对应一个proto字段。对核对于管理proto数据结构,通过一个sock_array[]数组来实现并通过进程通行的端口作为下标插入到此数组中。sock_array有256个元素,每个元素都是一个链表,而端口号范围可以达到65536,其中1024以下保留给系统使用。具体的计算方法是取余:

n%SOCK_ARRAY_SIZE=N