Linux TCP/IP协议栈剖析【体系结构篇】

解析pcap文件,逐步认识tcp/ip协议栈 通过解析pcap初步认识协议栈 阅读详情

最近在看linux内核代码,学习之余记点笔记。但是,目前整个linux源码文件大小是360M,相当于100个哈利波特全集-_-,看完的都是神仙了。所以我只准备粗略地看下它的TCP/IP协议栈,然后记点心得。

嗯,我研究的内核版本是目前最新的,linux-2.6.33.1,其实应该都大同小异。学习源码时,首先应该把它的整体脉络理清楚,然后再局部细看,这是最简捷的。本文也是简洁的归纳一下。

在linux下,socket都挂接到虚拟文件系统(VFS)上,所以可以把它当做文件来操作,如write()与read()都可以对它使用。

当我们调用fd = socket()操作时,传递过程从上到下如下所示:

VFS层:file

运输层:socket

网络层:sock

嗯,相信大家都知道了吧,VFS层上面就是应用层了,每本计算机网络相关书籍总是会先讲这几个层级结构。其中file, socket, sock是对应层次的一个内核结构,file涉及到虚拟文件系统,所以不予剖析了。

我们先看看socket结构的定义:

struct socket {
	socket_state		state;

	kmemcheck_bitfield_begin(type);
	short			type;
	kmemcheck_bitfield_end(type);

	unsigned long		flags;
	/*
	 * Please keep fasync_list & wait fields in the same cache line
	 */
	struct fasync_struct	*fasync_list;
	wait_queue_head_t	wait;

	struct file		*file;
	struct sock		*sk;
	const struct proto_ops	*ops;
};

我们只关心最后3个结构成员,file就是对应上面的VFS层,sk则是下面的网络层,而ops则指向一个函数指针集合,对应于该运输层的操作,实际上它可指向3个集合:inet_stream_ops,  inet_dgram_ops,  inet_sockraw_ops。还记得我们创建socket时需要设定的type参数吗,SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,相应的参数使套接字在初始化时让ops指向对应的函数指针集合。

下面就是这个函数指针集合的定义:

struct proto_ops {
	int		family;
	struct module	*owner;
	int		(*release)   (struct socket *sock);
	int		(*bind)	     (struct socket *sock,
				      struct sockaddr *myaddr,
				      int sockaddr_len);
	int		(*connect)   (struct socket *sock,
				      struct sockaddr *vaddr,
				      int sockaddr_len, int flags);
	int		(*accept)    (struct socket *sock,
				      struct socket *newsock, int flags);
	unsigned int	(*poll)	     (struct file *file, struct socket *sock,
				      struct poll_table_struct *wait);
	int		(*ioctl)     (struct socket *sock, unsigned int cmd,
				      unsigned long arg);
	int		(*listen)    (struct socket *sock, int len);
	int		(*shutdown)  (struct socket *sock, int flags);
	int		(*setsockopt)(struct socket *sock, int level,
				      int optname, char __user *optval, unsigned int optlen);
	int		(*getsockopt)(struct socket *sock, int level,
				      int optname, char __user *optval, int __user *optlen);
	int		(*sendmsg)   (struct kiocb *iocb, struct socket *sock,
				      struct msghdr *m, size_t total_len);
	int		(*recvmsg)   (struct kiocb *iocb, struct socket *sock,
				      struct msghdr *m, size_t total_len,
				      int flags);
        。。。。。。。
};

是不是都似曾相识呢,对,上面的都是套接字的常用操作。

最后,我们再看看网络层,sock结构,只列举了我觉得有用的成员,这个结构很长。

struct sock {

	struct sock_common	__sk_common;


	struct sk_buff_head	sk_receive_queue;
	struct sk_buff_head	sk_write_queue;


	struct socket		*sk_socket;
	void			*sk_user_data;
	struct sk_buff		*sk_send_head;


	void			(*sk_state_change)(struct sock *sk);
	void			(*sk_data_ready)(struct sock *sk, int bytes);
	void			(*sk_write_space)(struct sock *sk);
	void			(*sk_error_report)(struct sock *sk);
  	int			(*sk_backlog_rcv)(struct sock *sk,
						  struct sk_buff *skb);  
	void                    (*sk_destruct)(struct sock *sk);
};

