简介这份PPT课件面向计算机相关专业学生及信息技术入门者系统讲解计算机网络的基础概念与核心原理帮助读者建立对网络体系结构的整体认知。内容涵盖计算机网络的定义、产生与发展、基本组成与逻辑结构、拓扑结构及分类并深入剖析局域网与广域网的技术特点以及资源共享、通信功能、高可靠性、负荷均衡、协调运算与分布式处理等主要功能同时结合企业信息管理与个人信息服务场景说明其实际应用。资源包共1个PPT文件大小约1.13MB以图文并茂的幻灯片形式呈现便于课堂讲授与自学梳理。目前已有1143人学习下载适合作为课程配套讲义或考前复习资料帮助读者快速掌握网络基础知识的脉络与要点。1. 从抓包丢包到子网划分一份能直接翻的计算机网络基础实战手册很多人学计算机网络都卡在同一个地方OSI 七层背得滚瓜烂熟一到真机上看ping不通、traceroute断在第三跳、子网掩码算错一位导致整个 C 段不通就完全不知道从哪下手。这份「计算机网络基础」资源包解决的正是这个断层——它不是又一本讲 TCP 三次握手的教科书而是把协议原理、抓包验证、命令行排查、子网计算这几件事串成一条可复现的路径。适合谁刚入行的运维、准备面试的后端、需要排查内网问题的开发以及考完试但没真正配过交换机的人。下面按「先立住原理、再动手验证、最后避坑」的顺序拆开讲。2. 协议分层与数据封装为什么抓包看到的和书上不一样2.1 从应用层到物理层的封装链路理解计算机网络基础第一步不是背七层名字而是搞清楚一个数据包从你的浏览器发出到网线之间到底被套了几层壳。常见做法是打开 Wireshark 抓一个 HTTP 请求你会看到 Ethernet II → IP → TCP → HTTP 这样一条嵌套结构这就是封装Encapsulation。每一层在上一层的数据前面加自己的头部接收端再逐层剥掉。这里有个反直觉的点你在 Wireshark 里看到的「HTTP」其实是 TCP 载荷Wireshark 只是根据端口 80 猜的。如果服务跑在 8080它可能显示成 TCP segment 而不是 HTTP。所以排查问题时不要迷信协议解析结果要看原始字节。封装过程可以用一个简单脚本模拟帮你建立「头部逐层叠加」的直觉# 模拟数据从应用层到链路层的封装过程 # 每一层加自己的头部用字典表示 def encapsulate(payload): # 应用层原始数据 app_data {layer: Application, data: payload} # 传输层加 TCP 头源端口、目的端口、序号 tcp_segment { layer: Transport(TCP), src_port: 49152, # 客户端随机端口 dst_port: 80, # HTTP 服务端口 seq: 1, payload: app_data } # 网络层加 IP 头源 IP、目的 IP、TTL ip_packet { layer: Network(IP), src_ip: 192.168.1.10, dst_ip: 93.184.216.34, ttl: 64, # 每经过一个路由器减 1 payload: tcp_segment } # 链路层加以太网头源 MAC、目的 MAC frame { layer: DataLink(Ethernet), src_mac: aa:bb:cc:dd:ee:ff, dst_mac: 11:22:33:44:55:66, payload: ip_packet } return frame result encapsulate(GET /index.html HTTP/1.1) # 逐层打印观察嵌套结构 import json print(json.dumps(result, indent2, ensure_asciiFalse))这段代码的关键参数是ttl和端口号。TTL 默认 64 或 128每过一个路由器减 1减到 0 就丢弃并回 ICMP 超时——这就是traceroute的原理。端口号决定了传输层交给哪个应用49152 以上是客户端临时端口1024 以下是知名端口。跑一遍这个脚本再对照 Wireshark 的分层视图封装的概念就落地了。2.2 用 tcpdump 验证三次握手与四次挥手原理讲再多不如抓一次真实握手。在 Linux 上用 tcpdump 抓本机与某个 HTTP 服务的交互# 抓取与目标 IP 的 TCP 握手和挥手过程 # -i any 监听所有网卡-n 不解析域名-S 显示绝对序号 sudo tcpdump -i any -n -S tcp and host 93.184.216.34 and port 80 -c 20你会看到类似这样的输出IP 192.168.1.10.49152 93.184.216.34.80: Flags [S], seq 1001 IP 93.184.216.34.80 192.168.1.10.49152: Flags [S.], seq 2001, ack 1002 IP 192.168.1.10.49152 93.184.216.34.80: Flags [.], ack 2002三行就是三次握手SYN → SYNACK → ACK。Flags [S]是 SYN[S.]是 SYNACK[.]是纯 ACK。序号seq 1001是客户端初始序号服务端回ack 1002表示「我收到了你的 1001下次给我 1002」。挥手则是[F.]和[.]的组合通常是四次。参数说明-c 20抓满 20 个包自动停避免刷屏-S显示绝对序号而不是相对序号方便对照host和port是过滤表达式不写会抓到大量无关流量。如果抓不到先确认网卡名ip a看再确认是否有权限需要 root 或 CAP_NET_RAW。3. IP 地址与子网划分手算子网掩码和 CIDR 的落地方法3.1 子网掩码的二进制本质与 CIDR 表示子网划分是网络基础里最容易翻车的地方因为很多人靠背「/24 是 255.255.255.0」而不理解为什么。本质很简单子网掩码是一串连续的 1 后面跟连续的 01 的个数就是 CIDR 的斜杠数字。/24就是 24 个 1即11111111.11111111.11111111.00000000转十进制就是255.255.255.0。判断两个 IP 是否在同一子网就是把 IP 和掩码做按位与结果相同就在同一网段。手算容易错写个脚本验证# 判断两个 IP 是否在同一子网并计算网络地址和广播地址 import ipaddress def subnet_info(ip, cidr): # 构造网络对象strictFalse 允许主机位非零 net ipaddress.IPv4Network(f{ip}/{cidr}, strictFalse) print(f网络地址: {net.network_address}) print(f广播地址: {net.broadcast_address}) print(f可用主机数: {net.num_addresses - 2}) # 减去网络地址和广播地址 print(f掩码: {net.netmask}) return net def same_subnet(ip1, ip2, cidr): net1 ipaddress.IPv4Network(f{ip1}/{cidr}, strictFalse) net2 ipaddress.IPv4Network(f{ip2}/{cidr}, strictFalse) # 比较网络地址是否相同 return net1.network_address net2.network_address # 示例192.168.1.10 和 192.168.1.200 在 /24 下同网段 print(same_subnet(192.168.1.10, 192.168.1.200, 24)) # True # 换成 /25一个在 0-127一个在 128-255不同网段 print(same_subnet(192.168.1.10, 192.168.1.200, 25)) # False subnet_info(192.168.1.10, 26)关键参数strictFalse很重要否则192.168.1.10/26会因为主机位非零报错。num_addresses - 2是可用主机数因为网络地址和广播地址不能分配给主机。/26的掩码是255.255.255.192每个子网 64 个地址可用 62 个。跑一遍这个脚本再手算几个子网划分就不再是玄学。3.2 用 ipcalc 和 route 命令做真机验证脚本算完真机上用ipcalc快速验证# 计算 192.168.1.10/26 的网络信息 ipcalc 192.168.1.10/26 # 查看本机路由表确认默认网关和直连网段 ip route show # 或旧命令 route -nipcalc输出会列出 Network、Broadcast、HostMin、HostMax直接对照你手算的结果。ip route show输出里default via 192.168.1.1 dev eth0是默认路由192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10是直连网段。如果发现目标 IP 既不在直连网段又没有默认路由包就会被丢弃并回「Network is unreachable」。常见误用把网关设成子网外的地址。比如192.168.1.10/26的网关必须是192.168.1.1到192.168.1.62之间设成192.168.1.100就不通因为网关必须和本机在同一子网。这个坑在配静态 IP 时经常遇到ip route add default via 192.168.1.100会直接报错。4. 路由与交换排查ping、traceroute、arp 的组合用法4.1 从 ping 不通到定位是路由还是 ARP 问题ping不通是最常见的报障但 ping 本身不告诉你问题在哪一层。正确的排查顺序是先看 ARP 有没有解析到 MAC再看路由有没有匹配最后看防火墙有没有拦。# 第一步确认目标 IP 的 ARP 缓存 arp -n | grep 192.168.1.1 # 如果没有条目手动触发 ARP 解析 ping -c 1 192.168.1.1 arp -n | grep 192.168.1.1 # 第二步确认路由匹配 ip route get 192.168.1.1 # 第三步逐跳追踪看断在哪 traceroute -n 8.8.8.8 # 或 tracepath 8.8.8.8arp -n显示 IP 到 MAC 的映射。如果目标在同一网段但 ARP 解析不出来说明二层就不通——可能是网线、VLAN 或交换机端口问题。ip route get会告诉你内核实际选了哪条路由、从哪个网卡出、源 IP 是什么。traceroute的-n不解析域名输出更快。如果前三跳就断问题在本地或运营商接入如果中间某跳开始全是*可能是那台路由器禁了 ICMP不一定是真断。参数说明ping -c 1只发一个包用于触发 ARP 而不刷屏。traceroute默认用 UDP 高端口有些防火墙会拦可以换-I用 ICMP 或-T用 TCP。tracepath不需要 root 权限适合普通用户。4.2 用 ss 和 netstat 看端口监听与连接状态网络不通有时不是路由问题而是服务没监听或连接被拒。用ss替代老旧的netstat# 查看所有 TCP 监听端口-t TCP-l 监听-n 不解析-p 显示进程 ss -tlnp # 查看与某个 IP 的所有连接状态 ss -tn state established ( dport :80 or sport :80 ) # 统计各状态连接数排查 TIME_WAIT 过多 ss -sss -tlnp输出里LISTEN表示端口在监听0.0.0.0:80表示监听所有网卡127.0.0.1:3306表示只监听本地。如果服务只监听 127.0.0.1外部就连不上这是新手常踩的坑。ss -s的TIME_WAIT数量如果上万说明短连接太多需要调内核参数或改用长连接。常见误用用netstat发现命令不存在就以为系统坏了。现代发行版默认不装net-tools用ss和ip替代即可。ss的参数-t是 TCP-u是 UDP-l是监听-n是数字显示-p是进程组合起来-tlnp最常用。5. 避坑与常见问题网络排查里那些血泪经验5.1 现象ping 通但服务连不上原因ICMP 和 TCP 走的是不同协议栈路径防火墙可能放行 ICMP 但拦了 TCP 端口。或者服务只监听了 IPv6 而你没注意。解决用telnet或nc测端口nc -zv 192.168.1.1 80。如果端口不通但 ping 通检查防火墙规则iptables -L -n或firewall-cmd --list-all再确认服务监听地址ss -tlnp | grep 80。5.2 现象traceroute 中间跳全是星号原因中间路由器配置了不回应 ICMP 超时消息这是正常的安全策略不代表链路断了。解决换用 TCP 模式traceroute -T -p 80 目标或者用mtr持续探测看丢包率。如果最后一跳能到中间星号可以忽略。5.3 现象子网划分后部分 IP 不通原因网关地址不在子网范围内或者子网掩码配错导致广播地址冲突。解决用ipcalc重新核对网络地址和可用范围确认网关是子网内第一个或最后一个可用地址。检查是否有两个子网重叠比如192.168.1.0/24和192.168.1.128/25就重叠了。5.4 现象DNS 解析慢导致网页打开慢原因/etc/resolv.conf里配了多个 DNS第一个不通时超时才切下一个。解决用dig或nslookup测每个 DNS 的响应时间只保留最快的。dig 8.8.8.8 example.com指定 DNS 测试。如果内网有 DNS优先用内网。5.5 现象MTU 不匹配导致大包丢失原因隧道或某些链路 MTU 小于 1500大包被丢弃但小包能过表现为能 ping 通但传文件卡死。解决用ping -M do -s 1472 目标测试1472281500逐步减小-s找到能通的最大值然后调整网卡 MTUip link set dev eth0 mtu 1400。6. 进阶技巧用 mtr 和 tcpdump 做持续网络质量监控排查完单次故障真正有价值的是建立持续监控习惯。我一般会同时开两个窗口一个跑mtr看长期丢包一个跑tcpdump抓异常包。mtr结合了 ping 和 traceroute持续刷新每一跳的丢包率和延迟# --report 输出报告模式-c 100 发 100 个包-n 不解析域名 mtr --report -c 100 -n 8.8.8.8 # 交互模式实时刷新 mtr 8.8.8.8报告模式输出每一跳的 Loss%、Snt、Last、Avg、Best、Wrst、StDev。重点看 Loss% 从哪一跳开始上升如果某一跳开始丢包且后续跳也丢说明问题在那跳如果只有那一跳丢而后续不丢可能是那台路由器限速 ICMP不影响实际流量。tcpdump做异常包监控比如抓 SYN 但没 ACK 的包判断是否有 SYN Flood 或防火墙拦截# 抓 SYN 包但不抓 SYNACK-c 50 抓 50 个停 sudo tcpdump -i any -n tcp[tcpflags] tcp-syn ! 0 and tcp[tcpflags] tcp-ack 0 -c 50 # 抓 ICMP 不可达消息看谁在拒绝 sudo tcpdump -i any -n icmp[icmptype] icmp-unreach第一个命令的过滤表达式tcp[tcpflags] tcp-syn ! 0表示 SYN 位置位tcp-ack 0表示 ACK 位没置位合起来就是纯 SYN 包。如果大量 SYN 来自同一源 IP 且没有后续 ACK基本可以判定是扫描或攻击。第二个命令抓 ICMP 不可达能看到是哪台设备回的、什么原因网络不可达、端口不可达、需要分片。参数说明-i any监听所有网卡生产环境如果流量大建议指定具体网卡如-i eth0。-n不解析域名和端口名减少 DNS 查询干扰。-c限制抓包数量避免磁盘写满。-w可以写文件后续用 Wireshark 分析-r读文件。从那以后我每次配完网络都强制走一遍ip a看地址 →ip route看路由 →ss -tlnp看监听 →ping网关 →traceroute目标 →tcpdump抓一次握手。这套流程帮我省了无数次「以为配好了其实没通」的后悔药。希望帮到你。本文还有配套的精品资源点击获取