下面是分析tcp_v4_init的时候了,这个函数在net/ipv4/tcp_ipv4.c里面:
__initfunc(voidtcp_v4_init(structnet_proto_family*ops))
{
interr;
tcp_inode.i_mode=S_IFSOCK;
tcp_inode.i_sock=1;
tcp_inode.i_uid=0;
tcp_inode.i_gid=0;
tcp_socket->inode=&tcp_inode;
tcp_socket->state=SS_UNCONNECTED;
tcp_socket->type=SOCK_RAW;
if((err=ops->create(tcp_socket,IPPROTO_TCP))<0)
panic("FailedtocreatetheTCPcontrolsocket.\n");
tcp_socket->sk->allocation=GFP_ATOMIC;
tcp_socket->sk->num=256;
tcp_socket->sk->ip_ttl=MAXTTL;
}
tcp_inode当然就是一个inode节点了,而tcp_socket等于tcp_inode.u.socket_i,
通过一个指针他们指向同一个内存.
tcp_socket是用来通信使用的,可以叫TCP的controlsocket或者是communication
socket,当TCP通信没有相应的socket的时候这个socket就充当了socket的角色.比如在一个关闭端口上收到SYN时发送RST,或者是在三次握手的时候发送SYN(还没有accept产生新的socket)
值得注意的是ops->create函数的调用,我们前面见过对于AF_INET来说这个回调函数是net/ipv4/af_inet.c的inet_create函数,这个函数是用来创建一个socket的时候用的,由于函数比较长,这里先略过分析,这第一次的分析只是一个大致流程的熟悉而已.
由于有socket创建和通信,所以这段代码是协议相关的,所以把这段代码从原来的tcp.c里面提取了出来
下面是tcp_init函数,它在net/ipv4/tcp.c里面,大体上来说就是创建了几个hash表和bucket.这段代码创建了下面几个全局对象:
tcp_openreq_cachep
tcp_bucket_cachep
tcp_timewait_cachep
tcp_ehash
tcp_bhash
其中ehash代表establishedhash,bhash代表bindhash,它们当然分别是所有的满足TCP_ESTABLISHED<=sk->state<TCP_CLOSE状态的SOCK.但是我不清楚bucket在这里是什么意思.anyoneknows?那几个cachep的作用也不是很清楚,特别是第二个,根本摸不着头脑.由于整个函数主要是内存分配和错误处理,这里不贴了.
再下来就是icmp_init函数了,在net/ipv4/icmp.c里面,事实上,如果把tcp_v4_init里面的IPPROTO_TCP替换成IPPROTO_ICMP,基本都是一样的.剩下的proc_net_register函数前面已经讲过了,这里就不说了.
到这里为止,Linux下面IP栈的开始的工作我们基本应该有了个了解,其中有几个关键的函数:
dev_add_pack:注册一个链路层以上的处理函数,一般是用来使用新的网络层协议的,不过如果注册时重复也是可以的,这时候系统会设置一个copy位.如果是ETH_P_ALL则会接收所有的数据包.加入的元素保存在ptype_all链表和ptype_basehash链表中间.
inet_add_protocol:注册一个建立在IP层以上的协议,例如TCP和UDP等
proc_net_register(还有类似的proc_register):
在/proc/net目录下面创建一个子目录项来使管理者能通过文件系统得到统计信息
现在迷惑的地方还有很多,一个是结构体sk_buff的每个成员的意义,一个是结构体sock的意义,不过这两个问题应该在以后看多了就知道了.下面我就打算一个个分析每个协议的处理了,包括状态转化/数据发送/接收.
--
Wishyourskybesunny,
Wishyourheartbehappy,
Wishyourbodybehealthy,
WishUneverbelazy.
:):>;);>:-):->;-);->
分享到:
相关推荐
Linux TCP/IP协议栈源码分析文档是一份对Linux操作系统中TCP/IP协议栈源代码进行深入探讨的文档。文档以Linux2.6.18内核源码为基础,逐章节逐步分析了协议栈的各个子模块,从系统初始化到网络层、传输层的实现细节,...
分为上篇和下篇,上下篇共十八章,上篇九章部侧重于TCP/IP数据收发流程,即OSI模型的IP和TCP层,下篇也是九章,并不属于TCP/IP本身,但是多少和网络有关且常用到,比如LC-trie路由、netfilter包过滤防火、还有一些...
Linux TCP/IP协议栈是Linux操作系统核心中的重要组成部分,它负责处理网络通信,使得系统能够进行数据包的发送和接收。本篇文章将深入探讨Linux TCP/IP协议栈的工作原理、主要组件以及其在源码层面的实现细节。 ...
Linux TCP/IP协议栈是操作系统内核中的核心组件,负责处理网络通信。它的主要任务是将数据从一台机器传输到另一台机器,通过互联网或其他网络。本文将深入探讨Linux TCP/IP协议栈的自主实现过程,以及如何设计网络层...
在Linux系统中,TCP/IP协议栈是操作系统内核的核心部分,负责网络通信。要追踪Linux TCP/IP代码的运行,需要深入了解TCP/IP协议的工作原理、Linux内核编程以及相关的调试工具。这里我们将主要围绕以下几个知识点进行...
TCP/IP协议栈,看起来非常不错
### 基于ARM核的嵌入式TCP/IP协议栈简化实现 #### 一、引言 随着信息技术的快速发展,嵌入式系统逐渐成为计算机领域不可或缺的一部分。在嵌入式系统中,网络应用的需求日益增长,几乎所有的现代设备都需要具备接入...
第7章讲解了网络层IP协议的实现。第8~9章介绍传输层数据收发过程,重点介绍基于套接字的TCP/UDP传输实现。第10章讨论了Linux内核套接字层的实现,以及套接字层与应用层、传输层之间的接口。第11章介绍网络应用软件...
Linux TCP/IP协议栈是Linux操作系统核心网络通信的基础,它负责处理网络数据的传输,包括接收、处理和发送网络包。本教程将深入探讨Linux内核中的TCP/IP协议栈原理及源代码分析,帮助读者理解其工作流程和实现细节。...
### TCP/IP协议栈在Linux与FreeBSD中的实现分析 #### 引言 随着互联网技术的飞速发展,作为网络通信基础的TCP/IP协议栈成为各操作系统实现网络功能的关键部分。Linux与FreeBSD作为两种广受欢迎的开源操作系统,在...
在深入探讨uC/OS-II下TCP/IP协议栈实现的知识点之前,首先需要了解uC/OS-II和LwIP各自的基本概念以及它们在嵌入式系统中的应用。 uC/OS-II是一种公开源代码的微内核实时操作系统(RTOS),主要由Jean J. Labrosse...
某位大牛写的简化的TCP/IP协议栈,版本是Linux-2.6.16,是学习Linux内核网络协议栈不可多得的资料,可以把协议栈编译成模块,加载到内核,用写好的应用测试程序进行测试。。能够进行正常的通信,由于Linux内核协议栈...
第7章讲解了网络层IP协议的实现。第8~9章介绍传输层数据收发过程,重点介绍基于套接字的TCP/UDP传输实现。第10章讨论了Linux内核套接字层的实现,以及套接字层与应用层、传输层之间的接口。第11章介绍网络应用软件...
第7章讲解了网络层IP协议的实现。第8~9章介绍传输层数据收发过程,重点介绍基于套接字的TCP/UDP传输实现。第10章讨论了Linux内核套接字层的实现,以及套接字层与应用层、传输层之间的接口。第11章介绍网络应用软件...
优化 Linux 的 TCP/IP 协议栈性能 Linux 操作系统作为开源的操作系统,广泛应用于各种领域,包括服务器、嵌入式系统、移动设备等。TCP/IP 协议栈是 Linux 操作系统中最重要的网络协议栈,负责管理网络通信。为了...
Linux TCP/IP协议栈是Linux操作系统的核心部分,负责网络通信,包括数据传输、错误纠正和流量控制等关键功能。本资料大全深入解析了Linux下TCP/IP协议栈的源码,为理解其工作原理提供了宝贵的资源。 首先,我们关注...
Linux TCP/IP协议栈是操作系统内核中的重要组成部分,它负责处理网络通信,包括TCP(传输控制协议)和IP(互联网协议)以及其他相关的网络协议。这篇笔记深入探讨了Linux系统下的TCP/IP协议栈工作原理和实现细节,...