加下划线的两个函数指针,用于与更底层交互,当网卡有数据可读可写时用于回调。继续钻下去的话还会很深。最重要的是,它的头部是一个sock_common 结构。嗯,这相当于一个面向对象的设计,sock_common就类似是一个基类,通过强制转换可以转化。还要关注下sk_buff_head结构,他是socket内部使用的缓冲区,链表形式,以后我再写下它。


sock_common结构定义如下:同样只是简单列举一些重要的。

struct sock_common {
	union {
		struct hlist_node	skc_node;
		struct hlist_nulls_node skc_nulls_node;
	};
	atomic_t		skc_refcnt;
	int			skc_tx_queue_mapping;

	unsigned short		skc_family;
	volatile unsigned char	skc_state;
	unsigned char		skc_reuse;
	int			skc_bound_dev_if;

	struct proto		*skc_prot;

};
注意skc_prot也指向一个函数指针集合,对应于网络层的各种操作。但是据我观察,按理说tcp_recv应该在socket层调用,而实际上该tcp_recv却定义在sock层,socket层只是简单跳转一下,由skc_prot调用,我想可能是为了方便tcp协议的实现吧。

 

好了,大概结构就是这样的吧。。可以看到,就算是C语言,也运用了很多面向对象的思想。还有很抱歉,我本来准备画图说明的,结果还是惰性使然,就没画了。本来体系结构就是个很模糊的东西,关于数据包的接收与传送,以及他们在这体系结构间的传递,下篇再讲解。

LinuxTCP/IP协议栈的简单脉络分析 最近在写网络编程方面的一些东西,然后遇到了关于传输上的小问题。由于之前有简单的看过一些TCP/IP详解的一些东西,所以索性就找了本《追踪LinuxTCP/IP代码运行》的书看了一上午,结果发现初次接触这些内核方面的东西,收获甚微。于是又在网上找相关类的大神博客,拿来拜读,虽然依然看的不是太明白,吸收的也不够好,但是我想以博客的形式把它记录下来,也希望能为我以后学这些东西开个好头吧1.linux网络 阅读详情

相关推荐

剖析 Linux 4.19 内核中的 TCP/IP 协议栈

综上所述,数据从网卡接收到进入内核,通过网络驱动程序提交给内核协议栈,从网络层到传输层的各个层次处理,最终通过 socket 接口传递给用户空间的应用程序。这一过程中涉及的关键函数包括 netif_receive_skb, ip_rcv, tcp_v4_rcv 以及 tcp_recvmsg 等。这些步骤展示了从硬件层接收到数据包,通过内核协议栈处理,再传递给应用程序的基本过程。在实际操作中,协议栈会涉及更多复杂的操作和处理,以确保数据可靠高效地传输。

数字人生 1098

Linux-TCPIP协议栈(基于3.10)

分为上和下,上共九章,部侧重于 TCP/IP 数据收发流程,即 OSI 模型的 IP 和 TCP 层,下也是九章,并不属于 TCP/IP 本身,但是多少和 网络有关且常用到,比如 LC-trie 路由、netfilter 包过滤防火、还有一些 网络相关的命令行工具等,文末给出 IPV6 的协议栈模型图,此外还给出了 测试源码。

Linux Kernel TCP/IP Stack — 协议栈初始化处理流程

目录 文章目录目录数据报文数据报文的封装与分用数据报文首部的数据结构ethhdr:描述以太网数据帧首部iphdr:描述 IP 数据报首部udphdr:描述 UDP 数据段首部Linux 内核网络协议栈内核网络协议栈的分层结构数据结构参考文章 数据报文 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作...

烟云的计算 8077

linux TCPIP 协议栈.pdf

linux TCP/IP 协议栈教程 比较详细的介绍了linux内核以及TCP/IP协议栈的原理和源代码分析

linux如何强化tcp ip堆栈安全,如何强化TCP/IP堆栈安全

主要向大家介绍强化Windows2000 Server 服务器家族系统的TCP/IP堆栈的方法。其实非常简单,通过对Windows注册表的参数配置,就可以保护服务器免遭网络级别的拒绝服务攻击,包括SYN洪水攻击、ICMP攻击和SNMP攻击。SYN攻击利用了TCP/IP连接建立机制的安全漏洞。要实施SYN洪水攻击,攻击者会使用大量的TCP SYN请求来填满服务器上的挂起连接队列。这会禁止其他用户建立...

weixin_35476698的博客 394

基于“加固tcp/ip协议栈中的SynAttackProtect机制”的防止SYN泛洪攻击

