0

0

Linux网络通信原理理解_数据包传输流程解析【教程】

冷炫風刃

冷炫風刃

发布时间:2026-01-07 17:03:39

|

678人浏览过

|

来源于php中文网

原创

数据包从应用层发出时依次经过socket层→TCP/UDP层→IP层→邻居子系统→网络设备驱动→物理介质,每层仅处理自身头部并传递净荷。

linux网络通信原理理解_数据包传输流程解析【教程】

数据包从应用层发出时经过哪些内核协议层级

Linux 中一个 send() 系统调用发出的数据,并不会直接变成网线上的电信号。它要依次穿过 socket 层 → TCP/UDP 层 → IP 层 → 邻居子系统(ARP)→ 网络设备驱动 → 物理介质。

关键点在于:每一层只处理自己关心的字段,添加或校验对应头部,然后把净荷交给下一层。比如 TCP 层加 tcp_header,IP 层加 ip_header,而以太网帧头(eth_header)是在邻居子系统确认目的 MAC 后才补上的。

  • 若目标在同一子网,邻居子系统查 arp_table 或触发 ARP 请求获取 MAC;
  • 若目标跨网关,IP 层会把包发给默认路由对应的接口,MAC 地址填的是网关的;
  • netstat -rnip route get 可验证路由决策结果;
  • 使用 tcpdump -i any host 能在任意接口抓到未加密的原始包,但注意 loopback 接口(lo)上看到的是 IP 层以上,不含以太网头。

为什么 ping 通但 curl 不通?常见链路断裂点定位

ICMP(ping)走的是内核的 icmp_rcv() 路径,而 HTTP 请求依赖完整的四层栈(TCP 连接 + 应用层交互),任一环节异常都会失败。

  • TCP 连接阶段卡住:检查 ss -tn state syn-sent 是否堆积,说明 SYN 发出但没收到 SYN-ACK,可能是防火墙丢包、目标端口未监听、或中间设备限速;
  • 连接建立后无响应:用 tcpdump -i eth0 port 80 看是否有 ACK 流量,若 client 发了请求但 server 没回包,重点查 server 的 iptables -L -n -vsysctl net.ipv4.tcp_tw_reuse 设置;
  • 本地策略干扰:某些发行版默认启用 nf_conntrack,大量短连接可能耗尽连接跟踪表,表现为随机超时,可通过 cat /proc/sys/net/netfilter/nf_conntrack_count 查看当前用量;
  • DNS 解析成功不代表网络通:curl 默认先走 DNS,再建 TCP,建议用 curl -v --resolve example.com:80:192.168.1.100 http://example.com 绕过 DNS 直连测试。

tcpdump 抓不到包?三个最常被忽略的过滤与接口问题

tcpdump 默认只监听第一个非 loopback 接口,且无法捕获被内核丢弃前的包(如被 iptables -j DROP 丢弃的包,除非用 nflog 配合)。

PodLM
PodLM

PodLM是一款强大的AI播客生成工具

下载
  • 抓包接口选错:运行 ip link show up 列出所有 UP 状态接口,明确指定 -i eth0-i any(后者可捕获所有接口,但 loopback 上的包不含以太网帧头);
  • BPF 过滤器写错:例如想抓目标端口 22,写成 port 22 会同时匹配源和目的,应写 dst port 22
  • 混杂模式未启用或被禁用:某些云主机或容器环境默认关闭混杂模式,需确认 ip link show eth0 | grep PROMISC,若无输出且需抓其他主机流量,得联系管理员开启;
  • 抓包时机不对:TCP 三次握手的 SYN 包很小,容易被 tcpdump 的缓冲区丢弃,建议加 -B 4096 扩大缓冲,或用 -w file.pcap 先保存再分析。

容器或 namespace 中网络不通,优先检查哪些内核对象

容器本质是独立 network namespace,其网络栈与宿主机隔离。不理解命名空间边界,就容易在错误位置排查。

  • 确认进程所在 namespace:readlink /proc//ns/net,对比宿主机的 /proc/1/ns/net
  • 进入容器 netns 调试:nsenter -t -n ip addr 看是否有正确配置的 veth 接口和 IP;
  • 检查 veth 对是否配对:ethtool -S | grep peer(部分内核版本支持),或通过 ip link 输出中 interface 名称规律(如 vethabc123vethdef456)人工匹配;
  • 宿主机侧 veth 接口是否 UP:ip link set dev vethxxx up,否则即使容器内 ifconfig 显示 UP,也无法收发;
  • iptables FORWARD 链默认 DROP:Docker 等工具会操作 DOCKER-USER 链,但自建 namespace 若未显式允许转发,需加规则 iptables -I FORWARD -i cni0 -o eth0 -j ACCEPT(假设 cni0 是桥接接口)。

网络路径不是一条直线,而是由多个松耦合模块拼接而成。每层都有自己的缓存、队列、策略和错误码,跳过某一层的日志或状态检查,就可能把问题归因到完全错误的方向。

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

425

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

174

2023.10.30

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1007

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

57

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2025.12.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

567

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

58

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号