linux 协议栈之socket,Linux协议栈之BSD和INET socket层(一)
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层(一)相关推荐
- linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)
内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...
- linux listen监听,Linux网络协议栈 -- socket listen监听
一.sys_listen 对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog); ...
- Linux Kernel TCP/IP Stack — 协议栈收包处理流程
目录 文章目录 目录 L2 NIC Controller 收包处理流程 L3-4 收包处理流程 Socket Layer 收包处理流程 参考文档 L2 NIC Controller 收包处理流程 硬件 ...
- linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...
1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...
- 理解 Linux 网络栈:Linux 网络协议栈简单总结
1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...
- linux 网络路径中网络协议栈有几种,linux网络路径中网络协议栈有几种
网络路径有很多种,其中的linux网络路径是最常用的,也是最需要关注的.linux网络路径中网络协议栈有几种?电脑新装系统漏洞应不应该修复?了解网络安全常识,首先就要了解计算机网络安全有哪些基本注意事 ...
- Linux Kernel TCP/IP Stack — 协议栈发包处理流程
目录 文章目录 目录 协议栈发包处理流程 参考文档 协议栈发包处理流程 以 UDP 数据报为例: 应用层:可以通过 System Call 接口层或文件操作来调用内核函数,BSD socket 层的 ...
- 怎样实现linux的网络通信协议是,一种基于Linux系统的TCP/IP协议栈的实现
一种基于Linux系统的TCP/IP协议栈的实现 本文分析了Linux内核TCP/IP协议栈的实现,给出了Linux网络数据处理流程,探讨了Linux的I (本文共3页) 阅读全文>> 介 ...
- Linux 释放socket资源,LwIP使用select,close socket资源释放不完全问题
这篇文章本应该在4月就写好的,但是博客评论系统一直没有搭建好,走了很多弯路,现在好了,delay这么久,终于要要补过来了.自建博客:金宝的博客 该文章完全原创,除通用.广泛的知识点外,均为个人总结,如 ...
最新文章
- php session 在线用户,php – 使用$_SESSION超全局获取当前在线用户并将其重新设置回当前会话数据是否很难?...
- 【IP地址の乾坤大挪移】C语言实现“IP地址/数字”互转
- rtmp官方协议详解
- django数据库模型搭建ORM
- 《JavaScript 高级程序设计》笔记 第1~5章
- 试卷汇编与解析二级C语言,计算机等级考试试卷汇编与解析
- python跳出两层(多层)循环--使用标志量
- python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!
- RxJava操作符相关学习资料
- SuperMap iDesktop入门实战-张杰-专题视频课程
- PLC气动机械手控制系统毕业设计【附带仿真】
- 国科大模式识别与机器学习课程整理
- YoutuBe 是如何利用深度学习解决搜索推荐问题的? (一) - 论文翻译
- R包minfi处理DNA甲基化芯片数据
- 贸易进出口管理-报关单管理
- Andriod 获取手机CPU型号设备信息
- 一些 金融知识 小结
- 关于test eax eax
- zzulioj 1055: 兔子繁殖问题
- SAP ECC 6.0 下载以及安装
热门文章
- js push(),pop(),unshift(),shift()的用法小结
- [END_OBJECT] but found [FIELD_NAME]')
- Python操作MySQL之SQLAlchemy
- tf torch keras 数据增强 data augmentation
- Android中开发需要的高效助推的命令总结
- opencv倾斜矫正
- 青龙羊毛——飞鸽花转省毛毛(搬运)
- 青龙羊毛——广汽三菱(搬运)
- 机器人攻牙_惠东攻牙机
- mysql 账号权限过期_Mysql用户忘记密码及密码过期问题的处理方法