
linux网络协议栈
分享linux网络协议栈底层内幕
badman250
专注分享IT知识技能
展开
-
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 评论 -
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 评论 -
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 评论 -
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 评论 -
netfilter和iptables的实现机制
随着计算机网络和Internet普及,计算机很久之前就开始遭受各种入侵了。因此为了阻止入侵,就产生了网络防火墙以及网络数据分析的需求。而这个netfilter就是在linux系统中来实现防火墙功能。netfilter是Linux 2.4.x引入的一个Linux内核框架,提供一整套的hook函数的管理机制。可以根据动态定义的条件来过滤和操作分组。从防火墙到网络通信数据的详细分析,到分组过滤器,都可以...原创 2018-03-31 18:11:39 · 1749 阅读 · 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 评论 -
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 评论 -
netstat工具源码剖析
netstat工具源码剖析netstat是监控TCP/IP网络的工具,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。网上关于netstat工具使用的文章多如牛毛,但是针对工具剖析的却没有,一篇难找。古人说:工欲善其事必先利其器。那么我们一起来分析吧。netstat的源码位于net-t...原创 2018-03-23 19:58:51 · 3577 阅读 · 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中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 评论 -
linux内核网络中RPS/RFS原理
linux内核网络中RPS/RFS原理 在上篇中,从整体上讲解了网络软中断的机制和优化,但是在RPS和RFS处并没有彻底讲清楚,只是描述了其整体功能和涉及初衷。这篇,进一步深度并搞明白RPS和RFS机制。1.1.1 自带irqbalance瓶颈基于简单的中断负载均衡(如系统自带的irqbalance进程)可能会弄巧成拙。因为其并不识别网络流,只识别到这是一个数据包,不能识别到数据包的元组信息。在...原创 2018-03-20 19:58:13 · 10671 阅读 · 2 评论 -
linux网络软中断softirq底层机制及并发优化
linux网络软中断softirq底层机制及并发优化在实际生产系统环境中,我们经常碰到过高的软中断导致CPU的si负载偏高,从而导致性能服务器性能出现瓶颈。而这种瓶颈出现的时候往往是在业务高峰期,此时很多优化手段不敢轻易去上,只能祈祷平稳度过。但是如果能从底层去了解网络软中断,就可以在事前将优化做充足。1.1.1 软中断软中断(softirq)表示可延迟函数的所有种类, linux上使用的软中断...原创 2018-03-20 19:55:45 · 4945 阅读 · 0 评论 -
Linux协议栈(10)——网络驱动
Linux协议栈(10)——网络驱动网络驱动区别于其他驱动(例如块驱动)的一个方面是:块驱动的运行只是响应来自内核的请求,但是网络驱动从外边异步地接收报文。Linux内核的网络子系统设计成完全独立于协议的。 相关内容可以参考:linux网络驱动初始化module_init函数跟踪1.1.1.1 注册网络设备函数alloc_netdev分配一个新的net_device实例。...原创 2018-03-18 16:48:19 · 749 阅读 · 0 评论 -
Linux协议栈(9)——应用层实现
Linux协议栈(9)——应用层实现一般Linux开发程序员来看,外部的设备都是普通文件,都可以通过读写访问来实现发送和接收数据包。但是网卡有些意外,因为每个层次使用了不同的通信协议,建立连接需要指定许多选项,不能通过打开设备来完成这些任务。后来就有了套接字的特殊结构,具体怎么来的就不说了就是一个美国政府和伯克利分校的项目中诞生的,现在已经成为了工业标准,在POSIX标准中也定义了套接字,当然li...原创 2018-03-18 16:40:29 · 1019 阅读 · 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协议栈(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协议栈(6)——初始化及链路层实现
这篇主要学习链路层在内核协议栈的实现,包括初始化、注册以及接收发送,会涉及相关函数和代码所在位置。我们知道以太网不仅可以传输IP分组,还可以传输其他协议的分组,接收系统必须能够区分不同的协议类型,以便将数据转发到正确的例程进一步处理。因为分析数据并查明所用传输协议比较耗时,所以在以太网的帧首部包含了一个标识符,ip数据包的以太类型为0x0800,存在在以太网14字节报头中的前两个字节中。(定义在i...原创 2018-03-18 16:28:09 · 1252 阅读 · 0 评论 -
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协议栈(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协议栈(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 评论 -
linux网络驱动初始化module_init函数跟踪
module_init函数对做驱动开发的同学是在太熟悉了,但是关于底层的知识可能大家有些不愿去了解,而其中知识对于网络初始化也直接相关,所以先将此分享。在驱动程序中有module_init函数,该函数定义在文件include/linux/module.h中(以前好像在include/linux/init.h中),如下。#define module_init(x) __initcall(x);...原创 2018-03-12 16:50:39 · 636 阅读 · 0 评论 -
linux系统调用实现机制详解(内核4.14.4)
linux系统调用实现机制详解(内核4.14.4)https://yq.aliyun.com/articles/522766?spm=a2c4e.11155435.0.0.25d33312xbNbM51.1 linux系统调用介绍linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。和普通库函数调用相似,只是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用...原创 2018-03-09 16:18:12 · 2681 阅读 · 1 评论