Linux源码-TCP/IP协议栈
文章平均质量分 83
1-programmer
这个作者很懒,什么都没留下…
展开
-
ubuntu下子网组建实践及NAT实现子网穿透
iptables是linux下功能强大的防火墙配置工具。利用它可以实现对IP包的过滤、重定向、修改等操作。本着学以致用的目的,以自己的笔记本为中心搭建了一个小的局域网来学习具体的操作,加深自己对iptables工具和linux路由系统的理解。 一、简单介绍iptables linux下通过 man iptables就可以看到iptalbes的使用手册。简单列一条以说明其命令结构。 iptab原创 2016-11-27 15:14:21 · 1296 阅读 · 0 评论 -
TCP/IP协议栈初始化(十一)完结篇-完成IP层与网卡的连接
上回ICMP的插曲说完了,把一个ICMP socket的创建流程说完了。对于数据结构关系图没有加入什么新元素。执行的流程是从inet_family_ops到inet_create,raw_prot,这样的执行顺序。此时完成的只是ICMP协议的处理socket。继续看源码,icmp_init函数返回后,后面还有内容。当然要有,IP层和设备还没有关联呢。走继续看。 其实仔细一看,我们的协议栈的初始化也原创 2016-12-16 23:10:21 · 1003 阅读 · 2 评论 -
TCP/IP协议栈初始化 总结
初始化总结 一、初始化的纵向流程,基本上是按控制层协议、IP协议从上向下展开的。 那么能否颠倒一下,先把IP协议初始化了呢?目前来看是可以的。内核中这样安排应该出于对协议栈层次关系的遵从。 二、初始化的横向节点处,是先申请资源,初始化资源,初始化相关数据结构实例成员,包括成员变量和成员函数。 三、初始化过程中,可以看到Linux中,存在着严格的参数检查。所以函数的开始一般是入口条件筛选,如果原创 2016-12-17 21:00:43 · 1004 阅读 · 0 评论 -
TCP/IP工作流的开始 socket创建3
tcp_v4_init_sock函数的中间部分继续上次没有说完的tcp_v4_init_sock函数。1854 tcp_prequeue_init(tp);继续完成对tcp_sock tp的初始化。源码中的注释告诉我们,这个函数是初始化了向用户发送数据的队列,具体参数为tp->ucopy.prequeue。源码位于include/net/tcp.h中。862 static inline void t原创 2016-12-24 23:16:40 · 479 阅读 · 0 评论 -
TCP/IP工作流的开始 socket创建4
tcp_v4_init_sock函数的剩下部分继续回到tcp_v4_init_sock。1873 tp->reordering = sysctl_tcp_reordering;又是struct tcp_sock的一个成员变量reordering,意思为重新排序。这里只是设置一个初值,其具体含义,现在还不知道。从数值来源变量名称中,可以看到这个是可以通过用户来控制的一个选项。1874 icsk原创 2016-12-25 22:01:31 · 1075 阅读 · 0 评论 -
TCP/IP工作流的开始 socket创建 1
1、引子 在C语言里,想要使用TCP/IP协议来实现一个客户端,必须要遵循以下步骤: 1)创建一个socket。 int socket(int family, int type, int protocol) 函数需要三个参数,分别是协议族的编号,socket的类型,和具体的协议类型。如果初始化时还有印象的话,我们的TCP/IP协议族属于PF_INET,而TCP socket则属于STREAM原创 2016-12-19 23:17:02 · 965 阅读 · 0 评论 -
TCP/IP工作流的开始 socket创建2
继续inet_create函数的流程。326 sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot); 327 if (sk == NULL) 328 goto out; 330 err = 0; 331 sk->sk_no_check = answer_no_check; 332 if (IN原创 2016-12-20 23:16:29 · 503 阅读 · 0 评论 -
TCP/IP工作流5 connect开始
TCP/IP工作流5 connect引子沿上一篇的思路,当socket创建完成了。就要调用connect函数来连接到远程的服务器了。 int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen) 这个函数原型中,sockfd是就用socket调用得到一个socket的文件ID。addr参数是,远程要连接到的服务器原创 2017-01-13 21:32:20 · 407 阅读 · 0 评论 -
轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)八
10 一个有点不太完美的表驱动实现<–作者版本见本系列第一篇 尽管下面的这句代码,精简,优雅 r=0; while (len–) r = ((r << 8) | *p++) ^ t[(r >> 24) & 0xFF]; 这些追求最优化的骇客们还是不会轻易放过它。问题是,你可以看到,这个循环是作用于经过附加的信息,为了使用这段代码,你不得不附加w/8个0到信息的尾部,这应该在把p指向信息之前完成翻译 2017-01-14 20:22:39 · 767 阅读 · 0 评论 -
TCP/IP工作流5 connect 3
继续TCP connect如下,来到252行。252 err = inet_hash_connect(&tcp_death_row, sk); 253 if (err) 254 goto failure; 256 err = ip_route_newports(&rt, IPPROTO_TCP, 257 inet->sport, ine原创 2017-02-06 23:26:26 · 433 阅读 · 0 评论 -
TCP/IP协议栈初始化(十) ICMP带来的一段插曲 2
继续inet_create函数的下半部分。321 rcu_read_unlock(); 323 BUG_TRAP(answer_prot->slab != NULL); 325 err = -ENOBUFS; 326 sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot); 327 if (sk == NULL原创 2016-12-15 22:43:42 · 441 阅读 · 2 评论 -
TCP/IP协议栈初始化(九) ICMP带来的一段插曲
TCP的初始化告一段落。沿着inet_init函数继续向下看。 1422行 注册了个轻量级的UDP协议,有什么用处暂时还不知道。根据之前TCP等协议的注册情况,只需要记着udplite_prot是它资源管理者,udplite_protocol是面向IP的接口,udplite4_protows是面向socket的接口,就可以了。 1428 icmp_init(&inet_family_ops);原创 2016-12-14 22:30:29 · 484 阅读 · 0 评论 -
TCP/IP协议栈初始化(四) 向下走,找到IP向上进阶的入口
目前OS已经知道inet协议族的存在了,但inet自己知道IP层还没有准备好,它还不能为OS服务。 继续看inet_init函数。下面的代码就有趣了。 1386 if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) 1387 printk(KERN_CRIT "inet_init Cannot add ICMP原创 2016-12-09 21:05:13 · 472 阅读 · 0 评论 -
TCP/IP协议栈初始化(五) 再向下,找到了IP协议的好队友ARP
TCP层和socket/IP层之间的关系捋清了。但此时协议栈的初始化还远没有完成。此时IP协议还没有提到,TCP协议虽然注册了,但还没有进行初始化。还要继续向下看。 IP分组数据在网络之间传递时依靠的是千千万万的路由器,进行包转发。可是一旦到了网络的边沿,局域网中,IP协议就不能完美工作了。它需要队友辅助。也就是下面说的ARP协议了。 ARP,地址解析协议,是TCP/IP协议族中原创 2016-12-10 17:07:26 · 434 阅读 · 1 评论 -
TCP/IP协议栈初始化(六) 终于见到IP
这已经是第六篇了。但协议栈的初始化还没有说完。不得不承认协议栈还是很复杂的。越是牛B的东西,就越复杂。就像一门手艺一样,当你可以做到别人都不能达到的复杂度的时候,你就是大师了。还有人说,想要精通一样技术,你必须重复它10万次以上。子曰:“温故而知新”,代码看多了,就能明白其中的奥秘了。当然一些实践还是必不可少的。这个系列一开始,我就说,协议栈很牛,所以它复杂也在情理之中。学习到现在,对协议栈,感觉原创 2016-12-11 15:04:52 · 1438 阅读 · 1 评论 -
linux源码-TCP/IP协议栈学习预备(1) 数据结构之各socket之间的关系
在阅读协议栈的源码时,经常可以看到sock在各struct sock, struct socket及struct tcp_sock之间相互转换。刚开始时经常被转迷糊。特意总结一下,分享给大家。 通过代码不难得到如下数据关系。 其中,关键字struct我删掉了。各个sock的意义如下: struct socket:通用的BSD socketstruct sock: 网络层中soc原创 2016-12-01 23:10:20 · 550 阅读 · 0 评论 -
TCP/IP协议栈初始化(三) OS大人inet socket已经准备完毕
看完了tcp_prot的内容,回到inet_init函数中。 1362 BUILD_BUG_ON()是内核的一个宏。如果条件为真强制生成一个编译错误,编译会终止。这里判断的内容是structinet_skb_parm和dummy_skb->cb大小。这里有一个细节,sizeof。C语言里,指针和数组的首地址有什么区别呢?sizeof可以告诉我们,如果传递给sizeof的是一个指针,那么sizeo原创 2016-12-07 21:25:32 · 580 阅读 · 0 评论 -
TCP/IP协议栈初始化(七)感觉快上康庄大道了
上回说到IP协议初始化完成了。为IP自己工作创造了条件,那么按道理来说,此时的协议栈可以走上大道奔小康了。但是一看源码,发现后面还有tcp_init,马上知道内核中故事从来都不容易讲。如果说之前的准备工作是协议栈的地基的话,下面要开始构建的则是整个大楼的骨架了。地基里的东西,人是看不到的,它很重要,但真正能吸引人眼睛的是地基以的建筑,也是整个协议栈的核心了。 细心的人不难发现,之前的初始化从来没原创 2016-12-12 22:52:21 · 561 阅读 · 0 评论 -
TCP/IP协议栈初始化(一) 长江之源
从开始的开始说起 TCP/IP协议栈的工作离不开数据结构的支撑。如果说TCP/IP协议栈构成了这庞大的网络世界,那么底层的数据结构就是这个世界的基石。那么这些基石都是如何从一个字节一个字节组织起来的呢?要从它们被创造的时候开始说起。一想到这么牛的协议居然是从一个全0的内存里构建起来的,想去源头看看的冲动,就像是站到了长江的源头,俯瞰整个长江流域的感觉。一切开始的开始,自然就是系统启动的时刻了。走原创 2016-12-05 23:39:35 · 896 阅读 · 1 评论 -
TCP/IP协议栈初始化(二) tcp协议的内核表达
tcp_prot的赋值内容如下,定义在tcp_ipv4.c文件中。 struct proto tcp_prot = { 2423 .name = "TCP", 2424 .owner = THIS_MODULE, 2425 .close = tcp_close, 2426 .connect = tcp_v4_connect, 2427 .disconnect = tcp_disconn原创 2016-12-06 23:15:44 · 611 阅读 · 0 评论 -
TCP/IP协议栈初始化(八) TCP马上准备进入状态
TCP马上要准备好了。 上回tcp_init函数并没有说完。因为这个函数做了许多重要的事情。这次接着说。 2474 tcp_hashinfo.bhash_size = 1 << tcp_hashinfo.bhash_size; 2475 for (i = 0; i < tcp_hashinfo.bhash_size; i++) { 2476 spin_lock_init(&tcp_ha原创 2016-12-13 22:27:14 · 599 阅读 · 0 评论 -
TCP/IP工作流5 connect 2
tcp_v4_connecttcp_v4_connect函数定义在tcp_ipv4.c中。这个函数到底会做些什么事情呢?从TCP/IP协议中,TCP连接建立的过程中,我们知道:TCP连接需要三次握手。 1. 客户端发送SYN包 2. 服务器端收SYN包,发SYN+ACK包 3. 客户端收SYN+ACK包,发ACK 为什么要理解为三次握手(handshake),而不叫三次碰面,文青一点的解释是原创 2017-01-22 22:43:22 · 334 阅读 · 0 评论