轻松看懂网络栈主要结构介绍(socket、sock、sk_buff,etc)

1、socket

(include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。

/* 
 * Internal representation of a socket. not all the fields are used by 
 * all configurations: 
 * 
 *            server                client 
 * conn     client connected to server connected to 
 * iconn        list of clients     -unused- 
 *       awaiting connections 
 * wait     sleep for clients,  sleep for connection, 
 *          sleep for i/o               sleep for i/o 
 */  
 //该结构表示一个网络套接字  
struct socket {  
  short         type;       /* 套接字所用的流类型*/  
  socket_state      state;//套接字所处状态  
  long          flags;//标识字段,目前尚无明确作用  
  struct proto_ops  *ops;       /* 操作函数集指针  */  
    /* data保存指向‘私有'数据结构指针,在不同的域指向不同的数据结构        */  
  //在INET域,指向sock结构,UNIX域指向unix_proto_data结构  
  void          *data;    
  //下面两个字段只用于UNIX域  
  struct socket     *conn;      /* 指向连接的对端套接字   */  
  struct socket     *iconn;     /* 指向正等待连接的客户端(服务器端)    */  
  struct socket     *next;//链表  
  struct wait_queue **wait;     /* 等待队列 */  
  struct inode      *inode;//inode结构指针  
  struct fasync_struct  *fasync_list;   /* 异步唤醒链表结构 */  
};  

2、sock

(include\linux\Net.h) sock 的使用范围比socket 要大得多,sock结构的使用基本贯穿硬件层、设备接口层、ip层、INET socket 层,而且是作为各层之间的一个联系,主要是因为无论是发送还是接收的数据包都要被缓存到sock 结构中的缓冲队列中。

sock 结构与其对应的 socket 会相互绑定。

/* 
 * This structure really needs to be cleaned up. 
 * Most of it is for TCP, and not used by any of 
 * the other protocols. 
 * 大部分功能是为TCP准备的 
 */  
struct sock {  
  struct options        *opt;//IP选项缓冲于此处  
  volatile unsigned long    wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用  
  volatile unsigned long    rmem_alloc;//接收缓冲队列中存放的数据的大小  
  /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */  
  unsigned long         write_seq;//  
  unsigned long         sent_seq;//  
  unsigned long         acked_seq;//  
  unsigned long         copied_seq;//应用程序有待读取(但尚未读取)数据的第一个序列号  
  unsigned long         rcv_ack_seq;//目前本地接收到的对本地发送数据的应答序列号  
  unsigned long         window_seq;//窗口大小  
  unsigned long         fin_seq;//应答序列号  
  //下面两个字段用于紧急数据处理  
  unsigned long         urg_seq;//紧急数据最大序列号  
  unsigned long         urg_data;//标志位,1表示收到紧急数据  
  
  /* 
   * Not all are volatile, but some are, so we 
   * might as well say they all are. 
   */  
  volatile char                 inuse,//表示其他进程正在使用该sock结构,本进程需等待  
                dead,//表示该sock结构已处于释放状态  
                urginline,//=1,表示紧急数据将被当做普通数据处理  
                intr,//  
                blog,  
                done,  
                reuse,  
                keepopen,//=1,使用保活定时器  
                linger,//=1,表示在关闭套接字时需要等待一段时间以确认其已关闭  
                delay_acks,//=1,表示延迟应答  
                destroy,//=1,表示该sock结构等待销毁  
                ack_timed,  
                no_check,  
                zapped, /* In ax25 & ipx means not linked */  
                broadcast,  
                nonagle;//=1,表示不使用NAGLE算法  
                //NAGLE算法:在前一个发送的数据包被应答之前,不可再继续发送其它数据包  
  unsigned long             lingertime;//等待关闭操作的时间  
  int               proc;//该sock结构所属的进程的进程号  
  struct sock           *next;  
  struct sock           *prev; /* Doubly linked chain.. */  
  struct sock           *pair;  
  //下面两个字段用于TCP协议重发队列  
  struct sk_buff        * volatile send_head;//这个队列中的数据均已经发送出去,但尚未接收到应答  
  struct sk_buff        * volatile send_tail;  
  struct sk_buff_head       back_log;//接收的数据包缓存队列,当套接字正忙时,数据包暂存在这里  
  struct sk_buff        *partial;//用于创建最大长度的待发送数据包  
  struct timer_list     partial_timer;//定时器,用于按时发送partial指针指向的数据包  
  long              retransmits;//重发次数  
  struct sk_buff_head       write_queue,//指向待发送数据包  
                receive_queue;//读队列,表示数据报已被正式接收,该队列中的数据可被应用程序读取?  
  struct proto          *prot;//传输层处理函数集  
  struct wait_queue     **sleep;  
  unsigned long         daddr;//sock结构所代表套接字的远端地址  
  unsigned 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值