Linux的BSD和INET  socket层分别对应于ISO的表示层和会话层,其中有两个比较重要的数据结构:

struct socket

{

socket_statestate;

unsigned longflags;

struct proto_ops*ops;

struct inode*inode;

struct fasync_struct*fasync_list;/* Asynchronous wake up list*/

struct file*file;/* File back pointer for gc*/

struct sock*sk;

wait_queue_head_twait;

shorttype;

unsigned charpasscred;

};

其中state表示socket当前的状态,file和inode指向文件系统的文件描述符和节点信息。每个文件描述符都要对应一个inode节点,其中file->f_inode指向inode节点。

struct proto_ops *ops是一个L6层的处理函数,pops数组将在sock_register中初始化,对应于不同的作用域将被初始化为不同的值。fasync_list用于异步唤醒,对应的函数是sock_wake_async()。

而struct sock *sk 就是我们要说的另外一个非常重要的数据结构,相对于socket只应用于L6层,sock贯穿于L2~L5层并且做过各层之间贯穿的一个纽带。

struct sock {

/* Socket demultiplex comparisons on incoming packets. */

__u32daddr;/* Foreign IPv4 addr*/

__u32rcv_saddr;/* Bound local IPv4 addr*/

__u16dport;/* Destination port*/

unsigned shortnum;/* Local port*/

intbound_dev_if;/* Bound device index if != 0*/

/* Main hash linkage for various protocol lookup tables. */

struct sock*next;

struct sock**pprev;

struct sock*bind_next;

struct sock**bind_pprev;

volatile unsigned charstate,/* Connection state*/

zapped;/* In ax25 & ipx means not linked*/

__u16sport;/* Source port*/

unsigned shortfamily;/* Address family*/

unsigned charreuse;/* SO_REUSEADDR setting*/

unsigned charshutdown;

atomic_trefcnt;/* Reference count*/

socket_lock_tlock;/* Synchronizer...*/

intrcvbuf;/* Size of receive buffer in bytes*/

wait_queue_head_t*sleep;/* Sock wait queue*/

struct dst_entry*dst_cache;/* Destination cache*/

rwlock_tdst_lock;

atomic_trmem_alloc;/* Receive queue bytes committed*/

struct sk_buff_headreceive_queue;/* Incoming packets*/

atomic_twmem_alloc;/* Transmit queue bytes committed*/

struct sk_buff_headwrite_queue;/* Packet sending queue*/

atomic_tomem_alloc;/* "o" is "option" or "other" */

intwmem_queued;/* Persistent queue size */

intforward_alloc;/* Space allocated forward. */

__u32saddr;/* Sending source*/

unsigned intallocation;/* Allocation mode*/

intsndbuf;/* Size of send buffer in bytes*/

struct sock*prev;

/* Not all are volatile, but some are, so we might as well say they all are.

* XXX Make this a flag word -DaveM

*/

volatile chardead,

done,

urginline,

keepopen,

linger,

destroy,

no_check,

broadcast,

bsdism;

unsigned chardebug;

unsigned charrcvtstamp;

unsigned charuse_write_queue;

unsigned charuserlocks;

/* Hole of 3 bytes. Try to pack. */

introute_caps;

intproc;

unsigned long lingertime;

inthashent;

struct sock*pair;

/* The backlog queue is special, it is always used with

* the per-socket spinlock held and requires low latency

* access. Therefore we special case it's implementation.

*/

struct {

struct sk_buff *head;

struct sk_buff *tail;

} backlog;

rwlock_tcallback_lock;

/* Error queue, rarely used. */

struct sk_buff_headerror_queue;

struct proto*prot;

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)

union {

struct ipv6_pinfoaf_inet6;

} net_pinfo;

#endif

union {

struct tcp_optaf_tcp;

#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)

struct raw_opttp_raw4;

#endif

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)

struct raw6_opttp_raw;

#endif /* CONFIG_IPV6 */

#if defined(CONFIG_SPX) || defined (CONFIG_SPX_MODULE)

struct spx_optaf_spx;

#endif /* CONFIG_SPX */

} tp_pinfo;

interr, err_soft;/* Soft holds errors that don't

cause failure but are the cause

of a persistent failure not just

'timed out' */

unsigned shortack_backlog;

unsigned shortmax_ack_backlog;

__u32priority;

unsigned shorttype;

unsigned charlocalroute;/* Route locally only */

unsigned charprotocol;

struct ucredpeercred;

intrcvlowat;

longrcvtimeo;

longsndtimeo;

#ifdef CONFIG_FILTER

/* Socket Filtering Instructions */

struct sk_filter *filter;

#endif /* CONFIG_FILTER */

/* This is where all the private (optional) areas that don't

* overlap will eventually live.

*/

union {

void *destruct_hook;

struct unix_optaf_unix;

#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)

struct inet_opt af_inet;

#endif

#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)

struct atalk_sockaf_at;

#endif

#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)

struct ipx_optaf_ipx;

#endif

#if defined (CONFIG_DECNET) || defined(CONFIG_DECNET_MODULE)

struct dn_scp dn;

#endif

#if defined (CONFIG_PACKET) || defined(CONFIG_PACKET_MODULE)

struct packet_opt*af_packet;

#endif

#if defined(CONFIG_X25) || defined(CONFIG_X25_MODULE)

x25_cb*x25;

#endif

#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)

ax25_cb*ax25;

#endif

#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)

nr_cb*nr;

#endif

#if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)

rose_cb*rose;

#endif

#if defined(CONFIG_PPPOE) || defined(CONFIG_PPPOE_MODULE)

struct pppox_opt*pppox;

#endif

struct netlink_opt*af_netlink;

#if defined(CONFIG_ECONET) || defined(CONFIG_ECONET_MODULE)

struct econet_opt*af_econet;

#endif

#if defined(CONFIG_ATM) || defined(CONFIG_ATM_MODULE)

struct atm_vcc*af_atm;

#endif

#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)

struct irda_sock *irda;

#endif

#if defined(CONFIG_WAN_ROUTER) || defined(CONFIG_WAN_ROUTER_MODULE)

struct wanpipe_opt *af_wanpipe;

#endif

} protinfo;

