11:53:27
2009-04-16
计算机间通信时需要两个通信端点,就像打电话时必须有两台电话机;
这个通信端点是网络层次结构中的传输层的实现,包括TCP协议和UDP协议;
这个通信端点向上层提供传输层接口,使传输层其上的应用层可以使用其接口;
应用层程序包括http、ftp、及自己实现的应用程序均可以使用传输层接口实现网络互联;
在unix/Linux将通信端点实现为内核对象,
构建这个通信端点使用的方法是:
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
这个方法将在内核中创建一个通信端点,其实现了TCP/UDP传输协议;
返回的一个称为套接字描述符的无符号整型变量;
在unix/Linux系统中将所有视为文件;
在进程表项中都会有个进程打开文件表,他实际是一个数组;
进程打开一个文件,数组中的每一个元素对应一个系统打开文件表中的一个打开文件表项,
这个文件打开表项中的v_node指针指向一个v_node结构体,内核都通过这个v_node结构体来访问文件;
进程打开文件表的数组索引就称为文件描述字,也称句柄;
我们可以通过这个数值来操纵文件,而底层的实现则完全被隐藏了起来;
那么unix/linux实现的通信端点也是一个文件;
通过int socket(int domain,int type,int protocol);调用返回也是一个文件描述字,但是
它比普通的描述字复杂;有多个属性,所以我们称为套接字描述符;
有了套接字描述我们操纵底层的通信端点实现TCP/UDP连接通信;
要注意一点的通信端点可以有多个套接字描述符,他们都指向同一个v_node结构体;
只有当所有对同一个v_node的引用数为0时,才可以销毁这个通信端点