这里只讲“加固tcp/ip协议栈中的SynAttackProtect机制”这种方法。详细描述请见 http://blog.csdn.net/luojunjing/archive/2005/02/12/286333.aspx。 防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增

追风少年 9542

linux-Tcp IP协议栈源码阅读笔记

 一.linux内核网络栈代码的准备知识 1. linux内核ipv4网络部分分层结构: BSD socket层: 这一部分处理BSD socket相关操作,每个socket内核中以struct socket结构体现。这一部分的文件 主要有:/net/socket.c /net/protocols.c etcINET socket层:BSD socket是个可以用

勇者无敌 4万+

linux内核tcp/ip协议栈分析,TCP/IP协议栈Linux内核中的运行时序分析

一、调研要求在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。编译、部署、运行、测评、原理、源代码分析、跟踪调试等应该包括时序图二、Linux内核网络体系结构在我们了解整个linux系统的网络体系结构之前,我们需要对整个网络体系调用,初始化和交互的...

weixin_34704521的博客 1265

linux网络编程之TCP/IP基础(一):TCP/IP协议栈与数据报封装

一、ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层,如下图。 物理层(Physical Layer):物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数

Meditation 1万+

Linux TCP/IP 协议栈调优

Linux TCP/IP 协议栈调优 鸟窝大佬 原文地址 : https://colobu.com/2014/09/18/linux-tcpip-tuning/ https://colobu.com/2015/05/22/implement-C1000K-servers-by-spray-netty-undertow-and-node-js/#TCP/IP%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE 最近忙于系统性能的DEBUG和调优。 有些性能瓶颈和LinuxTCP/IP

a...Z 2733

Linux内核TCP/IP协议栈源码深度解析

链路层:负责在同一个网络内传送数据帧,与具体的物理介质相关联。网络层:主要通过IP协议实现不同网络之间的数据包寻址和路由。传输层:通过TCP协议提供端到端的数据传输服务,保证数据的完整性和顺序。应用层:直接为用户提供服务,包括HTTP、FTP、SMTP等协议。理解这些基本概念和层次结构对于深入研究网络通信至关重要。下一章,我们将深入Linux内核TCP/IP架构,探讨它是如何实现这些基本功能的。

weixin_42405592的博客 1184

深入分析linux tcp/ip协议栈

全面分析linux内核网络协议栈,非常适合对linux网络协议栈源码的学习

Linux内核初始化过程中加载TCP/IP协议栈

Linux内核初始化过程中加载TCP/IP协议栈,从start_kernel、kernel_init、do_initcalls、inet_init,找出Linux内核初始化TCP/IP的入口位置,即为inet_init函数。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1725

Linux内核TCP/IP协议栈

路由查询会根据路由表的规则找到下一跳的IP地址,然后通过ARP解析获取对应的MAC地址。这些过程通常是在网络协议栈的底层实现中完成的。2.接收ARP响应:当网络中的设备收到ARP请求时,它们会检查自己的IP地址是否与请求中的目的IP地址匹配。协议栈网络层的关联:协议栈使用网络层协议(如IP)来封装数据,并确定数据包的路由。查询路由表的过程涉及根据目的IP地址匹配路由表中的条目,并找到对应的下一跳IP地址以确定数据包的转发路径。通常,路由表中的条目按照最长前缀匹配的规则进行排序,以确保匹配最精确的路由。

Minstery0101的博客 1853

深入剖析Linux TCP/IP协议栈的实现与原理

Linux TCP/IP协议栈是一组网络通信协议,为Linux系统提供了与其他系统进行数据交换的能力。该协议栈分为四层:链路层、网络层、传输层和应用层,每一层都有其特定的功能和协议。

weixin_33759613的博客 754

Linux内核源码剖析 TCP/IP实现(上册)》樊东东 莫澜 pdf扫描版:深入理解Linux网络协议栈

Linux内核源码剖析 TCP/IP实现(上册)》樊东东 莫澜 pdf扫描版:深入理解Linux网络协议栈 【下载地址】Linux内核源码剖析TCPIP实现上册樊东东莫澜pdf扫描版 探索Linux内核的奥秘,深入理解TCP/IP协议的实现。《Linux内核源码剖析 TCP/IP实现(上册)》由樊东东和莫澜精心编写,全...

gitblog_06766的博客 863
上一篇: Libevent2.0.3(新版)VS2005整合版下载
下一篇: Francis 0.01 发布(一个可扩展的监控程序)
shallwake
博客等级 码龄18年 92粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值