文章目录
- Linux网络基础入门:从快递包裹看懂TCP/IP,手摸命令行实战
-
- 一、网络到底是啥:从"单打独斗"到"万物互联"
-
- [1.1 从单机到联网的进化史](#1.1 从单机到联网的进化史)
- [1.2 为什么学网络必学Linux?](#1.2 为什么学网络必学Linux?)
- 二、协议:网络世界的"通用黑话手册"
-
- [2.1 协议本质就是"约定"](#2.1 协议本质就是“约定”)
- [2.2 为什么协议要"分层"?](#2.2 为什么协议要“分层”?)
- [三、两张分层地图:OSI七层 vs TCP/IP四层](#三、两张分层地图:OSI七层 vs TCP/IP四层)
-
- [3.1 OSI七层:理想主义的蓝图](#3.1 OSI七层:理想主义的蓝图)
- [3.2 TCP/IP四层:真正落地的工程标准](#3.2 TCP/IP四层:真正落地的工程标准)
- [3.3 用快递系统理解四层模型](#3.3 用快递系统理解四层模型)
- 四、数据包的旅行:封装与解包
-
- [4.1 封装:一层层套快递盒](#4.1 封装:一层层套快递盒)
- [4.2 解包:一层层拆快递盒](#4.2 解包:一层层拆快递盒)
- [4.3 补充:MTU------快递的最大尺寸](#4.3 补充:MTU——快递的最大尺寸)
- [五、两个关键地址:MAC vs IP](#五、两个关键地址:MAC vs IP)
-
- [5.1 MAC地址:你的身份证号](#5.1 MAC地址:你的身份证号)
- [5.2 IP地址:你的收货地址](#5.2 IP地址:你的收货地址)
- [5.3 核心区别](#5.3 核心区别)
- [5.4 Linux下实战查看](#5.4 Linux下实战查看)
- 六、端口:把数据送到正确的"房间"
-
- [6.1 端口是啥?](#6.1 端口是啥?)
- [6.2 端口分类](#6.2 端口分类)
- [6.3 Linux下查看端口](#6.3 Linux下查看端口)
- 七、Socket:网络通信的"插座"
-
- [7.1 Socket是什么?](#7.1 Socket是什么?)
- [7.2 最常用的Socket API](#7.2 最常用的Socket API)
- [八、TCP vs UDP:两种快递模式](#八、TCP vs UDP:两种快递模式)
-
- [8.1 TCP:靠谱的顺丰快递](#8.1 TCP:靠谱的顺丰快递)
- [8.2 UDP:佛系的平邮](#8.2 UDP:佛系的平邮)
- 九、网络字节序:统一的"书写规范"
-
- [9.1 大端和小端](#9.1 大端和小端)
- [9.2 网络统一大端](#9.2 网络统一大端)
- 十、初学者上手小练习
- 十一、总结
Linux网络基础入门:从快递包裹看懂TCP/IP,手摸命令行实战
学Linux绕不开网络,就像开网店绕不开快递。很多初学者一看到OSI七层、TCP/IP、封装解包就头大,其实把网络当成「全国快递系统」,所有概念瞬间就通了。本文就用最接地气的比喻,带你从零理解网络核心概念,同时配上Linux终端的实战命令,看完就能上手查配置、排问题。
一、网络到底是啥:从"单打独斗"到"万物互联"
1.1 从单机到联网的进化史
最早的计算机都是"孤岛":你办公室的电脑存着报表,我电脑里存着合同,要传文件得靠U盘拷来拷去,这就是独立模式------数据各存各的,谁也不挨谁。
后来大家觉得太麻烦,用网线把几台电脑连起来,共享文件、共用打印机,这就成了局域网(LAN) ,相当于一个写字楼里的公司内部快递,只在楼里转。再后来,把全国各地的局域网都连起来,就成了广域网(WAN),相当于全国快递网络,北京的文件能传到深圳。
补充一句:局域网和广域网是相对概念。比如国内的运营商网络,说它是广域网没错,但把它单独拎出来看,也像一个超大型局域网。
1.2 为什么学网络必学Linux?
企业服务器、路由器、云主机几乎清一色跑Linux,核心原因有两个:
- 一切皆文件:网卡、IP配置、路由规则全是文件,改配置不用点来点去,一行命令或改个文件就生效,灵活度拉满。
- 协议栈内置内核:Linux内核直接实现了完整的TCP/IP协议栈,性能强、稳定性高,7×24小时不关机也不崩,这是服务器最看重的特质。
二、协议:网络世界的"通用黑话手册"
2.1 协议本质就是"约定"
你打电话,铃响三声接;我打电话,铃响五声才接,那肯定打不通。网络通信也是同理:两台电脑用电信号、光信号传0和1,你用频率高低表示01,我用电压强弱表示01,就像一个说中文一个说葡萄牙语,规则不一样,根本没法聊。
协议,就是通信双方都要遵守的一套数据格式和交互规则。小到网卡之间传数据,大到浏览器开网页,每一层都有对应的协议。
2.2 为什么协议要"分层"?
想象一下:如果把"语言沟通"和"电话设备"绑死,那换个手机就得重新学说话?显然不合理。所以协议设计成了分层结构:
- 通信设备层:管信号怎么传,用有线还是无线,换设备只改这一层;
- 语言层:管内容怎么理解,用中文还是英文,换语言只改这一层。
这就是解耦的思想:每层只干自己的事,层与层之间通过固定接口交互,改其中一层不影响其他层,维护成本大大降低。
三、两张分层地图:OSI七层 vs TCP/IP四层
3.1 OSI七层:理想主义的蓝图
国际标准化组织ISO画了一张完美的蓝图------OSI七层模型,从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
这模型概念非常严谨,理论上无懈可击,但问题是太复杂了,实际工程里根本没法完全落地。比如会话层、表示层,操作系统根本没法单独实现,所以工业界最终用的是更务实的TCP/IP模型。
3.2 TCP/IP四层:真正落地的工程标准
TCP/IP不是一个协议,而是一堆协议的集合,叫TCP/IP协议簇。它把网络简化成了四层,和Linux内核的对应关系非常清晰:
| 分层 | 核心职责 | Linux内核对应 | 常见设备/协议 |
|---|---|---|---|
| 应用层 | 给用户程序提供通信能力 | 用户态实现(浏览器、Nginx等) | HTTP、FTP、SSH |
| 传输层 | 端到端的数据传输,管进程间通信 | net/ipv4/tcp.c、net/ipv4/udp.c |
TCP、UDP |
| 网络层 | 地址管理和路由选择,找路的 | net/ipv4/ip.c |
IP协议、路由器 |
| 网络接口层 | 设备间的数据帧传输,物理传输 | 网卡驱动 + 内核MAC层 | 以太网、交换机、网卡 |
很多教材也叫"TCP/IP五层模型",就是把网络接口层拆成物理层和数据链路层,本质是一回事。
3.3 用快递系统理解四层模型
把网络传输比作寄快递,每层的角色瞬间清晰:
- 网络接口层 = 快递员 + 快递三轮车:负责在同一个小区/网点里送包裹,认的是单元楼号(MAC地址);
- 网络层 = 全国快递中转系统:负责跨省跨市运输,认的是收货地址(IP地址);
- 传输层 = 快递分拣中心:负责把包裹送到具体的收件人手上,认的是手机号+姓名(端口号);
- 应用层 = 你拆快递:拿到包裹里的东西,处理具体业务(看网页、传文件)。
四、数据包的旅行:封装与解包
4.1 封装:一层层套快递盒
你要寄一个玩偶(应用数据):
- 先装到快递袋里,写上收件人手机号(传输层报头,加端口),这叫TCP段;
- 再装到纸箱里,写上收货地址(网络层报头,加IP),这叫IP数据报;
- 最后套上防水袋,贴上网点扫码标签(链路层报头,加MAC),这叫以太网帧。
这个每层都加上自己的报头,把上层数据当货物包起来 的过程,就叫封装。
4.2 解包:一层层拆快递盒
包裹到了收件人手里,反过来操作:
- 快递员扫防水袋标签(拆链路层报头),确认是这个网点的;
- 中转中心看纸箱地址(拆网络层报头),确认是这个城市的;
- 分拣员看快递袋手机号(拆传输层报头),确认是这个收件人的;
- 你拿到玩偶(应用数据),完成接收。
4.3 补充:MTU------快递的最大尺寸
以太网规定一个帧最大1500字节,这就是MTU(最大传输单元),相当于快递的"限重限尺寸"。如果包裹太大,网络层会把它拆成几个小包裹分片传输,到目的地再拼起来。
五、两个关键地址:MAC vs IP
很多初学者分不清MAC地址和IP地址,用身份证和收货地址类比就懂了:
5.1 MAC地址:你的身份证号
- 身份 :数据链路层用的地址,48位十六进制,比如
08:00:27:03:fb:19; - 特点:网卡出厂就烧进去了,一般改不了,全球唯一;
- 作用:局域网里找设备用的,同一个网段里,靠MAC地址确认包裹发给谁。
就像身份证号,出生就定了,在小区里取快递,报身份证号就能证明是你。
5.2 IP地址:你的收货地址
- 身份 :网络层用的地址,IPv4是32位整数,写成点分十进制比如
192.168.1.100; - 特点:可以手动改,也可以DHCP自动分配,换个网络IP就变了;
- 作用:跨网段找路用的,从北京到深圳,全程靠IP地址规划路线。
就像收货地址,你搬家了地址就变了,全国快递靠地址找到你。
5.3 核心区别
- IP地址全程不变:从发送端到接收端,IP地址始终是源IP和目的IP;
- MAC地址每跳都变:每经过一个路由器/交换机,源MAC和目的MAC都会换成下一段的设备地址。
简单说:IP管最终目的地,MAC管下一段怎么走。
5.4 Linux下实战查看
用现代Linux标配的iproute2工具集(别用老旧的ifconfig了):
# 查看所有网卡的MAC地址
ip link show
# 或者精简过滤
ip a | grep "link/ether"
# 查看所有IP地址
ip addr show
# 只看IPv4
ip addr | grep inet | grep -v inet6
输出示例:
link/ether 00:16:3e:0e:d8:3c brd ff:ff:ff:ff:ff:ff
inet 192.168.43.138/24 brd 192.168.43.255 scope global ens33
六、端口:把数据送到正确的"房间"
6.1 端口是啥?
IP地址只能找到某台电脑,但电脑上同时跑着浏览器、微信、迅雷几十个进程,数据该给谁?这就需要端口号。
- 端口号是16位整数,范围0~65535;
- 一个端口只能被一个进程占用,相当于一个房间只能住一个人;
- IP + 端口号,就能唯一标识网络上某台主机的某一个进程。
继续类比:IP是小区地址,端口是门牌号。快递到了小区,看门牌号就知道送哪家。
6.2 端口分类
- 0~1023:知名端口:固定给常用服务用,比如SSH用22,HTTP用80,HTTPS用443;
- 1024~65535:动态端口:操作系统随机分配给客户端程序,比如你开浏览器访问网站,本地端口就是从这里面挑的。
6.3 Linux下查看端口
用ss命令(替代老旧的netstat,性能更强):
# 查看所有监听的TCP和UDP端口,数字形式显示
ss -tuln
# 查看端口对应的进程(需要root权限)
ss -tulnp
# 过滤查看22端口
ss -tuln | grep :22
七、Socket:网络通信的"插座"
7.1 Socket是什么?
把IP地址(主机)和端口号(进程)拼在一起,就是Socket(套接字)。
- 格式:
IP:端口,比如192.168.1.100:8080; - 本质:网络通信的端点,两个进程通过Socket就能跨网络通信。
Socket在Linux里是什么地位?它是应用层和内核协议栈之间的翻译官:应用程序不用懂TCP/IP细节,只要调用Socket API,内核就会帮你完成封装、传输、解包全过程。
7.2 最常用的Socket API
不用记,有个印象就行:
socket():创建一个套接字,相当于买个插座;bind():绑定端口号,相当于把插座装在指定房间;listen():开始监听,相当于等着别人插插头;accept():接收连接,相当于有人插进来了;connect():主动连接别人,相当于你去插别人的插座。
八、TCP vs UDP:两种快递模式
传输层最核心的两个协议,就像两种快递服务:
8.1 TCP:靠谱的顺丰快递
- 面向连接:发快递前先打电话确认对方在不在,三次握手建立连接;
- 可靠传输:丢了自动重发,乱序自动排序,保证数据完整按顺序到达;
- 面向字节流:像水流一样,数据可以拆分也可以合并;
- 适用场景:网页浏览、文件传输、远程登录,要求数据不能错的场景。
8.2 UDP:佛系的平邮
- 无连接:直接发,不用提前打招呼;
- 不可靠:丢了不负责,也不保证顺序;
- 面向数据报:一个包裹就是一个整体,发多少收多少;
- 优点:快!开销小,延迟低;
- 适用场景:直播、语音通话、游戏,允许丢一点包,但要低延迟的场景。
九、网络字节序:统一的"书写规范"
9.1 大端和小端
计算机存多字节数据有两种习惯:
- 大端:低地址存高位字节,和我们写字从左到右一样;
- 小端:低地址存低位字节,反过来存。
不同CPU架构字节序可能不一样,x86大多是小端,有些嵌入式是大端。如果网络传输各用各的,收到的数据就全乱了。
9.2 网络统一大端
TCP/IP协议明确规定:网络数据流一律采用大端字节序。不管你主机是大端还是小端,发数据前转成大端,收数据后再转成自己主机的格式。
Linux提供了现成的转换函数:
#include <arpa/inet.h>
// host to network long:32位主机字节序转网络字节序
uint32_t htonl(uint32_t hostlong);
// network to host short:16位网络字节序转主机字节序
uint16_t ntohs(uint16_t netshort);
名字很好记:h=host主机,n=network网络,l=long长整型,s=short短整型。
十、初学者上手小练习
打开你的Linux虚拟机,执行下面几条命令,亲手验证上面的概念:
-
查看自己的网卡、MAC、IP
ip addr show
-
查看系统正在监听的端口
ss -tulnp
-
抓一个数据包看看封装(需要root)
抓1个ICMP包(ping包),看看链路层、网络层结构
tcpdump -c 1 -i any icmp
十一、总结
网络的本质,就是用分层的协议,把数据从一个进程传到另一个进程。从物理层的电信号,到应用层的网页内容,每一层各司其职,靠报头传递控制信息,靠地址完成路由和交付。
而Linux,就是这套网络协议最经典的实现载体。不用死记硬背概念,多敲命令多抓包,看着数据包一层层拆开,自然就懂了。