
简介这份PDF面向计算机网络初学者与备考人员系统梳理网络技术基础知识帮助读者建立从OSI/RM七层模型到实际网络类型的完整认知框架。内容围绕应用层、表示层、会话层、传输层、网络层、数据链路层与物理层逐层展开说明各层职责、典型协议与数据单元并延伸讲解广域网、互联网、局域网及以太网的差异涵盖TCP/IP协议族、CSMA/CD机制与常见网络设备等要点。资源包共1个PDF文件大小约813KB轻量便携适合随时查阅与打印复习。目前已有98人学习下载。读者可借此理清分层通信原理、协议对应关系与路由选择思路为配置网络设备、排查网络故障或开发网络应用打下扎实基础也可作为课堂笔记与考前速查的参考材料。1. 从一份 PDF 说起为什么 OSI 七层模型背得滚瓜烂熟抓包时还是看不懂很多人第一次接触计算机网络都是从一份叫《计算机网络技术基础知识.pdf》的讲义开始的。里面画着 OSI 七层模型、TCP/IP 四层协议栈、各种网络设备的位置考试前背得滚瓜烂熟选择题也能拿满分。但真到了工位上让你用 Wireshark 抓一个包分析一次 TCP 三次握手为什么慢或者排查为什么两台机器 ping 不通脑子里的七层模型瞬间就变成了玄学——知道有这七层但不知道每一层对应到哪个字段、哪个命令、哪个设备。这篇笔记就是来解决这个断层的。它不打算把 PDF 里的概念再抄一遍而是把「计算机网络技术基础知识」拆成一条能动手的路径先讲清楚 OSI 和 TCP/IP 到底怎么对应再落到 Linux 上能敲的命令、能抓的包、能改的参数最后把网络设备自动化运维脚本这个热词背后的最小可运行方案讲透。适合刚学完理论课想补实操的学生也适合天天写业务代码但对网络层一知半解的 DevOps 工程师。读完你至少能做到看到一张拓扑图能说出数据怎么走抓到一个包能定位到哪一层出了问题。2. OSI 七层与 TCP/IP 四层别背表格先搞懂封装和解封装2.1 分层设计到底解决了什么问题OSI 参考模型的核心思想不是把网络切成七块而是每一层只解决一类问题并且只和上下相邻层打交道。物理层管比特流怎么在网线里传数据链路层管相邻设备之间怎么成帧网络层管跨网段怎么寻址和路由传输层管端到端可靠性会话层、表示层、应用层在 TCP/IP 里被合并成了应用层。这种分层最大的好处是解耦你换一块网卡不需要改 HTTP 协议你升级到 IPv6不需要重写浏览器。但很多教程讲到这里就停了导致读者以为分层是「理论上的事」。实际上分层是实实在在体现在每一个数据包的结构里的。当你用curl访问一个网站时内核协议栈会依次给数据加上 TCP 头、IP 头、以太网头这个过程叫封装对端收到后逐层剥掉叫解封装。抓包工具看到的每一行就是某一层的头部信息。2.2 用 tcpdump 看一次真实的封装过程先装好工具Ubuntu/Debian 上sudo apt update sudo apt install -y tcpdump curl然后开一个终端抓包另一个终端发起请求# 终端 A抓取 eth0 上 80 端口的包-nn 不解析域名和端口名-e 显示 MAC 层 sudo tcpdump -i eth0 -nn -e port 80 -c 5 # 终端 B发起一个 HTTP 请求 curl -s http://example.com /dev/null你会看到类似这样的输出12:01:02.123456 aa:bb:cc:dd:ee:ff 11:22:33:44:55:66, ethertype IPv4 (0x0800), length 74: 192.168.1.10.54321 93.184.216.34.80: Flags [S], seq 123456789, win 64240, options [mss 1460,sackOK,TS val 123 ecr 0,nop,wscale 7], length 0这一行里aa:bb:cc:dd:ee:ff 11:22:33:44:55:66是数据链路层的以太网头ethertype IPv4说明上层是 IP192.168.1.10.54321 93.184.216.34.80是网络层的 IP 地址和传输层的端口Flags [S]是 TCP 的 SYN 标志。一行输出同时覆盖了三层这就是分层在实操中的样子。提示-e显示链路层头部-nn禁止反向解析-c 5抓满 5 个包就退出。生产环境抓包记得加-w file.pcap写文件别在终端刷屏。2.3 OSI 与 TCP/IP 的对应关系及常见设备落点OSI 层TCP/IP 层典型协议典型设备/命令数据单元应用层/表示层/会话层应用层HTTP、DNS、SSHcurl、dig、ss消息传输层传输层TCP、UDPnetstat、ss、tcpdump段/数据报网络层网际层IP、ICMP、ARPip route、ping、traceroute包数据链路层网络接口层Ethernet、PPPip link、arp、交换机帧物理层网络接口层双绞线、光纤ethtool、网卡比特这张表不用背但你要知道当你ping不通时问题可能出在网络层路由或链路层ARP当你curl超时时问题可能在传输层端口不通或应用层服务没起。分层排查法的价值就在这里——从下往上逐层确认而不是瞎猜。3. 从 ping 不通到 curl 超时一套可复用的分层排查流程3.1 先确认链路层和网络层是否通拿到一台机器说「网络有问题」我一般按这个顺序走# 1. 看网卡是否 UP有没有 IP ip link show ip addr show # 2. 看默认路由是否存在 ip route show # 3. 看 ARP 表里网关的 MAC 有没有解析到 ip neigh show # 4. ping 网关确认链路层和网络层到网关是通的 ping -c 3 192.168.1.1 # 5. ping 公网 IP确认路由和 NAT 没问题 ping -c 3 8.8.8.8 # 6. ping 域名确认 DNS 没问题 ping -c 3 example.com这六步基本能覆盖 80% 的「上不了网」问题。如果第 4 步不通问题在本地链路或网关第 5 步不通但第 4 步通问题在路由或 NAT第 6 步不通但第 5 步通问题在 DNS。3.2 传输层端口到底通不通网络层通了不代表服务能访问。传输层要确认目标端口是否开放、防火墙是否放行# 用 nc 测 TCP 端口-v 详细输出-z 只扫描不发送数据-w 超时 3 秒 nc -vz -w 3 example.com 443 # 用 ss 看本机监听端口-t TCP-l 监听-n 不解析-p 显示进程 ss -tlnp # 用 iptables 看防火墙规则需要 root sudo iptables -L -n -v --line-numbersnc -vz返回succeeded说明端口通返回Connection refused说明目标机器可达但端口没服务返回timed out说明被防火墙挡了或路由有问题。这三种结果对应完全不同的排查方向别混为一谈。3.3 应用层用 curl 的详细输出定位问题到了应用层curl -v是最实用的工具# -v 显示详细握手过程-o /dev/null 丢弃响应体-s 静默进度条-w 输出耗时统计 curl -v -o /dev/null -s -w DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n https://example.com输出会告诉你每个阶段花了多久。如果time_namelookup特别大问题在 DNS如果time_connect大问题在 TCP 握手可能是网络延迟或 SYN 被丢如果time_appconnect大问题在 TLS 握手如果time_starttransfer大问题在服务端处理。这套耗时拆解比任何理论都直观也是面试里经常问的「从输入 URL 到页面展示发生了什么」的实操版答案。注意curl -v会输出 TLS 证书信息生产环境注意别把敏感 header 打到日志里。调试完记得去掉-v。4. 网络设备自动化运维脚本用 Python 批量巡检交换机和路由器4.1 为什么需要自动化巡检「网络设备自动化运维脚本」是这两年运维岗的高频热词。原因很简单一个中型机房几十台交换机路由器靠人工telnet上去敲show interface看端口状态一天都干不完还容易漏。自动化巡检的核心就三件事批量登录、执行命令、解析结果并告警。常见做法是用 Python 的netmiko库它封装了 SSH 交互比直接调paramiko省事。先装依赖pip install netmiko4.2 最小可运行的批量巡检脚本from netmiko import ConnectHandler import re # 设备清单实际可从 CMDB 或 CSV 读取 devices [ {device_type: cisco_ios, host: 192.168.1.1, username: admin, password: xxx}, {device_type: huawei, host: 192.168.1.2, username: admin, password: xxx}, ] def check_device(dev): try: # 建立 SSH 连接timeout 防止卡死 conn ConnectHandler(**dev, timeout10) # 执行巡检命令不同厂商命令不同 output conn.send_command(display interface brief if huawei in dev[device_type] else show ip interface brief) conn.disconnect() # 简单解析找出 down 的接口 down_ports [line for line in output.splitlines() if re.search(r\bdown\b, line, re.I)] return {host: dev[host], status: ok, down_ports: down_ports} except Exception as e: # 连接失败也要记录不能静默吞掉 return {host: dev[host], status: error, msg: str(e)} for d in devices: result check_device(d) print(result)这段代码的逻辑很直白遍历设备列表用ConnectHandler建立 SSH 会话发一条查看接口状态的命令用正则筛出down的行最后打印结果。参数上device_type必须和厂商匹配cisco_ios、huawei、juniper_junos等timeout建议设 10 秒太短会误报太长会拖慢批量任务。4.3 从脚本到可用工具要补的三件事第一版脚本跑通后离「能用」还差三步。并发几十台设备串行跑太慢用concurrent.futures.ThreadPoolExecutor开 10 个线程。结果持久化把每次巡检结果写进 SQLite 或时序数据库方便对比历史。告警发现down端口或 CPU 超阈值时推送到告警平台而不是只打印在终端。from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers10) as pool: results list(pool.map(check_device, devices))max_workers别设太大交换机 SSH 并发连接数有限10 到 20 比较稳妥。另外注意华为和 Cisco 的命令差异很大device_type写错会直接抛异常建议先用一台设备验证命令再批量跑。提示生产环境密码不要硬编码在脚本里用环境变量或密钥管理服务。巡检脚本本身也要有日志出问题时能回溯是哪台设备哪条命令失败。5. 避坑与排查网络基础实操里最容易翻车的 5 个点5.1 现象ping 域名不通但 ping IP 通原因DNS 配置问题。/etc/resolv.conf里的 nameserver 不可达或者被systemd-resolved覆盖了。解决先cat /etc/resolv.conf看实际生效的 DNS再用dig 8.8.8.8 example.com测试指定 DNS 是否可用。如果是systemd-resolved管理用resolvectl status查看改配置要去/etc/systemd/resolved.conf而不是直接改resolv.conf。5.2 现象tcpdump 抓不到包原因抓错了网卡或者包被内核在更早的 hook 点处理了。比如抓lo上的流量却指定了eth0或者容器环境里流量走了docker0而不是物理网卡。解决先用ip addr确认流量走哪块网卡tcpdump -i any抓所有网卡对比。容器里抓包要在宿主机上抓对应的 veth 或网桥接口或者进容器网络命名空间抓。5.3 现象netmiko 连接超时或认证失败原因设备 SSH 版本太老只支持 SSHv1或者device_type和实际厂商不匹配或者设备限制了并发会话数。解决先用ssh -v admin192.168.1.1手动连一次确认 SSH 能通。如果设备只支持旧算法netmiko 需要在ConnectHandler里加disabled_algorithms参数。并发问题就降低max_workers。5.4 现象curl 返回 200 但内容不对原因被中间设备劫持或缓存了。常见于运营商 HTTP 劫持或者 CDN 缓存了旧内容。解决用curl -H Cache-Control: no-cache绕过缓存用curl --resolve example.com:443:1.2.3.4指定 IP 绕过 DNS对比结果。如果 HTTPS 正常 HTTP 不正常基本可以确认是链路中间有劫持。5.5 现象脚本在测试环境正常生产环境批量失败原因生产设备开启了exec-timeoutSSH 会话空闲一会儿就被踢或者 ACL 限制了脚本所在服务器的源 IP。解决netmiko 的send_command加read_timeout参数并在脚本里定期发空命令保活。源 IP 限制就找网络组加 ACL 放行别自己绕。6. 把 OSI 模型用起来一个抓包定位 TLS 握手失败的完整案例前面讲的都是单点工具最后用一个真实场景把分层排查串起来。某次服务上线后部分用户反馈「页面打不开」但服务端日志显示请求根本没到。这种问题最考验分层思维。第一步在客户端用curl -v看卡在哪curl -v -o /dev/null -s -w TCP: %{time_connect}s\nTLS: %{time_appconnect}s\n https://api.example.com如果time_connect正常但time_appconnect为 0 或报错说明 TCP 通了但 TLS 握手失败。第二步用openssl s_client看握手细节openssl s_client -connect api.example.com:443 -servername api.example.com -tls1_2输出里如果看到no peer certificate available或verify error说明证书链有问题。第三步用tcpdump抓 TLS 握手包确认是 ClientHello 发出后服务端没响应还是服务端返回了 Alertsudo tcpdump -i eth0 -nn -w tls.pcap port 443抓完用 Wireshark 打开过滤tls.handshake.type 2看 ServerHello过滤tls.alert_message看告警。如果服务端直接回了handshake_failure常见原因是客户端和服务端支持的 TLS 版本或加密套件不匹配。第四步确认是全局问题还是部分用户问题——如果是部分用户大概率是客户端环境差异老版本 OpenSSL、企业代理证书替换等而不是服务端配置。这个案例里链路层和网络层用ping和traceroute排除传输层用nc确认端口应用层用curl和openssl定位最后用tcpdump抓包坐实。每一步都对应 OSI 的某一层这就是「分层」从考试题变成排查工具的过程。我自己踩过最深的坑是早期排查问题时跳过链路层直接怀疑应用代码结果折腾半天发现是网线松了。后来养成的习惯是任何网络问题先ip addr和ping网关再谈其他。这个习惯帮我省下的时间比任何高级工具都多。希望帮到你。本文还有配套的精品资源点击获取