Linux Kernel TCP/IP Stack|Linux网络硬核系列
大家好,我是Alex,今天给大家介绍Linux网络技术中最核心的部分--TCP/IP协议栈 。
我们先看一下抽象的网络协议栈模型
TCP/IP四层(参考)模型
再按分层思想看Linux内核协议栈实现框架
自顶向下
Socket/ L4 TCP layer
1. socket layer
socket对象层次结构
socket框架
socket系统调用(socket,bind,listen,accept,send,recv等)
BSD socket API
协议栈sock抽象适配层
tcp/udp/icmp/raw/packet/netlink/... socket管理
socket选项
2. tcp/udp layer
TCP报文收发
TCP Socket连接管理
TCP协议状态机,定时器处理
TCP滑动窗口,拥塞控制框架
L3 IP layer
1. IP handle
报文分片和重组
IP协议字段处理,IP选项,Qos,TTL,校验等处理
报文接收(解封装)和发送(IP协议封装,提供给上层接口)
组播,ICMP协议处理等
2. netlfilter框架
5个HOOK点:
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外发送
POSTROUTIONG:发送到网卡接口之前。
每个HOOK点都会执行一些函数,大致分为下面几个表:
NAT表: 用于实现nat功能,端口映射,地址映射等
mangle表: 用来修改报文,例如更改IP标头的TOS / DSCP / ECN位
filter表:用来过滤报文
raw表:用来提前标记报文不走一些流程(比如不需要建会话)
conntrack表:连接跟踪表,跟踪连接会话,用来实现状态防火墙,NAT功能的基础,可扩展更多功能。
核心处理流程
主要功能
无状态数据包过滤(IPv4和IPv6)
有状态的数据包过滤(IPv4和IPv6)
各种网络地址和端口转换,例如NAT / NAPT(IPv4和IPv6)
灵活可扩展的基础架构
第三方扩展的API
3. 路由系统
协议栈处理位置
路由子系统架构
FIB(The Forwarding Information Base )
策略路由 Policies
路由匹配HASH,LC-tries等
主要功能
三层路由转发
4. 邻居系统
ARP协议(IPV4),NDP协议(IPV6)
邻居表新建,更新,老化机制,状态转化等
API接口
主要功能
获取mac地址
L2 link layer(driver)
1. Link layer
Bridge
FDB(mac forwarding database)管理
port,bridge对象管理和报文接收,转发
STP,vlan协议相关处理
主要功能
实现二层mac转发
链路协议
IEEE 802协议族(STP,VLAN,以太网,无线wifi,令牌环等)
Packt Type
Protocol handler
Packet_type list
主要功能
链路层报文协议分发
Traffic control
qdisc :通过队列将数据包缓存起来,用来控制网络收发的速度
class :用来表示控制策略
filter :用来将数据包划分到具体的控制策略
主要功能
提供的流量限速、整形和策略控制机制(Qos)
2. hardware driver layer
网络设备管理
RPS,RFS,XPS,GRO,GSO,TSO等优化特性
网卡软中断收发,NAPI,DMA
支持各种网卡驱动实现
协议栈文件系统
Proc FileSystem
/proc/net
/proc/sys/net
ipv4
core
Sys FileSystem
/sys/class/net/ethx
主要功能
提供协议栈相关配置查询和设置
最后
整体架构图
如果想了解更多细节,请阅读Linux内核源码或者参考下面两本经典著作:
《The Linux Networking Architecture》
《Understanding Linux Network Internals》
公众号回复"协议栈"可获取经典PDF
我们下次见!
看完记得一键三连在看,转发,点赞
是对文章最大的赞赏,感谢
推荐阅读
计算机网络硬核指南|网络设计核心思想
网络排障全景指南手册v1.0精简版pdf
一个奇葩的网络问题
Linux Kernel TCP/IP Stack|Linux网络硬核系列相关推荐
- Linux Kernel TCP/IP Stack|Linux网络硬核系列 | 图
https://mp.weixin.qq.com/s/63HBz8DGPjLeNd43kaOunw
- Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作
目录 文章目录 目录 Linux bridge 的基本操作 创建 Bridge 将 veth pair 连上 Bridge 为 Bridge 配置 IP 地址 将物理网卡接口设备挂靠 Bridge L ...
- Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架
目录 文章目录 目录 netfilter 框架 netfilter 的组成模块 netfilter 的 Hook 机制实现 netfilter 的工作原理 规则(Rules) 链(Chains) 表( ...
- Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型
目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...
- Linux Kernel TCP/IP Stack — 协议栈收包处理流程
目录 文章目录 目录 L2 NIC Controller 收包处理流程 L3-4 收包处理流程 Socket Layer 收包处理流程 参考文档 L2 NIC Controller 收包处理流程 硬件 ...
- Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡
目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...
- Linux Kernel TCP/IP Stack — Overview
目录 文章目录 目录 协议栈全景图 协议栈处理流程概览 协议栈收发包概览 协议栈的逻辑架构 协议栈的分层架构 协议栈的文件系统 协议栈的数据结构 协议栈全景图 协议栈处理流程概览 在 Linux Ke ...
- Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — iptables NAPT 网络地址/端口转换
目录 文章目录 目录 网络地址转换(NAT) SNAT DNAT 端口映射(PAT) 网络地址转换(NAT) IP 网络有公网与私网的区分,通常内网使用私网 IP,Internet 使用公网 IP,而 ...
- Linux Kernel TCP/IP Stack — L3 Layer — 路由器子系统
目录 文章目录 目录 Linux 作为一个路由器 路由表项的类型 route 指令 ip route 指令 添加默认路由 添加静态路由 删除静态路由 操作示例 Linux Kernel 路由子系统 路 ...
最新文章
- 天天都会写接口(interface),但它的用途和好处有多少人能说得清楚?
- java 清空一个list数据库_java – JPA EntityManager删除数据库中的所有记录
- 创建物化视图commit_oracle 中物化视图讲解
- MIME 类型(HttpContext.Response.ContentType)列表
- ACdream 1431 Sum vs Product
- python色标_在Python中用色标可视化移动速度
- Linux网络编程——tcp并发服务器(I/O复用之select)
- Codeforces #471
- 网页截图和svg模版动态生成图片Java实现
- python---(4) win10 环境下访问MYSQL 数据库
- java 定义接口school_Java接口介绍
- Oracle查看表空间使用情况
- 【C语言】科学计数法——复习总结
- cameralink解码编码FPGA代码定制
- 分析功能强大的蛋白质结构预测软件Phyre2
- 苹果2017秋季大会回顾
- 计算机管理老是自动打开,电脑老是自动重启怎么回事怎么解决
- 详解Java 12新特性:switch表达式
- opencv-python 视频抽帧成一张张图片
- 入行web前端开发可以做什么工作
热门文章
- 华为云服务器芯片,云服务器芯片
- python把汉字转换为二进制数_在Python中,如何将8位二进制数转换为ASCII字符?
- python实例化类执行顺序_Python实例化class的执行顺序
- 生成树生成森林c语言中文网,生成树协议(STP)基本知识及实验(使用eNSP)
- mysql 查询的转义字符_mysql – 如何在LIKE查询中转义字符?
- LinuxC-运算符
- Tensorflow get_variable和Varialbe的区别
- 异步社区本周半价电子书(6月11-17日)
- Node.js~ioredis处理耗时请求时连接数瀑增
- Centos6.6安装之后调优