
Linux 网络
文章平均质量分 90
badman250
专注分享IT知识技能
展开
-
Linux中ip路由子系统剖析
linux有很多子系统,例如IPv4子系统,进程管理子系统,pci子系统等,这次我们要面对的是路由选择子系统,久闻其大名却不曾亲近,让我们一起来看下。Linux网络栈最重要的目标之一就是转发流量,对骨干网中的核心路由器尤其如此。IP栈层也被称为路由选择子系统负责转发数据包和维护转发数据库。先介绍两个路由选择术语:默认网关和默认路由。在路由选择表中不与其他路由选择条目匹配的数据包都将转发到默认网关。...原创 2018-05-30 11:26:04 · 1739 阅读 · 0 评论 -
tcpdump源码分析(4)——使用详细
最后我们来看下tcpdump的使用详细,不过这个就是使用指南了,其实使用tcpdump –help看到的内容更加的官方和专家,此处不过是罗列一些常用的仅当参考罢了。1.1.1.1 过滤关键字第一种:关于类型,主要包括host,net,port等。第二种:关于传输方向,主要包括src , dst ,dst or src, dst and src等。第三种:关于协议,主要包括fddi,ip,arp,...原创 2018-03-28 22:38:08 · 847 阅读 · 0 评论 -
tcpdump源码分析(3)——android系统移植(tcpdump,gdb,netstat)
在android系统中编译运行tcpdump有两个方法,一个是直接在android系统中进行源码编译;另一个是在x86系统上进行交叉编译,然后将编译生成的二进制文件复制到android系统中。本文采用第二种方法。先编译libpcap,下载地址如下,其实是和tcpdump在同一页面上的:http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz将下载得到的...原创 2018-03-28 22:37:06 · 966 阅读 · 0 评论 -
tcpdump源码分析(2)——抓包原理
本篇我们从总体看下tcpdump工具的抓包原理,通过学习了解并掌握其实现的机制,为后续进一步底层操作做准备。1.1.1.1 如何实现先来看看包传递过来的流程,如下图。包从网卡到内存,到内核态,最后给用户程序使用。我们知道tcpdump程序运行在用户态,那如何实现从内核态的抓包呢? 这个就是通过libpcap库来实现的,tcpdump调用libpcap的api函数,由libpcap进入到内核态到...原创 2018-03-28 22:35:40 · 11658 阅读 · 0 评论 -
tcpdump源码分析(1)——介绍
本系列会分析网络诊断工具tcpdump。使得大家(其实主要是针对自己本人)对tcpdump抓包原理和机制有深入认识,并掌握如何对其进行功能扩展。同时能起到细化linux网络协议栈知识点的功效。 第一篇从整体上来进行介绍,以及源码出处。 Tcpdump由美国的Lawrence Berkeley National Laboratory开发。使用了libpcap,独...原创 2018-03-28 22:30:06 · 3780 阅读 · 0 评论 -
linux网络协议初始化
当linux系统启动后,会加载image文件到内存,然后解压、安装文件系统、内存管理以及其他关键系统。当完成初始任务后,开始执行init程序。 网络的初始化是通过函数inet_init来实现的。 先来看下内核网络代码实现层和理论模型的关系,1.1.1 套接字层 地址族其实就是套接字接口的种类, 每种套接字种类有自己的通信寻址方法。 Linux 将不同的地...原创 2018-04-10 17:14:46 · 1210 阅读 · 0 评论 -
套接字实现
linux支持多种不同的符合OSI模型的通信协议。协议模块分为多组协议族和套接字类型如下图: 套接字有两个抽象的层次,一个是socket一个是sock。套接字与sock结构相关联,包含于特定协议族和类型相关的域。sock数据结构中的域指向特定协议族的数据,包括特定协议的函数集合、控制标志、特定协议信息的数据指针。 socket()系统调用仅标识每个协议族...原创 2018-04-10 17:11:27 · 619 阅读 · 0 评论 -
Linux内存管理
内核和用户空间不同,不支持简单便捷的内存分配方式,而且处理内存分配错误也绝非易事。因此在深入之前,非常有必要理解内核是如何管理内存的。1.1.1 页面内核把物理页作为内存管理的基本单元。体系结构不同,支持的页大小也不同,大多数32位体系结构支持4KB,而64位一般会支持8KB的页。系统中每一个物理页有一个 struct page,结构体定义在文件:大多数内核(kernel)的操作只使用ZONE_N...原创 2018-04-15 22:03:10 · 482 阅读 · 0 评论 -
Wireshark分析包
该工具经常用来分析tcpdump抓到的包, 在使用tcpdump抓包时候,使用参数-w可以将包写入到文件中,然后在安装有wireshark的机器上用该软件打开即可。 可以非常直观的看到各个层的数据情况,这个帧共有106个字节(8(eth)+14(eth)+20(ip)+20(tcp)+40(data)+4(fcs)=106),即848个位。其帧格式(IEEE802.3(Revised 1997))...原创 2018-04-02 22:04:13 · 887 阅读 · 0 评论 -
tcptrace交叉编译
tcptrace交叉编译tcptrace的官网是http://www.tcptrace.org/可以直接从中下载源码,安装编译是比较方便的,这里主要是进行移植工作。和tcpreplay一样也需要有libpcap包。执行configure,命令如下:#./configure --host=arm-linux --target=arm-none-linux-gnueabi CC=arm-none-li...原创 2018-04-04 23:11:31 · 921 阅读 · 1 评论 -
tcpreplay交叉移植、使用
在很多场景下需要在抓到包后如何进行回放。实现包的回放可以使用tcpreplay,该工具可以直接通过apt-get命令安装,apt-get install tcpreplay.官网地址:http://tcpreplay.synfin.net/ 最新的:https://sourceforge.net/projects/tcpreplay/files/latest/download?source=f...原创 2018-04-04 23:12:31 · 1473 阅读 · 1 评论 -
关于网卡特性TSO、UFO、GSO、LRO、GRO
我们来看下关于网卡特性的解释,不过记住GSO和GRO两个特性就好。TSO(TCP Segmentation Offload),是利用网卡对TCP数据包分片,减轻CPU负荷的一种技术,也有人叫 LSO (Large segment offload) ,TSO是针对TCP的,UFO是针对UDP的。如果硬件支持 TSO功能,同时也需要硬件支持的TCP校验计算和分散/聚集 (Scatter Gather)...原创 2018-04-06 22:55:34 · 15497 阅读 · 0 评论 -
linux网络命名空间及使用
从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。网络命名空间可以营造出多个内核网络栈实例的假象。网络命名空间的结构为net,定义在文件include/net/net_namespace.hstruct net { refcount_t pa...原创 2018-05-23 20:21:44 · 1193 阅读 · 0 评论 -
Python的pyroute2网络模块
Pyroute2是纯python的netlink库,只需要python标准库不需要其他第三方的库。最常用的是监控事件,例如监控磁盘空间事件:from pyroute2 import DQuotSocketwith DQuotSocket() as ds: for message in ds.get(): print(message)或者监控IP路由from pyroute2 i...原创 2018-05-28 14:30:11 · 2763 阅读 · 0 评论 -
云计算下虚拟网络设备基础概述
云时代下服务器主要都是虚拟机和容器,其背后的网络都离不开虚拟网络设备,了解虚拟网络设备有利于更好的理解云计算的网络结构。我们一起来看下Linux下的虚拟网络设备。对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去,怎么发送出去的,发到哪里去取决于虚拟网络设备的驱动实现。我们...原创 2018-05-28 13:07:48 · 1504 阅读 · 0 评论 -
Linux中netfilter模块编程实践
上篇我们看了netfilter的实现机制,这篇来实现下netfilter模块实操一把。为了注册一个钩子,需要填充nf_hook_ops结构体,包括优先级,钩子地点和钩子函数。然后调用nf_register_hook()函数。1. 数据结构 struct nf_hook_ops { /* User fills in from here down. */ nf_hoo...原创 2018-05-16 21:49:21 · 3246 阅读 · 0 评论 -
Linux通知链机制及实例
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,要使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。内核实现了事件通知链机制(notification chain)。通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知。通知链是一个函数列表,当给定事件发生的时候予以执行。每条通知链都有被通知者和拥有者。拥有者定义列表,被通知的子系统选择要执...原创 2018-05-22 15:52:22 · 2134 阅读 · 0 评论 -
linux中通用Netlink详解及使用剖析(附源码)
相关部分可以参考之前文章:《netlink机制》因为Netlink协议簇不能超过32个,而且添加协议簇需要在include/linux/netlink.h中添加协议簇定义。因为开发了通用netlink,类似netlink的多路复用器,因为提供了通用的渠道,所以可以在其他子系统使用,例如ACPI、任务统计信息、过热事件等。1.1.1 协议族通用link协议由family来管理,其中genl_ctrl...原创 2018-05-14 13:08:31 · 9497 阅读 · 0 评论 -
关于PPPoE协议
PPPoE英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。本质上,它是一个允许在以太网 广播域中的两个以太网接口间创建点对点隧道的协议。PPPoE是一种用于将多个客户端连接到远程场点的规范。PPPoE协议在1999年发布在RFC2516中规范。PPPoE包含两...原创 2018-05-17 12:05:07 · 1910 阅读 · 0 评论 -
Linux中频繁轮询套接字
当套接字队列变空后,网络栈此时就空闲了,终于可以静一静了。可以选择休眠等待驱动程序将其他数据加入套接字,也可以以非阻断方式返回。 为了实现以CPU使用率换取延迟尽可能低,内核在3.11起提供了频繁轮询套接字的功能。最初叫做低延时套接字轮询后根据Linus建议更名为频繁轮询套接字。 要支持频繁轮询,网络驱动程序必须提供频发轮询方法,并将其作为net_device_ops对象的...原创 2018-05-17 09:07:12 · 437 阅读 · 0 评论 -
Linux per-cpu机制
Linux操作系统,特别是针对SMP或者NUMA架构的多CPU系统的时候,描述每个CPU的私有数据的时候,Linux操作系统提供了per_cpu机制。 1.1 定义per_cpu机制就是让每个CPU都有自己的私有数据段,便于保护与访问。相关宏定义在include/linux/percpu-defs.h文件中:/* * Normal declaration and definiti...原创 2018-03-26 14:41:59 · 3202 阅读 · 0 评论 -
netfilter和iptables的实现机制
随着计算机网络和Internet普及,计算机很久之前就开始遭受各种入侵了。因此为了阻止入侵,就产生了网络防火墙以及网络数据分析的需求。而这个netfilter就是在linux系统中来实现防火墙功能。netfilter是Linux 2.4.x引入的一个Linux内核框架,提供一整套的hook函数的管理机制。可以根据动态定义的条件来过滤和操作分组。从防火墙到网络通信数据的详细分析,到分组过滤器,都可以...原创 2018-03-31 18:11:39 · 1749 阅读 · 0 评论 -
e1000网络驱动分析
e1000网络驱动分析e1000是intel千兆以太网卡的驱动源码。官方关于驱动的使用可以参考如下链接。https://www.intel.cn/content/www/cn/zh/support/articles/000006866/network-and-i-o/ethernet-products.html本文主要结合e1000驱动的源码进行分析. 版本是#define DRV_VERSION...原创 2018-03-21 18:17:17 · 7550 阅读 · 0 评论 -
Linux协议栈(6)——初始化及链路层实现
这篇主要学习链路层在内核协议栈的实现,包括初始化、注册以及接收发送,会涉及相关函数和代码所在位置。我们知道以太网不仅可以传输IP分组,还可以传输其他协议的分组,接收系统必须能够区分不同的协议类型,以便将数据转发到正确的例程进一步处理。因为分析数据并查明所用传输协议比较耗时,所以在以太网的帧首部包含了一个标识符,ip数据包的以太类型为0x0800,存在在以太网14字节报头中的前两个字节中。(定义在i...原创 2018-03-18 16:28:09 · 1252 阅读 · 0 评论 -
Linux协议栈(4)——sk_buff及代码 Linux协议栈(4)——sk_buff及代码
sk_buff结构可能是网络代码中最重要的数据结构。代表已接收或正要传输的数据报。定义在include/linux/skbuff.h头文件中。由变量堆(heap)组成。用于管理网络数据包。操作sk_buff的函数定义在net/core/skbuff.c中。当网络包被内核接收处理时,底层协议的数据被传送高层,当数据传送时,过程反过来。sk_buff在网络实现层交换数据而不用拷贝来或去数据包,可以显著...原创 2018-03-18 15:29:22 · 1540 阅读 · 1 评论 -
Linux协议栈(5)——net-device及代码
net_device结构体,存储着网络设备的所有信息,每个设备都有这种结构。所有设备的net_device结构放在一个全局变量dev_base所有全局列表中。和sk_buff一样,结构也是相当庞大的。结构的字段可以分为:n  配置(configuration)n  统计数据(Statistics)n  设备状态(Device status)n  列表管理(List mana...原创 2018-03-18 15:25:43 · 2117 阅读 · 0 评论 -
Linux协议栈(3)——接收流程及函数
Linux协议栈(3)——接收流程及函数本章来看下,数据是如何从网络中接收并最后到达应用程序的。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息。1.1.1.1 链路层包到达机器的物理网卡时候触发一个中断,并将通过DMA传送到位于 linux kernel 内存中的rx_ring。中断处理程序分配 skb_buff 数据结构,并将接收到的数据帧从网络适配器I/O端...原创 2018-03-17 23:59:19 · 1579 阅读 · 0 评论 -
Linux协议栈(2)——发送流程及函数
Linux协议栈(2)——发送流程及函数本章会一步一步的分析,在linux内核中,数据是如何从网络中接收并最后到达应用程序的。用户数据的发送流程如下图所示,不管是tfp,telnet,http都是类似的。当然我们在使用应用的时候,根本不会关注到这些加头的措施,因为要么是程序要么是内核帮助我们完成了。而我们现在所做的就是层层拨开他们去理解这协议栈的整个过程。发送过程中数据的变化如下:1.1.1.1 ...原创 2018-03-17 22:11:14 · 1688 阅读 · 0 评论 -
Linux协议栈(1)——协议介绍
Linux协议栈(1)——协议介绍本系列材料是关于Linux网络内核协议栈的,总体上将其分10个文章,主要目的是简明扼要的描述Linux协议栈在内核中的实现,从总体上掌握linux网络协议栈。因为操作系统中的网络子系统非常庞大,加上本系列材料有限,所以路由系统、邻接子系统、无线系统、桥接等不会涉及,后续有机会再系列介绍。材料先会介绍网络相关相关的TCP/IP协议族知识(本章),然后从总体上观测包的...原创 2018-03-15 22:46:39 · 8102 阅读 · 0 评论 -
网络驱动开发样例snull详解(基于3.10.0)
网络驱动开发样例snull详解(基于3.10.0) 本章素材为ldd3书中的网络驱动snull部分。由于现在内核的更新,导致其在最新的内核中无法编译该网络驱动,需要针对修改,顾为此文(内核3.10.0)。另外,网络驱动的开发对理解linux内核网络协议栈有较大帮助,文中涉及设备虽为虚拟设备,但提供了网络驱动必备的知识。1.1.1 snull编译问题1、CFLAGS变为EXTRA_CFLAGS2、...原创 2018-03-15 22:00:57 · 932 阅读 · 0 评论 -
1、HTTP监控工具httpry
httpry捕获HTTP数据包,并且将HTTP协议层的数据内容以可读形式列举出来。下载地址:https://github.com/jbittel/httpry注意需要libpcap-devel安装包使用httpry基本用法$ sudo httpry -i 保存到二进制文件中:$ sudo httpry -i eth0 -b output.dump重放:$ h原创 2017-03-31 23:06:01 · 36595 阅读 · 0 评论 -
Linux协议栈(7)——网络层实现
网络层具体就是IP协议层,处理发送和接收数据外,还需要进行转发和路由分组。在查找最佳路由并选择适当网卡的时候也会涉及对底层地址族的处理,例如MAC地址。ip头数据结构定义在:include/uapi/linux/ip.h。struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, ...原创 2018-03-18 16:32:16 · 945 阅读 · 0 评论 -
Linux协议栈(8)——传输层实现
Linux协议栈(8)——传输层实现ip_local_deliver负责分发IP分组传输的数据内容。基于IP的主要传输协议分别是UDP和TCP。处理函数分别是udp_rcv和tcp_rcv。1.1.1.1 接收1.1.1.1.1 tcp接收函数tcp_v4_rcv()定义在net/ipv4/tcp_ipv4.c中负责接收来自网络层的TCP数据包。相比UDP,TCP在内核中实现要...原创 2018-03-18 16:39:22 · 1584 阅读 · 0 评论 -
Linux协议栈(9)——应用层实现
Linux协议栈(9)——应用层实现一般Linux开发程序员来看,外部的设备都是普通文件,都可以通过读写访问来实现发送和接收数据包。但是网卡有些意外,因为每个层次使用了不同的通信协议,建立连接需要指定许多选项,不能通过打开设备来完成这些任务。后来就有了套接字的特殊结构,具体怎么来的就不说了就是一个美国政府和伯克利分校的项目中诞生的,现在已经成为了工业标准,在POSIX标准中也定义了套接字,当然li...原创 2018-03-18 16:40:29 · 1019 阅读 · 0 评论 -
linux中pci设备知识
linux中pci设备知识 Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分。PCI(Periheral Component Interconnect)有三种地址空间:PCI I/O空间、PCI内存地址空间和PCI配置空间。其中,PCI I/O空间和PCI内存地址空间由设备驱动程序使用,而PCI配置空间由Linux PCI初始化代码使用,用于配置PCI设备,比如中...原创 2018-03-21 18:15:04 · 2950 阅读 · 0 评论 -
netlink机制
netlink是一种基于网络的机制,允许在内核内部以及内核与用户层之间进行通信。最早在内核2.2引入,旨在替代笨拙的IOCTL,IOCTL不能从内核向用户空间发送异步消息,而且必须定义IOCTL号。Netlink协议定义在RFC3549中。以前是可以编译成模块,现在直接集成到内核了。与profs和sysfs相比,有一些优势如下:不需要轮询;系统调用和ioctl也能从用户层想内核传递信息,但是难以实...原创 2018-04-08 14:14:04 · 1724 阅读 · 0 评论 -
Ethtool工具源码剖析
Ethtool工具源码剖析ethool是一个实用的工具,用来给系统管理员以大量的控制网络接口的操作。可以用来控制接口参数,速度,介质类型,双工模式,DMA环设置,硬件校验和,LAN唤醒操作等。本人经常用于来观测物理链路层的链接状态,用于判断网线是否正常,不用去机房看网卡亮没亮灯了。 ethtool的版本通过如下命令进行查看:# ethtool --versionethtool...原创 2018-03-25 12:25:46 · 2310 阅读 · 0 评论 -
ifconfig工具源码分析
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。同netstat一样,ifconfig源码也位于net-tools中。源码位于net-tools工具包中,这是linux网络的基本工具包,此外还有arp,hostname,route等命令。 项目链接:http://net-tools.sourcefo...原创 2018-03-24 22:45:10 · 4042 阅读 · 0 评论 -
linux网络软中断softirq底层机制及并发优化
linux网络软中断softirq底层机制及并发优化在实际生产系统环境中,我们经常碰到过高的软中断导致CPU的si负载偏高,从而导致性能服务器性能出现瓶颈。而这种瓶颈出现的时候往往是在业务高峰期,此时很多优化手段不敢轻易去上,只能祈祷平稳度过。但是如果能从底层去了解网络软中断,就可以在事前将优化做充足。1.1.1 软中断软中断(softirq)表示可延迟函数的所有种类, linux上使用的软中断...原创 2018-03-20 19:55:45 · 4945 阅读 · 0 评论 -
netstat工具源码剖析
netstat工具源码剖析netstat是监控TCP/IP网络的工具,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。网上关于netstat工具使用的文章多如牛毛,但是针对工具剖析的却没有,一篇难找。古人说:工欲善其事必先利其器。那么我们一起来分析吧。netstat的源码位于net-t...原创 2018-03-23 19:58:51 · 3577 阅读 · 0 评论