中山网站建设公司哪个好深圳网络营销软件
目录
Linux 用户态和内核态
权限转换
Socket 种类
Socket 数据结构
struct socket
Socket 创建
基于 TCP 协议
编辑
基于 UDP 协议
Socket 类型
从 Linux 的用户态到内核态之间的交互方式和权限转换来对客户端和服务端之间进行 Socket 通信描述。
Linux 用户态和内核态
Linux : 给不同的操作给予不同的“权限”。
Linux 操作系统将权限等级分为 2 个:
-
内核态(内核空间):提供应用程序运行的空间,只能受限的访问内存,且不允许访问外围设备,占用 CPU 的能力被剥夺,cpu 资源可以被其他程序获取。
-
用户态(用户空间):cpu 可以访问内存的所有数据,包括外围设备,例如硬盘、网卡,cpu 也可以将自己从一个程序切换到另一个程序。
权限转换
-
系统调用:调用库函数或 shell 调用;
-
异常:若当前进程运行在用户态时发生了异常事件,就会触发切换。如:缺页异常;
-
外设中断:当外设完成用户的请求时,会向 CPU 发送中断信号。
Socket 种类
常见的 Socket 有:DARPA Internet 地址(Internet socket)、本地节点的路径名(Unix socket)、CCITT X.25 地址(x.25 socket)等。
在 Linux 系统中,Socket 是用来替代传输层以上协议实体的标准接口,它负责实现传输层以上的所有功能,可以说是 Socket 是 TCP/IP 协议栈对外的窗口。
Socket 是介于应用层与传输层之间的软件抽象层,属于一组接口。
Socket 数据结构
Linux 内核在 Socket 层定义了包含 socket 通用属性的数据结构,分别是:struct socket 与 struct sock。
struct socket
每个 socket 在内核中都唯一对应的 struct socket 结构。
struct socket { socket_state state; // 状态unsigned long flags; // 设置标志// 存放socket等待缓冲区的状态信息,其值的形式如SOCK_ASYNC_NOSPACE等struct fasync_struct *fasync_list; // 等待被唤醒的socket列表// 该链表用于异步文件调用struct file *file; // 所属的文件描述符struct sock *sk; // 指向存放 socket 属性的结构指针wait_queue_head_t wait; // 等待队列short type; // 类型。其取值为 SOCK_XXXX 形式const struct proto_ops *ops; // socket 层的操作函数块
}
struct sock 是套接字在网络中的最小描述,包含了内核管理套接字最重要的信息集合。
struct sock_common {unsigned short skc_family; // 地址族volatile unsigned char skc_state; // 连接状态unsigned char skc_reuse; // SO_REUSEADDR 设置int skc_bound_dev_if;struct hlist_node skc_node;struct hlist_node skc_bind_node; // 哈希表相关atomic_t skc_refcnt; // 引用计数
};
Linux 中 socket 的存储方式:文件,socket 建立后,用户进程就可以使用常规文件操作访问 socket。
在 Linux 虚拟文件系统层(VFS)中,每个文件都有一个 VFS inode 结构,每个 Socket 分配了一个该类型的 inode,如下:
struct inode{struct file_operation *i_fop // 指向默认文件操作函数块
}
Socket 创建
基于 TCP 协议
基于 UDP 协议
-
UDP 协议是面向无连接的,不需要三次握手,不需要调用 listen 和 connect,只需要 IP 和 port,因此需要调用 bind;
-
UDP 是没有维护连接状态的,因而不需要每次连接建立一组 Socket,而是只要有一个 Socket 就能够和多个客户端通信;
-
因为没有连接状态,每次通信时都需要调用 send 和 recv,都可以传入 IP 和 port。
Socket 类型
Socket 类型有4种,说明如下:
-
主动 socket(Active Socket)
:通过系统库函数 socket() 生成的主动 socket,主要是用于客户端主动向服务器发送连接;
-
被动 socket(Passive Socket)
:通过系统库函数 listen(),可以将主动 socket 标记为被动 socket,用于被动监听客户端的请求连接,也叫监听socket。被动socket是服务端独有的,将伴随服务端的整个生命周期。
-
监听 socket(Listened Socket)
: 同被动 socket(Passive Socket) 一样。 -
已连接socket(Connected Socket)
:通过系统库函数 accept() 获取的已建立连接的socket,该socket是用于客户端和服务端数据读写的通道, 已连接socket是服务器独有的,生命周期为客户端和服务端的维持的连接时长,当断开连接,生命周期结束。