<-- 返回首页

TCP 源码分析 数据结构和基础

先看一下在用户态调用了socket函数之后,内核部分发生的调用关系。

socket1

这里还有一张图也一起放上,配合起来看显得更清楚。

socket2

结构体

然后整理一下将会遇到的各种乱七八糟的结构体

sock, inet_sock, inet_connection_sock, tcp_sock 是从上到下被包含的,tcp_sock 最大,包含了所有上面的结构。

  struct sock {
     struct sock_common	__sk_common;
        ......
   };
   struct inet_sock {
    /* sk and pinet6 has to be the first two members of inet_sock */
    struct sock		sk;
       ......
   }
   struct inet_connection_sock {
       /* inet_sock has to be the first member! */
       struct inet_sock	  icsk_inet;
       ......
}
   struct tcp_sock {
    /* inet_connection_sock has to be the first member of tcp_sock */
       struct inet_connection_sock	inet_conn;
       ......
}


+-----------------------------------------+
|            sizeof tcp_sock              |   
+-----------------------------------------+
|<--sock-->|                              |    
|<-----inet_sock----->|                   |    
|<------inet_connection_sock---->|        |          
|<----------------tcp_sock--------------->|   

struct socket
这个是基本的BSD socket,面向用户空间,应用程序通过系统调用开始创建的socket都是该结构体,它是基于虚拟文件系统创建出来的,类型主要有三种,即流式、数据报、原始套接字协议

struct sock
它是网络层的socket;对应有TCP、UDP、RAW三种,面向内核驱动,相比socket结构更精细

struct inet_sock
它是 INET 域的socket表示,是对 struct sock 的一个扩展,提供 INET 域的一些属性,如TTL,组播列表,IP地址,端口等

struct raw_socket
它是 RAW 协议的一个socket表示,是对struct inet_sock的扩展,它要处理与ICMP相关的内容;

sturct udp_sock
它是UDP协议的socket表示,是对struct inet_sock的扩展;

struct inet_connection_sock
它是所有面向连接的socket表示,是对struct inet_sock的扩展

struct tcp_sock
它是TCP协议的socket表示,是对struct inet_connection_sock的扩展,主要增加滑动窗口,拥塞控制一些TCP专用属性;

struct inet_timewait_sock 它是网络层用于超时控制的socket表示; struct tcp_timewait_sock 它是TCP协议用于超时控制的socket表示;

net_proto_family目的是为了支持不同的协议,而我只关注af_inet,所以

static struct net_proto_family inet_family_ops = {
    .family = PF_INET,
    .create = inet_create,
    .owner  = THIS_MODULE,
};

参考链接
http://blog.guorongfei.com/2014/10/23/socket-create/


<-- 返回首页