深入理解linux网络_深入理解linux网络内幕 - CSDN
  • 深入理解Linux网络技术内幕 里面有第一章至第五章,加上第七章,共六章中文的;第六章的目前还在翻译中
  • 深入理解linux网络技术内核 中文版 高清,学习linux内核网络必修课程
  • 路由缓存用于减少路由表查找的时间。路由缓存的核心是与协议无关的目的缓存(Protocol Independent Destination Cache DST)。尽管采用策略路由可有效地创建多张路由表,但所有这些路由表都共享一个路由缓存。...

    路由缓存用于减少路由表查找的时间。路由缓存的核心是与协议无关的目的缓存(Protocol Independent Destination Cache DST)。尽管采用策略路由可有效地创建多张路由表,但所有这些路由表都共享一个路由缓存。
    这里写图片描述
    这里写图片描述
    rttable结构的第一个字段是一个联合,这使得rtable和dst_entry结构很容易共享一些数据,例如,指向下一个冲突的hash表项的指针。虽然指针的名称不同,但他们所指向的内存位置是相同的。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    上图中,函数名以_slow结尾是为了强调缓存查找和路由表查找在速度上的差异,这两种查找途径也被称为快速途径(fast)和慢速途径(slow)。
    Raw IP 和 UDP:当通过一个套接字发送数据时,用户可以设置MSG_DONTROUTE标识。当应用程序从一个已知接口向直连的目的地(不需要网关)发送封包时,可以使用该标识。这样内核就不需要确定出口设备。在路由协议和诊断性应用程序中使用这种发送方式。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    IPsec创建一个dst_entry实例链表,只有最后一个实例中的input和output方法被实际应用于路由策略,而前面实例中的input和output方法被应用于所要求的变换。
    缓存路由项可以被插入到两个地方:
    1.路由缓存
    2.dst_garbage_list链表。该链表将所有应该被删除的,但由于引用计数非0而还没有被删除的表项链接在一起。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    如上图所示:
    1.hash表的大小为rt_hash_mask+1,或2^rt_hash_log.当缓存内的表项数目超过gc_thresh时,就调用rt_garbage_collect,gc_thresh的默认值为hash表的大小。
    2.缓存内能够容纳的表项最大数目是ip_rt_max_size,其默认值大小是hash表的大小乘以16.
    3.当缓存内的表项数目超过ip_rt_gc_elasticity*(2^rt_hash_log)时,其默认值为hash表的大小的8倍,就认为缓存容量太大,存在风险,垃圾回收开始设置goal更为严格。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    指数回归算法:
    如果目的地持续地忽略ICMP REDIRECT消息,内核就持续发送ICMP REDIRECT消息给它,直到发送数目达到ip_rt_redirect_number。每发送一个消息就将时间间隔增加一倍。ip_rt_redirect_number个这样的消息被发送出去后,内核就停止发送,等待ip_rt_redirect_silence秒。若ip_rt_redirect_silence秒后,收到了能够触发内核生产ICMP重定向消息的输入封包,内核就重新开始发送ICMP REDIRECT消息,否则,就一直停止。

    展开全文
  • 简单地讲,路由器就是一台网络设备,它配备多个网络接口卡,能利用它的网络知识正确转发入口流量。 决定一个入口封包应该送给本地主机还是转发所需要的信息,以及在转发时正确转发封包所需要的信息,都存储在一个被...

    这里写图片描述
    简单地讲,路由器就是一台网络设备,它配备多个网络接口卡,能利用它的网络知识正确转发入口流量。
    决定一个入口封包应该送给本地主机还是转发所需要的信息,以及在转发时正确转发封包所需要的信息,都存储在一个被称为转发信息库的数据库中(FIB),它通常被简称为路由表(路由表无非就是许多路由的一个集合)。
    这里写图片描述
    大多数主机通常只有一个网络接口,因而不能作为路由器。主机被配置为使用一个默认网关来访问外部地址。不考虑网络内主机扮演的角色,每个主机维护一张路由表,当需要处理网络流量的发送和接收时查询该路由表。
    一个路由就是一组参数,存储了往一个给定目的地址转发流量需要的信息,例如:
    1.目的网络。路由表被用于往目的地址转发流量。图30-2中,给出了一张包含两条路由的路由表:一条是到本地子网10.0.0.0/24,另一条是到其他任何地方。
    2.出口设备。与路由项匹配的封包应当从该设备发出。例如送往10.0.0.100的封包通过eth0送出。
    3.下一条网关。当目的网络和本地主机不直连时,需要通过其他的路由器来转发。例如,图30-2中的主机需要通过路由器RT才能到达10.0.0.0/24子网外的其他主机。下一跳网关是指该路由器的地址。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    上图中:
    a.是最常见情形,不同接口配置为不同的子网,每个子网连接的局域网都不同。
    b.路由器RT在同一个局域网中有两个接口,但是这两个接口配置为不同的子网。
    c.路由器RT在子网10.0.2.0/24和10.0.3.0/24上各有一个地址,但是这两个地址是配置在同一个NIC上。
    这里写图片描述
    子网127.0.0.0/8中的地址比较特殊,这些地址的scope就是配置他们的主机。无论这些地址是作为封包的源地址还是目的地址,该封包都不能离开主机。
    这里写图片描述
    IP规范中已经将一些特定范围内的地址规定为不可路由地址,这意味着这些地址只能保留在一个局域网内使用。不可路由地址不能被用于提供任何因特网服务,因为它们不是全球唯一的,且因特网路由器不能将流量传给它们。
    这里写图片描述
    上图中,如果10.0.1.0/24子网内的任何一个主机要与子网外的主机通信,那么路由器必须使用某种网络地址转换(NAT)来隐藏本地不可路由的子网。
    这里写图片描述
    定向广播:定向广播的目的地址是远端子网的广播地址。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    注:图a中的源地址写错了,应该是10.0.0.100.
    这里写图片描述
    这里写图片描述

    展开全文
  • 对于一个给定的网络功能,你必须考虑如下几个方面: 1.如果是你,你会如何设计相关的数据结构和锁机制 2.是否需要在用户空间提供一个配置工具,如果需要则配置工具通过什么方式和内核交互,系统调用,ioctl命令...

    对于一个给定的网络功能,你必须考虑如下几个方面:

    1.如果是你,你会如何设计相关的数据结构和锁机制

    2.是否需要在用户空间提供一个配置工具,如果需要则配置工具通过什么方式和内核交互,系统调用,ioctl命令还是其他的方式

    3.是否需要一个新的通知链或则是否需要注册到一个已经存在的链。linux中用链表管理一批数据,有时需要将自己的数据结构注册到链表上。

    4.他们和防火墙的关系如何

    5.是否需要cache,垃圾回收机制,统计数据等等


    在学习之前准备的工具:

    1.编辑器和源码浏览器选择为vim ctags

    2.阅读英文文档用的翻译为openyoudao

    3.可能需要绘制流程图,使用yEd


    关键的数据结构

    1.sk_buff

    网络是分层设计的,接收的数据包由低层一级一级的处理,然后送到上一层,发送的数据包由上层处理后发送的下一层,这要求必须有一种结构来表示这样的数据包

    1.其可以管理变长的内存

    2.可以很方面的在其头部和尾部添加信息

    3.尽可能的减少拷贝


    在2.6内核的网络中,sk_buff结构担负起了这个责任.

    其定义如下

    struct sk_buff {
    	/* These two members must be first. */
    	struct sk_buff		*next;
    	struct sk_buff		*prev;
    
    	struct sk_buff_head	*list;
    	struct sock		*sk;
    	struct timeval		stamp;
    	struct net_device	*dev;
    	struct net_device	*input_dev;
    	struct net_device	*real_dev;
    
    	union {
    		struct tcphdr	*th;
    		struct udphdr	*uh;
    		struct icmphdr	*icmph;
    		struct igmphdr	*igmph;
    		struct iphdr	*ipiph;
    		struct ipv6hdr	*ipv6h;
    		unsigned char	*raw;
    	} h;
    
    	union {
    		struct iphdr	*iph;
    		struct ipv6hdr	*ipv6h;
    		struct arphdr	*arph;
    		unsigned char	*raw;
    	} nh;
    
    	union {
    	  	unsigned char 	*raw;
    	} mac;
    
    	struct  dst_entry	*dst;
    	struct	sec_path	*sp;
    
    	/*
    	 * This is the control buffer. It is free to use for every
    	 * layer. Please put your private variables there. If you
    	 * want to keep them across layers you have to do a skb_clone()
    	 * first. This is owned by whoever has the skb queued ATM.
    	 */
    	char			cb[40];
    
    	unsigned int		len,
    				data_len,
    				mac_len,
    				csum;
    	unsigned char		local_df,
    				cloned,
    				pkt_type,
    				ip_summed;
    	__u32			priority;
    	unsigned short		protocol,
    				security;
    
    	void			(*destructor)(struct sk_buff *skb);
    #ifdef CONFIG_NETFILTER
            unsigned long		nfmark;
    	__u32			nfcache;
    	__u32			nfctinfo;
    	struct nf_conntrack	*nfct;
    #ifdef CONFIG_NETFILTER_DEBUG
            unsigned int		nf_debug;
    #endif
    #ifdef CONFIG_BRIDGE_NETFILTER
    	struct nf_bridge_info	*nf_bridge;
    #endif
    #endif /* CONFIG_NETFILTER */
    #if defined(CONFIG_HIPPI)
    	union {
    		__u32		ifield;
    	} private;
    #endif
    #ifdef CONFIG_NET_SCHED
           __u32			tc_index;        /* traffic control index */
    #ifdef CONFIG_NET_CLS_ACT
    	__u32           tc_verd;               /* traffic control verdict */
    	__u32           tc_classid;            /* traffic control classid */
    #endif
    
    #endif
    
    
    	/* These elements must be at the end, see alloc_skb() for details.  */
    	unsigned int		truesize;
    	atomic_t		users;
    	unsigned char		*head,
    				*data,
    				*tail,
    				*end;
    };
    




    展开全文
  • 有时候,发送方生成一个ARPOP_REQUEST是为了通知接收方一些信息,而不是请求信息。这种封包就称为无端ARP,它通常用下面列出的情况中: 1.L2地址发生变化。 2.重复地址探测。 3.虚拟IP(用于LVM服务)。...

    这里写图片描述
    这里写图片描述
    这里写图片描述
    有时候,发送方生成一个ARPOP_REQUEST是为了通知接收方一些信息,而不是请求信息。这种封包就称为无端ARP,它通常用下面列出的情况中:
    1.L2地址发生变化。
    2.重复地址探测。
    3.虚拟IP(用于LVM服务)。
    主机可以使用无端ARP来检测重复地址的存在,如果你发出一个目的地址是你自己地址的ARP请求,那么只有当存在一台与你有相同IP配置的主机时,才会收到应答。如果不存在重复地址,就收不到任何应答。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    如上图所示,发出请求的主机会收到两个应答。一个来自正确的L2地址的NIC(eth0),而另一个是属于另一个NIC地址(eth1)。至于哪个地址会进入该主机的ARP缓存是不确定的。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    如上图所示,当一台主机有多个NIC连接到同一个LAN,且配置在同一个IP子网上时,这个选项可以控制一个接口是否对入口ARPOP_REQUEST做出应答。上述情况下,每个NIC会收到一个ARPOP_REQUEST封包的拷贝,通过这个选项你可以只选择一个接口来应答。
    这里写图片描述
    这里写图片描述
    假设主机A现在需要向主机C传输一些东西,但是没有其L2地址。主机A就会发出一个ARPOP_REQUEST广播包,主机B的eth0和eth1接口,以及主机C都会收到该包。主机B不应该对这个ARPOP_REQUEST作出应答,因为主机C自己可以应答。
    正如你所看到的,需要一种方来告诉ARP代理服务器,它的两个接口都在同一个广播域内,因此,两个ARPOP_REQUEST包都不应该被处理。通过给连在同一个LAN上的接口指定一个称为medium ID的ID包就可以解决这个问题(只有这个设备的Medium ID和入口设备的Medium ID不同时,主机才会应答该请求)。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    回环接口是一种特殊的情况。其发送和接收的封包用PACKET_LOOPBACK类型识别。因为这个接口是虚拟的,并没有实际的硬件地址,因此不需要使用ARP协议。
    这里写图片描述
    这里写图片描述
    请求方达到了从ARPOP_REPLY封包中学到目的地址的主要目标,这个过程称为主动学习。而收到ARPOP_REQUEST封包的目的主机从请求封包中也知道了发送方的地址,这个过程称为被动学习。
    DHCP服务器或客户端可以随意对DHCP分配一个IP地址发出一个ARPOP_REQUEST,用于双向监测是否相同的地址被错误地用在另一个主机上。这种特殊的ARPOP_REQUEST送出时,其源IP地址是0.0.0.0,以便它不会给予子网内的其它主机引来任何麻烦。
    这里写图片描述
    锁定期:它只是一种简单的超时机制,负责处理对同一个ARPOP_REQUEST封包,主机可能收到多个ARPOP_REPLY封包的偶然事件。如果某种配置错误或在同一个LAN中有多个ARP代理服务器,就可能发生这种情况。对此,arp_process函数只会对第一个应答做出反应,而拒绝后面的应答。
    目的NAT也称为路由NAT(Route NAT),允许主机定义伪地址(NAT):主机检测到目的地是这些伪地址的入口封包后,将其转发到另一些地址。Linux支持所有的NAT。SNAT,DNAT,伪装等都是用Netfilter实现的。
    这里写图片描述
    路由器RT配置了一个伪NAT地址10.0.0.5.无论RT什么时候收到目的地址是10.0.0.5的流量,它都将封包的目的地址改成10.0.1.10,并转发到该地址对应的主机。当然,这个配置要保证发向流量也可以处理。
    这里写图片描述
    这里写图片描述
    路由器和ARP代理服务器完成的任务是不同的:路由器将子网分为多个LAN,而ARP代理服务器将不同的LAN合并为单一子网。
    包含一台ARP代理服务器的网络拓扑结构要记录大量的solicitation请求和应答。当要代理的主机数量很多时,solicitations占用的网络带宽会相当大。
    这里写图片描述
    a.从LAN1到LAN1.(例如,从主机D到E):由于主机D和主机(-。-;)在同一个子网内(10.0.0.0/24),它就可以发出一个对IP地址10.0.0.3的solicitation请求。在LAN1中的所有主机都会收到这个请求,但只有主机E会向主机D应答,表明自己的L2地址。注意,尽管在eth0上已启动了代理功能,但是RT不会应答。原因是RT在eth0(LAN1)上收到solicitation封包,但它知道10.0.0.3位于发送方的子网内,因此不需要拦截该请求:主机E所处的网络,正是solicitation请求生成的网络,因此主机E自己可以应答。
    b.从LAN1到LAN1中的非法IP地址。(例如,从主机D到10.0.0.128):从A2的角度看,10.0.0.128是一个合法的主机地址;从RT的角度看,它不是(是一个网络地址)。没有人会做出应答这个请求,不管RT是否是代理。
    c.从LAN1到LAN2(例如主机D到主机A):由于10.0.0.130所属的主机位于另一个LAN中,它不会收到这个请求并应答。但是,如果RT在eth0上配置了代理功能,它会用eth0接口的地址应答。这表示当主机D要往主机A发送数据时,它实际上是发到了RT,然后RT再转发到主机A。如果主机A请求主机D的地址,就是相反的过程。
    d.从LAN1到LAN3(例如从主机D主机F):由于主机F和主机D不在同一个子网内,且在主机D中没有定义访问LAN3的路由,于是其内核的IP层会用一个消息作为应答,该消息表明没有达到主机F的可用路由。主机D甚至不会产生solicitation请求。
    WOL(wake on lan)通过给一个NIC发送一个特殊类型的帧,就能唤醒一个处于待机模式的系统。在各种帧的类型中,有唤醒功能的只有ARP帧。该功能是在硬件级实现的,因为当系统还在待机模式时,CPU上没有运行能处理输入封包的设备驱动程序。带有WOL功能的NIC需要有其自己的电源输入,以便能够扫描到这些特殊的帧。
    这里写图片描述
    ARPD:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • 函数指针在网络代码中 广为使用,举例说明: a.当入口数据封包或出口数据封包由路由器子系统处理时,会对 缓冲区数据结构中的两个函数做初始化。 b.当数据封包已准备好在网络硬件上传输时,就会交给net_device数据...
  • 深入理解LINUX网络技术内幕,高清扫描,带目录,全套。从上到下理解网络的全体流程
  • 如果你曾经惊叹于Linux能够实现如此复杂的工作,或者你只是想通过现实中的例子学习现代网络,《深入理解Linux网络内幕》将会给你指导。同其他O'Reilly的流行书籍一样,《深入理解Linux网络内幕》清楚地阐述了网络的...
  • 深入理解LINUX网络技术内幕.pdf;深入理解LINUX网络技术内幕.pdf
  • 深入理解LINUX网络技术内幕,高清扫描,带目录,全套。从上到下理解网络的全体流程,高清版本的Linux网络方面的好书,豆瓣评分很高。
  • 深入理解linux网络技术内幕(中文版) 带目录标签 !!!
  • 深入理解linux网络技术内幕扫描版本,清晰程度可以凑乎着看。
  • 高清版本的Linux网络方面的好书,豆瓣评分很高,其他资源都分上下部分,这个是高压缩比的完整版本,且高清。
  • 请注意: ... ... 一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。...更多linux、ARM和C语言资源请参考: http://blog.csdn.net/arkofnoach/archive/2010/10/23/5960560.aspx
  • 深入理解Linux网络技术内幕》(英文版).pdf 英文名:understanding Linux network internals If you've ever wondered how Linux carries out the complicated tasks assigned to it by the IP protocols--or if ...
  • 这些分层通常称为网络协议栈,因为通信会往下传播通过各个分层,直到实际上经过线路或无线频道传输,然后再返回来。报头也会以LIFO的方式添加和删除掉。 每一层都有很多种协议可以用。在最底层的接口交换数据,而...
  • 我们可以大致看出数据在IPv4协议中的流向, 接收报文 ...判断是该转发还是交付本地上层协议。 如果是本地报文,则传给ip_local_deliver处理,如果是转发,那就交付ip_forward进行转发处理。 发送报文 ...
  • 2.对一些sk_buff参数做初始化,以便在稍后由上面的网络层使用。 3.更新其他一些该设备私用的参数。 4.为NET_RX_SOFTIRQ软IRQ调度以准备执行,借此通知内核新帧的事。 Netpoll:是一个通用的架构,可通过轮询网络...
1 2 3 4 5 ... 20
收藏数 90,089
精华内容 36,035
关键字:

深入理解linux网络