/* This part is used for the timeout functions. */

struct timer_listtimer;/* This is the sock cleanup timer. */

struct timevalstamp;

/* Identd and reporting IO signals */

struct socket*socket;

/* RPC layer private data */

void*user_data;

/* Callbacks */

void(*state_change)(struct sock *sk);

void(*data_ready)(struct sock *sk,int bytes);

void(*write_space)(struct sock *sk);

void(*error_report)(struct sock *sk);

int(*backlog_rcv) (struct sock *sk,

struct sk_buff *skb);

void (*destruct)(struct sock *sk);

};

write_queue表示待发送到队列,send_head和send_tail表示队列数据包已经发送出去尚未收到应答;receive_queue为读队列其不同于back_log在于后者缓冲从网络层传上来的数据包然后移至receive_queue队列,如果此时此时缓冲区太小则直接丢弃从back_log队列上摘下的数据包。

linux 协议栈之socket,Linux协议栈之BSD和INET socket层(一)相关推荐

  1. linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)

    内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...

  2. linux listen监听,Linux网络协议栈 -- socket listen监听

    一.sys_listen 对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog); ...

  3. Linux Kernel TCP/IP Stack — 协议栈收包处理流程

    目录 文章目录 目录 L2 NIC Controller 收包处理流程 L3-4 收包处理流程 Socket Layer 收包处理流程 参考文档 L2 NIC Controller 收包处理流程 硬件 ...

  4. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  5. 理解 Linux 网络栈:Linux 网络协议栈简单总结

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  6. linux 网络路径中网络协议栈有几种,linux网络路径中网络协议栈有几种

    网络路径有很多种,其中的linux网络路径是最常用的,也是最需要关注的.linux网络路径中网络协议栈有几种?电脑新装系统漏洞应不应该修复?了解网络安全常识,首先就要了解计算机网络安全有哪些基本注意事 ...

  7. Linux Kernel TCP/IP Stack — 协议栈发包处理流程

    目录 文章目录 目录 协议栈发包处理流程 参考文档 协议栈发包处理流程 以 UDP 数据报为例: 应用层:可以通过 System Call 接口层或文件操作来调用内核函数,BSD socket 层的 ...

  8. 怎样实现linux的网络通信协议是,一种基于Linux系统的TCP/IP协议栈的实现

    一种基于Linux系统的TCP/IP协议栈的实现 本文分析了Linux内核TCP/IP协议栈的实现,给出了Linux网络数据处理流程,探讨了Linux的I (本文共3页) 阅读全文>> 介 ...

  9. Linux 释放socket资源,LwIP使用select,close socket资源释放不完全问题

    这篇文章本应该在4月就写好的,但是博客评论系统一直没有搭建好,走了很多弯路,现在好了,delay这么久,终于要要补过来了.自建博客:金宝的博客 该文章完全原创,除通用.广泛的知识点外,均为个人总结,如 ...

最新文章

  1. php session 在线用户,php – 使用$_SESSION超全局获取当前在线用户并将其重新设置回当前会话数据是否很难?...
  2. 【IP地址の乾坤大挪移】C语言实现“IP地址/数字”互转
  3. rtmp官方协议详解
  4. django数据库模型搭建ORM
  5. 《JavaScript 高级程序设计》笔记 第1~5章
  6. 试卷汇编与解析二级C语言,计算机等级考试试卷汇编与解析
  7. python跳出两层(多层)循环--使用标志量
  8. python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!
  9. RxJava操作符相关学习资料
  10. SuperMap iDesktop入门实战-张杰-专题视频课程
  11. PLC气动机械手控制系统毕业设计【附带仿真】
  12. 国科大模式识别与机器学习课程整理
  13. YoutuBe 是如何利用深度学习解决搜索推荐问题的? (一) - 论文翻译
  14. R包minfi处理DNA甲基化芯片数据
  15. 贸易进出口管理-报关单管理
  16. Andriod 获取手机CPU型号设备信息
  17. 一些 金融知识 小结
  18. 关于test eax eax
  19. zzulioj 1055: 兔子繁殖问题
  20. SAP ECC 6.0 下载以及安装

热门文章

  1. js push(),pop(),unshift(),shift()的用法小结
  2. [END_OBJECT] but found [FIELD_NAME]')
  3. Python操作MySQL之SQLAlchemy
  4. tf torch keras 数据增强 data augmentation
  5. Android中开发需要的高效助推的命令总结
  6. opencv倾斜矫正
  7. 青龙羊毛——飞鸽花转省毛毛(搬运)
  8. 青龙羊毛——广汽三菱(搬运)
  9. 机器人攻牙_惠东攻牙机
  10. mysql 账号权限过期_Mysql用户忘记密码及密码过期问题的处理方法