Linux的BSD和INET socket层分别对应于ISO的表示层和会话层,其中有两个比较重要的数据结构:
struct socket
{
socket_state state;
unsigned long flags;
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_t wait;
short type;
unsigned char passcred;
};
其中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. */
__u32 daddr; /* Foreign IPv4 addr */
__u32 rcv_saddr; /* Bound local IPv4 addr */
__u16 dport; /* Destination port */
unsigned short num; /* Local port */
int bound_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 char state, /* Connection state */
zapped; /* In ax25 & ipx means not linked */
__u16 sport; /* Source port */
unsigned short family; /* Address family */
unsigned char reuse; /* SO_REUSEADDR setting */
unsigned char shutdown;
atomic_t refcnt; /* Reference count */
socket_lock_t lock; /* Synchronizer... */
int rcvbuf; /* Size of receive buffer in bytes */
wait_queue_head_t *sleep; /* Sock wait queue */
struct dst_entry *dst_cache; /* Destination cache */
rwlock_t dst_lock;
atomic_t rmem_alloc; /* Receive queue bytes committed */
struct sk_buff_head receive_queue; /* Incoming packets */
atomic_t wmem_alloc; /* Transmit queue bytes committed */
struct sk_buff_head write_queue; /* Packet sending queue */
atomic_t omem_alloc; /* "o" is "option" or "other" */
int wmem_queued; /* Persistent queue size */
int forward_alloc; /* Space allocated forward. */
__u32 saddr; /* Sending source */
unsigned int allocation; /* Allocation mode */
int sndbuf; /* 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 char dead,
done,
urginline,
keepopen,
linger,
destroy,
no_check,
broadcast,
bsdism;
unsigned char debug;
unsigned char rcvtstamp;
unsigned char use_write_queue;
unsigned char userlocks;
/* Hole of 3 bytes. Try to pack. */
int route_caps;
int proc;
unsigned long lingertime;
int hashent;
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_t callback_lock;
/* Error queue, rarely used. */
struct sk_buff_head error_queue;
struct proto *prot;
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
union {
struct ipv6_pinfo af_inet6;
} net_pinfo;
#endif
union {
struct tcp_opt af_tcp;
#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)
struct raw_opt tp_raw4;
#endif
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
struct raw6_opt tp_raw;
#endif /* CONFIG_IPV6 */
#if defined(CONFIG_SPX) || defined (CONFIG_SPX_MODULE)
struct spx_opt af_spx;
#endif /* CONFIG_SPX */
} tp_pinfo;
int err, err_soft; /* Soft holds errors that don't
cause failure but are the cause
of a persistent failure not just
'timed out' */
unsigned short ack_backlog;
unsigned short max_ack_backlog;
__u32 priority;
unsigned short type;
unsigned char localroute; /* Route locally only */
unsigned char protocol;
struct ucred peercred;
int rcvlowat;
long rcvtimeo;
long sndtimeo;
#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_opt af_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_sock af_at;
#endif
#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
struct ipx_opt af_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_list timer; /* This is the sock cleanup timer. */
struct timeval stamp;
/* 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队列上摘下的数据包。
分享到:
相关推荐
2. **套接字地址族层**:基于BSD Socket接口的不同协议栈入口,例如TCP/IP网络协议栈使用AF_INET套接字地址族,本地进程间通信则可能使用AF_UNIX域套接字等。 3. **网络协议层**:实现具体的网络协议族,如TCP/IP...
Linux协议栈是操作系统的核心组成部分,负责处理网络通信的各个层面,包括从应用层的数据传递到物理层的帧传输。在Linux系统中,TCP/IP协议栈的实现基于源代码,这为开发者提供了深入理解网络通信机制的窗口。下面将...
Linux网络系统由硬件层、数据链路层、IP层、INET Socket层和BSD Socket层以及应用层组成。这些层次分别对应于网络协议栈的不同部分,其中内核部分包括硬件层至IP层,而应用层则涉及用户空间的网络编程。 作者深入...
首先,TCP协议栈是基于TCP/IP模型构建的,该模型由五层组成:应用层、BSD Socket层、网络层、INET Socket层和硬件层。应用层是用户与网络交互的接口,如HTTP、FTP等协议在此层工作;BSD Socket层是应用程序与网络...
在Linux系统中,TCP/IP协议栈的实现是通过一系列相互关联的层次结构完成的,如BSD Socket层、INET Socket层和IP层。BSD Socket层提供了通用的套接字管理,支持基于IP的协议;INET Socket层管理TCP和UDP的传输端点;...
Linux下的TCP/IP协议栈包含了BSD Socket层,这一层提供了通用的套接字管理,支持INET Socket层处理TCP和UDP的传输端点。IP层则是协议栈的关键部分,它为数据添加IP头并负责数据包的路由。在IP层之下,有各种具体的...
在文章的后半部分,讨论了Linux网络系统的结构和实现技术,包括BSD Socket层、套接字地址族层、INET Socket层等。文章还讨论了Linux网络协议栈的整体层次结构和一些关键数据结构的实现细节。 本文提出了基于Linux的...
### Linux协议栈阅读笔记知识点详解 #### 一、协议栈概述 ...通过以上知识点的详细解释,我们可以深入了解Linux协议栈的基本概念和技术细节,这对于进一步研究和开发基于Linux的网络应用程序具有重要的指导意义。
本书主要对Linux 1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux网络协议结构。 本书共分为5个...
Linux TCP/IP协议栈是操作系统内核中的核心组件,负责网络数据的传输和处理。它遵循了OSI模型的七层架构,但在Linux中通常被简化为四层:应用层、传输层、网络层和数据链路层。在这个文档中,我们将深入探讨Linux ...
Linux内核网络栈代码主要由四个层次组成:BSD socket层、INET socket层、TCP/UDP层和IP层。 BSD socket层:这是一个抽象的网络接口层,提供了基本的socket操作,包括socket创建、连接、发送和接收等。BSD socket层...
Linux TCP/IP协议栈是操作系统中处理网络通信的核心组件,它负责实现Internet协议族(Internet Protocol Suite)中的TCP/IP协议。在阅读Linux内核的TCP/IP源代码时,理解其架构和主要组件至关重要。以下是对Linux...
- **inet_proto_init**:这是INET域的初始化入口函数,由`proto_init`调用,用于初始化TCP/IP协议栈。 #### 第2章:BSD socket层实现分析 本章分析了Linux内核中BSD socket层的实现细节,重点关注net/protocol.c和...
- Socket是网络通信中的接口,可以看作是应用程序与网络协议栈之间的桥梁。 - 在Linux中,Socket主要基于Berkeley套接字API,源自BSD(Berkeley Software Distribution)系统。 2. **创建Socket**: - 使用`...
INET SOCKET主要处理TCP/IP协议栈中的工作,包括IP层和TCP/UDP等传输层协议。 3. **IP 层** - **Socket缓存**:为了提高性能,Linux内核会缓存socket结构,减少内存分配的开销。 - **接收IP包**:内核通过`...
INET Sockets层是Linux网络结构的关键部分,它支持TCP/IP协议栈。TCP/IP协议栈中的每一层都有其特定的职责,如链路层处理物理网络连接,网络层(IP层)负责数据包的路由,传输层(TCP/UDP层)处理端到端的数据传输,...
Linux 作为一个单一内核的操作系统,协议栈的实现嵌在系统内核中,本文分析了 TCP/IP 协议的基本原理以及 Linux 中的 TCP/IP 网络层次结构,重点介绍了 Linux 环境下的 socket 编程。 Linux 环境下的网络编程是指在...
除了核心代码之外,Linux内核中还包含了BSD Socket层和Inet层的非核心代码分析。在BSD Socket层中,例如msg_flag、数据报类型、SockCheckSum、SKStream等,这些都是为了支持更高层次的socket编程接口。而在Inet层中...