Linux
分类: LINUX
2013-03-26 23:57:25
unsigned long flags; // 无使用
struct fasync_struct *fasync_list;
wait_queue_head_t wait;
struct file *file;
struct sock *sk; // 网络层sock的表示,这个是重点,整个协议栈都是围绕这个成员展开
const struct proto_ops *ops; // 操作集,分别对应流协议、数据报和原始套接口协议
};
这样通过文件描述符,可以找到中间层socket,通过socket可以找到网络层的sock,进而操作数据,收发包,这样就展开了。
sock的结构比较复杂,单独进行分析,下面主要讲socket、sock、tcp sock、inet_connection_sock、inet socket等的关系理一下
1. 通过fd可以找到socket,socket->sk指向了struct sock结构
2. struct sock->sk_socket指向了BSD socket,这样socket和sock可以轻松的互相查询
3. 数据报文在tcp入口,通过ip、端口等信息查询到struct sock信息
4. 如果是tcp协议,tcp_sock = struct tcp_sock *tp = tcp_sk(sk);可以强制转换,看一下这几个结构
struct tcp_sock {
/* inet_connection_sock has to be the first member of tcp_sock */
struct inet_connection_sock inet_conn;
......
struct udp_sock {
/* inet_sock has to be the first member */
struct inet_sock inet;
......
struct inet_connection_sock {
/* inet_sock has to be the first member! */
struct inet_sock icsk_inet;
......
struct inet_sock {
/* sk and pinet6 has to be the first two members of inet_sock */
struct sock sk;
......
inet_sock是INET域专用的一个sock表示,在struct sock上扩展而来,除基本sock属性,提供了INET域专用的属性,如TTL、IP地址、端口等
inet_connection_sock是所有面向连接的协议的socket的相关信息,第一个域是inet_sock,可以方便转换
tcp_sock是tcp协议的专用socket表示,在inet_connection_sock基础上扩展,主要增加了滑动窗口协议、拥塞控制算法等TCP专有属性
udp_sock第一个域也是inet_socket,包括一些加密相关的信息接口,暂时不分析