`
waterlife
  • 浏览: 66991 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Linux协议栈之BSD和INET socket层(一)

阅读更多

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 楼 firojre 2013-02-26  
我觉得你把OSI model 和Network socket 混淆了。
http://www.ibm.com/developerworks/library/l-linux-networking-stack/#icomments
1 楼 firojre 2013-02-26  
Linux的BSD和INET  socket层分别对应于ISO的表示层和会话层. 应该是OSI的表示和会话层。

敢问,这句话出处在哪里?
望不吝赐教!

相关推荐

    基于Linux网络协议栈的嵌入式开发

    2. **套接字地址族层**:基于BSD Socket接口的不同协议栈入口,例如TCP/IP网络协议栈使用AF_INET套接字地址族,本地进程间通信则可能使用AF_UNIX域套接字等。 3. **网络协议层**:实现具体的网络协议族,如TCP/IP...

    linux协议栈源码阅读笔记

    Linux协议栈是操作系统的核心组成部分,负责处理网络通信的各个层面,包括从应用层的数据传递到物理层的帧传输。在Linux系统中,TCP/IP协议栈的实现基于源代码,这为开发者提供了深入理解网络通信机制的窗口。下面将...

    基于Linux网络协议栈实现及应用.pdf

    Linux网络系统由硬件层、数据链路层、IP层、INET Socket层和BSD Socket层以及应用层组成。这些层次分别对应于网络协议栈的不同部分,其中内核部分包括硬件层至IP层,而应用层则涉及用户空间的网络编程。 作者深入...

    linux下网络协议栈的分析与原始套接口开发的设计与实现

    首先,TCP协议栈是基于TCP/IP模型构建的,该模型由五层组成:应用层、BSD Socket层、网络层、INET Socket层和硬件层。应用层是用户与网络交互的接口,如HTTP、FTP等协议在此层工作;BSD Socket层是应用程序与网络...

    一种基于Linux系统的TCP_IP协议栈的实现 (1).pdf

    在Linux系统中,TCP/IP协议栈的实现是通过一系列相互关联的层次结构完成的,如BSD Socket层、INET Socket层和IP层。BSD Socket层提供了通用的套接字管理,支持基于IP的协议;INET Socket层管理TCP和UDP的传输端点;...

    一种基于Linux系统的TCP_IP协议栈的实现.pdf

    Linux下的TCP/IP协议栈包含了BSD Socket层,这一层提供了通用的套接字管理,支持INET Socket层处理TCP和UDP的传输端点。IP层则是协议栈的关键部分,它为数据添加IP头并负责数据包的路由。在IP层之下,有各种具体的...

    基于Linux的嵌入式Web服务器网络协议栈的设计.pdf

    在文章的后半部分,讨论了Linux网络系统的结构和实现技术,包括BSD Socket层、套接字地址族层、INET Socket层等。文章还讨论了Linux网络协议栈的整体层次结构和一些关键数据结构的实现细节。 本文提出了基于Linux的...

    Linux协议栈阅读笔记

    ### Linux协议栈阅读笔记知识点详解 #### 一、协议栈概述 ...通过以上知识点的详细解释,我们可以深入了解Linux协议栈的基本概念和技术细节,这对于进一步研究和开发基于Linux的网络应用程序具有重要的指导意义。

    LINUX-1.2.13内核网络栈实现.pdf

    本书主要对Linux 1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux网络协议结构。 本书共分为5个...

    linux tcpip协议栈.doc

    Linux TCP/IP协议栈是操作系统内核中的核心组件,负责网络数据的传输和处理。它遵循了OSI模型的七层架构,但在Linux中通常被简化为四层:应用层、传输层、网络层和数据链路层。在这个文档中,我们将深入探讨Linux ...

    TCP、IP驱动结构介绍

    Linux内核网络栈代码主要由四个层次组成:BSD socket层、INET socket层、TCP/UDP层和IP层。 BSD socket层:这是一个抽象的网络接口层,提供了基本的socket操作,包括socket创建、连接、发送和接收等。BSD socket层...

    linux-TcpIP协议栈源码阅读笔记.pdf

    Linux TCP/IP协议栈是操作系统中处理网络通信的核心组件,它负责实现Internet协议族(Internet Protocol Suite)中的TCP/IP协议。在阅读Linux内核的TCP/IP源代码时,理解其架构和主要组件至关重要。以下是对Linux...

    《LINUX内核网络栈源代码情景分析》笔记

    - **inet_proto_init**:这是INET域的初始化入口函数,由`proto_init`调用,用于初始化TCP/IP协议栈。 #### 第2章:BSD socket层实现分析 本章分析了Linux内核中BSD socket层的实现细节,重点关注net/protocol.c和...

    SOCKET-on-Linux.zip_linux socket_linux socket_linux_socket

    - Socket是网络通信中的接口,可以看作是应用程序与网络协议栈之间的桥梁。 - 在Linux中,Socket主要基于Berkeley套接字API,源自BSD(Berkeley Software Distribution)系统。 2. **创建Socket**: - 使用`...

    Linux网络源码学习

    INET SOCKET主要处理TCP/IP协议栈中的工作,包括IP层和TCP/UDP等传输层协议。 3. **IP 层** - **Socket缓存**:为了提高性能,Linux内核会缓存socket结构,减少内存分配的开销。 - **接收IP包**:内核通过`...

    Linux网络结构及实现分析.pdf

    INET Sockets层是Linux网络结构的关键部分,它支持TCP/IP协议栈。TCP/IP协议栈中的每一层都有其特定的职责,如链路层处理物理网络连接,网络层(IP层)负责数据包的路由,传输层(TCP/UDP层)处理端到端的数据传输,...

    Linux环境下的网络编程.pdf

    Linux 作为一个单一内核的操作系统,协议栈的实现嵌在系统内核中,本文分析了 TCP/IP 协议的基本原理以及 Linux 中的 TCP/IP 网络层次结构,重点介绍了 Linux 环境下的 socket 编程。 Linux 环境下的网络编程是指在...

    Linux 4.4.0 内核源码分析 TCP实现

    除了核心代码之外,Linux内核中还包含了BSD Socket层和Inet层的非核心代码分析。在BSD Socket层中,例如msg_flag、数据报类型、SockCheckSum、SKStream等,这些都是为了支持更高层次的socket编程接口。而在Inet层中...

Global site tag (gtag.js) - Google Analytics