大家好,我是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网络硬核系列相关推荐

  1. Linux Kernel TCP/IP Stack|Linux网络硬核系列 | 图

    https://mp.weixin.qq.com/s/63HBz8DGPjLeNd43kaOunw

  2. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

    目录 文章目录 目录 Linux bridge 的基本操作 创建 Bridge 将 veth pair 连上 Bridge 为 Bridge 配置 IP 地址 将物理网卡接口设备挂靠 Bridge L ...

  3. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架

    目录 文章目录 目录 netfilter 框架 netfilter 的组成模块 netfilter 的 Hook 机制实现 netfilter 的工作原理 规则(Rules) 链(Chains) 表( ...

  4. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型

    目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...

  5. Linux Kernel TCP/IP Stack — 协议栈收包处理流程

    目录 文章目录 目录 L2 NIC Controller 收包处理流程 L3-4 收包处理流程 Socket Layer 收包处理流程 参考文档 L2 NIC Controller 收包处理流程 硬件 ...

  6. Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

    目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...

  7. Linux Kernel TCP/IP Stack — Overview

    目录 文章目录 目录 协议栈全景图 协议栈处理流程概览 协议栈收发包概览 协议栈的逻辑架构 协议栈的分层架构 协议栈的文件系统 协议栈的数据结构 协议栈全景图 协议栈处理流程概览 在 Linux Ke ...

  8. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — iptables NAPT 网络地址/端口转换

    目录 文章目录 目录 网络地址转换(NAT) SNAT DNAT 端口映射(PAT) 网络地址转换(NAT) IP 网络有公网与私网的区分,通常内网使用私网 IP,Internet 使用公网 IP,而 ...

  9. Linux Kernel TCP/IP Stack — L3 Layer — 路由器子系统

    目录 文章目录 目录 Linux 作为一个路由器 路由表项的类型 route 指令 ip route 指令 添加默认路由 添加静态路由 删除静态路由 操作示例 Linux Kernel 路由子系统 路 ...

最新文章

  1. 天天都会写接口(interface),但它的用途和好处有多少人能说得清楚?
  2. java 清空一个list数据库_java – JPA EntityManager删除数据库中的所有记录
  3. 创建物化视图commit_oracle 中物化视图讲解
  4. MIME 类型(HttpContext.Response.ContentType)列表
  5. ACdream 1431 Sum vs Product
  6. python色标_在Python中用色标可视化移动速度
  7. Linux网络编程——tcp并发服务器(I/O复用之select)
  8. Codeforces #471
  9. 网页截图和svg模版动态生成图片Java实现
  10. python---(4) win10 环境下访问MYSQL 数据库
  11. java 定义接口school_Java接口介绍
  12. Oracle查看表空间使用情况
  13. 【C语言】科学计数法——复习总结
  14. cameralink解码编码FPGA代码定制
  15. 分析功能强大的蛋白质结构预测软件Phyre2
  16. 苹果2017秋季大会回顾
  17. 计算机管理老是自动打开,电脑老是自动重启怎么回事怎么解决
  18. 详解Java 12新特性:switch表达式
  19. opencv-python 视频抽帧成一张张图片
  20. 入行web前端开发可以做什么工作

热门文章

  1. 华为云服务器芯片,云服务器芯片
  2. python把汉字转换为二进制数_在Python中,如何将8位二进制数转换为ASCII字符?
  3. python实例化类执行顺序_Python实例化class的执行顺序
  4. 生成树生成森林c语言中文网,生成树协议(STP)基本知识及实验(使用eNSP)
  5. mysql 查询的转义字符_mysql – 如何在LIKE查询中转义字符?
  6. LinuxC-运算符
  7. Tensorflow get_variable和Varialbe的区别
  8. 异步社区本周半价电子书(6月11-17日)
  9. Node.js~ioredis处理耗时请求时连接数瀑增
  10. Centos6.6安装之后调优