计算机网络及 SSH
《计算机网络》是计算机专业的一门专业课,通常从协议原理、报文格式讲到性能分析。但我们在四足机器人的开发中发现,它的实用价值非常高:调试机器人要 SSH 登录、给开发板传代码、查 IP、判断”连不上”到底是网线、地址还是服务的问题,几乎每天都会用到这些知识。而且不止 SSH——ROS 2 的底层本身就是网络通信(运行在 DDS 之上),一条机器狗往往搭载主控板、树莓派、UP board 等多个联网设备,无论是它们之间的 DDS 通信,还是自己编写的 TCP/UDP 通信,都需要计算机网络基础才能真正玩转。
今年我们也计划借鉴宇树(Unitree)的架构思路。去看宇树 A1 或 MIT Mini Cheetah 的架构就会发现,它们都在很大程度上使用了网络通信:控制电脑、多块板卡与电机驱动之间大量依赖以太网和 TCP/UDP。下图是宇树 A1 的网络框架——手柄、用户电脑、主控板、树莓派/TX2 和 UP board 通过交换机连在同一个网段,用户电脑正是通过这个网段访问机器狗的各块板卡:

因此,本节不打算复述整本教材,而是把这门课抽象成工程实践真正需要的那部分:讲清楚网络是怎么组织起来的、数据怎么找到目标机器和目标程序,再学会之后调试会一直用到的 SSH 工具。学完本节,你应该能看懂日常的网络配置,并独立完成”电脑连上机器人”这件事。
说明: 对《计算机网络》这门课程本身感兴趣的读者,可以自行搜索网课,进一步系统学习。
一. 网络的基本概念
Section titled “一. 网络的基本概念”1.1 网络要解决什么问题
Section titled “1.1 网络要解决什么问题”网络解决的是”多台设备之间如何交换数据”。单台电脑自己运行程序不需要网络;当程序需要和其他设备协作时——比如你的电脑要把代码传到机器人、浏览器要访问网站——就需要一条通路,以及一套”怎么找到对方、怎么把数据送过去”的规则。
1.2 设备靠两个地址标识自己:MAC 与 IP
Section titled “1.2 设备靠两个地址标识自己:MAC 与 IP”网络中的每台设备都有两个重要身份:
- MAC 地址:网卡出厂自带、全球唯一的硬件地址,类似”身份证”,由链路层使用。
- IP 地址:网络层分配的逻辑地址,类似”收件地址”,既标识设备,也表明设备属于哪个网络。
数据从一台机器发往另一台时,网络层凭借 IP 地址找到目标机器所在的网络并规划路径;进入目标所在网段后,再用 ARP 把 IP 翻译成 MAC 地址,由链路层完成最后的实际发送。一个负责”送到哪个网络、哪台机器”,一个负责”落到哪块网卡上”。
这两个概念后面第三、四节还会详细展开,这里先建立整体印象。
1.3 局域网(LAN)与交换机
Section titled “1.3 局域网(LAN)与交换机”局域网(Local Area Network,LAN) 是覆盖范围较小、通常由同一批人管理的网络,例如实验室的网络、宿舍的路由器网络。同一个局域网内的设备可以直接通信。
把几台设备连起来,最早常用集线器(hub),但它会把数据发给所有人;现在普遍使用交换机(switch):
- 交换机记住每个接口上连接设备的 MAC 地址;
- 收到数据后,只转发给目标设备所在的接口,而不是广播给所有人;
- 交换机在链路层工作,通常不关心 IP,只关心”同一个网段内送到哪台设备”。
可以把局域网想象成一个办公室:大家能互相喊话,交换机就是负责把话递到具体某个人桌上的收发员。
1.4 路由器与广域网(WAN)
Section titled “1.4 路由器与广域网(WAN)”局域网能解决小范围内的通信,但不同局域网之间呢?比如实验室网络和学校网络、你家和公司机房之间,需要用路由器(router)把它们连起来。跨越多个局域网、覆盖范围更大的网络叫广域网(Wide Area Network,WAN)。
路由器在网络层工作,根据 IP 地址决定数据”下一跳送到哪里”,把数据从一个网络转发到另一个网络。家庭和实验室里那个”上网用的盒子”通常是路由器,它一边接入上级网络(WAN 口),一边提供局域网(LAN 口/无线)。
1.5 互联网:把许多网络互连起来
Section titled “1.5 互联网:把许多网络互连起来”把许多局域网、广域网用路由器连接起来,就得到一张”网络的网络”,也就是互连网络(internet);我们平时说的”上网”里的互联网 / 因特网(Internet),特指全球范围那张互连起来的大网。它本身不属于任何人,而是由无数网络和路由器共同组成。
主机(host) 指网络中收发数据的设备:你的电脑、机器人开发板、服务器都算主机。下图中,“你的电脑”发数据给”服务器”,数据要先在局域网 A 内经过交换机,再被路由器逐跳转发出局域网、进入互联网,最后到达局域网 B:
1.6 本节术语小结
Section titled “1.6 本节术语小结”| 术语 | 含义 |
|---|---|
| 主机(host) | 网络中收发数据的设备,例如电脑、开发板、服务器 |
| 局域网(LAN) | 覆盖范围小、通常同一网段的网络 |
| 广域网(WAN) | 覆盖范围大、跨区域的网络 |
| 交换机(switch) | 链路层设备,按 MAC 地址在同一网段内转发 |
| 路由器(router) | 网络层设备,按 IP 地址在不同网络之间转发 |
| 网关(gateway) | 局域网通往其他网络的出口,通常就是路由器在局域网内的地址 |
| 互联网(Internet) | 由无数网络互连而成的全球大网 |
二. TCP/IP 四层模型
Section titled “二. TCP/IP 四层模型”2.1 为什么需要分层
Section titled “2.1 为什么需要分层”从”发一句话”到”对方收到这句话”,中间要做很多事:物理上怎么传送比特、怎么找到目标设备、数据属于哪个程序、内容怎么解释。把这些工作分层,每一层只负责一件事,并向上一层提供简单接口,问题就变得可管理:某层出问题时,也更容易定位。
现实中最常用的是 TCP/IP 四层模型,从上到下是:应用层、传输层、网络层、链路层。
2.2 四层各负责什么
Section titled “2.2 四层各负责什么”| 层 | 主要职责 | 关键概念 |
|---|---|---|
| 应用层 | 定义程序之间”说什么”,例如网页、远程登录 | HTTP、SSH、DNS |
| 传输层 | 端到端地把数据交给正确的程序 | 端口、TCP、UDP |
| 网络层 | 跨网络寻址,把数据送到正确的机器 | IP 地址、子网掩码、路由 |
| 链路层 | 同一网段内完成实际传输 | MAC 地址、交换机、以太网/Wi-Fi |
2.3 数据是层层打包的
Section titled “2.3 数据是层层打包的”发送数据时,应用层的数据先交给传输层,传输层加上”源端口、目标端口”等头部;网络层再包上”源 IP、目标 IP”;链路层最后加上帧头和帧尾,变成一整个以太网帧发送出去。接收方再自下而上逐层拆开,取出原始数据:
三. 链路层:同一网段内怎么传输
Section titled “三. 链路层:同一网段内怎么传输”链路层只负责相邻设备之间、同一网段之内的数据传输,不关心数据最终要去哪个网络。
3.1 MAC 地址
Section titled “3.1 MAC 地址”每块网卡在出厂时都有一个全球唯一的 MAC 地址(48 位,通常写成 6 组十六进制,例如 a0:b1:c2:d3:e4:f5),相当于设备的”硬件身份证”。它跟设备走,一般不会因为换网络而改变。
3.2 以太网帧
Section titled “3.2 以太网帧”链路层传输的数据单位叫帧(frame)。以太网帧里包含目标 MAC、源 MAC、上层数据和一个校验字段,接收方用校验字段检查数据有没有在传输中出错。常用的有线”以太网”和无线 Wi-Fi 都属于链路层技术,只是具体实现不同。
3.3 交换机在链路层做什么
Section titled “3.3 交换机在链路层做什么”交换机学习并维护”MAC 地址 → 接口”的对照表。收到帧后,查表把帧只转发到目标 MAC 对应的接口;如果还不知道目标在哪,才会向其他接口广播。路由器在把数据从自己的一个网络转发到另一个网络时,链路层负责的是”这一跳”的实际收发。
链路层对工程实践来说,记住”MAC 是网卡身份证、交换机按 MAC 转发”就基本够用了。至于”知道对方 IP、怎么找到对方 MAC”,需要网络层的 IP 和 ARP,接下来讲。
四. 网络层:让数据到达正确的机器(重点)
Section titled “四. 网络层:让数据到达正确的机器(重点)”网络层回答的问题是:目标设备在哪个网络、数据该走哪条路。 它解决跨网络通信,是理解日常网络配置的重点。
4.1 IP 地址
Section titled “4.1 IP 地址”IP 地址是网络层给每台主机分配的逻辑地址,相当于”邮寄地址”:既标识了设备,也包含了”它在哪个网络”的信息。目前最常用的是 IPv4:
- IPv4 是 32 位二进制数,写成 4 组十进制数字,每组 0–255,例如
192.168.1.10。 - 同一个网络内,IP 地址不能重复,否则会出现冲突(后接的设备或双方都可能无法正常通信)。
- IPv6 用 128 位地址解决 IPv4 地址不够用的问题,写法如
fe80::1。多数局域网调试仍以 IPv4 为主,本节重点讲 IPv4。
IPv4 地址分公有和私有:
- 公有地址可以在互联网上被直接路由,全球唯一;
- 私有地址只在局域网内使用,例如
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16这些网段。家用/实验室设备常用私有地址,路由器通过 NAT(网络地址转换) 把它们转换成公有地址后再上网。这就是为什么多台设备共用一个”外网 IP”也能同时上网。
提示:
127.0.0.1是一个特殊地址,表示”本机”(也叫 loopback),一般对应主机名localhost。在本机测试服务时很常用。
4.2 子网掩码:区分网络部分和主机部分
Section titled “4.2 子网掩码:区分网络部分和主机部分”IP 地址要拆成两半理解:网络部分(标识属于哪个网络)和主机部分(标识网络内的哪台设备)。从哪里拆开,由**子网掩码(subnet mask)**决定。
子网掩码也是 32 位,左边连续的一串 1 对应网络部分,右边连续的 0 对应主机部分。例如常见的 255.255.255.0,写成二进制是前 24 位为 1、后 8 位为 0,表示前 24 位是网络部分、后 8 位是主机部分。这种写法也常用 CIDR 记法 /24 表示。
把 IP 和掩码逐位做”与”运算,就得到网络地址(网络号)。例如:
IP 地址: 192.168.1.37 -> 11000000.10101000.00000001.00100101子网掩码: 255.255.255.0 -> 11111111.11111111.11111111.00000000与运算结果:192.168.1.0 -> 11000000.10101000.00000001.00000000于是 192.168.1.37/24 属于网络 192.168.1.0/24。同一网络内,主机部分全 0 的 192.168.1.0 是网络地址本身,不分配给设备;主机部分全 1 的 192.168.1.255 是广播地址,发给它等于发给网段内所有设备。所以 /24 网段可分配的主机地址是 个。
4.3 子网划分
Section titled “4.3 子网划分”子网划分就是”把一个大网络切成若干个小网络”。比如把 192.168.1.0/24 的 8 位主机部分借出 2 位给网络部分,得到掩码 /26(255.255.255.192),可以分成 4 个子网:
| 子网 | 网络地址 | 可用主机范围 | 广播地址 |
|---|---|---|---|
| 第 1 个 | 192.168.1.0/26 | 192.168.1.1 – 192.168.1.62 | 192.168.1.63 |
| 第 2 个 | 192.168.1.64/26 | 192.168.1.65 – 192.168.1.126 | 192.168.1.127 |
| 第 3 个 | 192.168.1.128/26 | 192.168.1.129 – 192.168.1.190 | 192.168.1.191 |
| 第 4 个 | 192.168.1.192/26 | 192.168.1.193 – 192.168.1.254 | 192.168.1.255 |
每个 /26 子网有 个可用地址。工程上更常见的是直接用现成的网段(如 /24),划分子网的价值在于理解”掩码不同,网络就不同”。
对调试最重要的一条结论是:
两台设备的网络地址相同,才能算”同一网段”;同一网段内可以直接通信,不同网段必须经过路由器转发。 电脑和机器人连不上时,第一步往往就是检查两者的 IP 是否在同一个网段。
之后的 SSH、ROS 2 多机通信等操作,通常都要求电脑和机器人处于同一局域网、同一网段。
4.4 路由与路由器
Section titled “4.4 路由与路由器”路由器连接多个网络,内部维护一张路由表,记录”要去某个网络,下一跳该发给谁、从哪个接口出去”。
- 目标在同一网段:直接交给链路层送达,不需要路由器。
- 目标在其他网段:发给本网段的网关,由路由器按路由表逐跳转发,直到到达目标网络。
- 默认网关(default gateway):路由表里
0.0.0.0/0那条”其他都走这里”的规则,通常就是局域网路由器在局域网内的地址,例如192.168.1.1。
一次跨网访问的过程大致是:主机把数据发给网关 → 路由器查表转发给下一跳 → 逐跳重复 → 最后一跳进入目标网络交给目标主机。你可以把路由器理解为接力赛里的中转站,每站只看”下一站去哪”。
4.5 ARP:在网段内把 IP 换成 MAC
Section titled “4.5 ARP:在网段内把 IP 换成 MAC”网络层用 IP 地址找到目标,但链路层实际发送帧时用的是 MAC 地址。同一个网段内,“知道对方 IP、不知道对方 MAC”的问题由 **ARP(地址解析协议)**解决:
- 发送方向网段内广播:“谁的 IP 是 192.168.1.20?请告诉我你的 MAC。”
- 拥有该 IP 的设备单播回复自己的 MAC。
- 发送方把结果缓存到 ARP 表(Linux 里可用
ip neigh查看),之后直接使用。
跨网段时,目标 IP 不是网关自己,但数据要先发给网关,所以主机用 ARP 找到的是网关的 MAC,再由网关继续转发。
4.6 DHCP:自动拿到网络配置
Section titled “4.6 DHCP:自动拿到网络配置”一台设备要上网,通常需要四样配置:IP 地址、子网掩码、默认网关、DNS 服务器。手动设置容易出错,DHCP(动态主机配置协议) 让设备开机时自动向网络申请这四项配置:
- 设备广播 DHCP 请求;
- DHCP 服务器(通常集成在路由器里)分配一个未使用的 IP 和对应配置,并约定一个”租期”;
- 到期前设备可以续租,长时间离线后地址可能被回收分给别人。
家用电脑、手机默认都开 DHCP。但机器人开发板经常配成静态 IP:地址固定,你随时都知道该连 192.168.1.20,不会因为租约到期而换地址,调试更稳定。
4.7 动手检查网络
Section titled “4.7 动手检查网络”| 命令 | 作用 |
|---|---|
ip addr | 查看本机所有网卡的 IP 地址和掩码 |
ip route | 查看路由表,包括默认网关 |
ip neigh | 查看 ARP 缓存(IP 与 MAC 的对应关系) |
ping 目标IP | 测试与目标是否可达,是最常用的连通性检查 |
traceroute 目标 | 查看数据逐跳经过哪些路由器 |
ip addr # 找到本机 IP,例如 192.168.1.10/24ip route # 找到 default via 192.168.1.1 这样的默认网关ping 192.168.1.20 # 测试能不能到达机器人提示:
ping不通只能说明”网络层不可达”,不能区分是网线、IP 配置、交换机还是防火墙的问题;ping通但服务连不上,则问题通常出在传输层或应用层,例如端口没监听、防火墙拦截。
五. 传输层:把数据交给正确的程序
Section titled “五. 传输层:把数据交给正确的程序”5.1 为什么需要端口
Section titled “5.1 为什么需要端口”IP 地址只能把数据送到”哪台机器”。但一台机器上同时跑着很多程序:SSH 服务、网页服务、ROS 程序……数据到达机器后,还要知道该交给哪个程序。端口(port) 就是给程序用的编号,用来在传输层区分不同的应用。
IP + 端口 才能唯一确定一个通信端点。例如 192.168.1.20:22 表示”这台机器的 22 端口”,即 SSH 服务。端口是 16 位数字,范围 0–65535,常见的知名端口有:
| 端口 | 服务 |
|---|---|
| 22 | SSH(远程登录) |
| 80 | HTTP(网页) |
| 443 | HTTPS(加密网页) |
| 53 | DNS(域名解析) |
5.2 TCP:面向连接的可靠传输
Section titled “5.2 TCP:面向连接的可靠传输”TCP(传输控制协议) 的目标是让数据可靠、有序地到达:先建立连接,再传输数据,收到后要确认,丢失会重传,接收方还会按顺序重组。大多数要求”一条数据都不能错”的场景用 TCP,例如 SSH、网页、文件传输。
TCP 把数据看成字节流,并给每个字节编号(序号 seq),接收方回复”期待下一个收到的序号”(ack),以此实现确认和重传。
5.3 三次握手与四次挥手
Section titled “5.3 三次握手与四次挥手”TCP 建立连接要交换三个报文,叫三次握手;关闭连接要交换四个报文,叫四次挥手:
可以类比打电话:
- 三次握手:“喂,能听到吗?”——“能听到,你呢?”——“我也能听到,开始说吧。“双方确认能双向通信后才开始。
- 四次挥手多一步,是因为一方收到”我要挂了”后,可能还有话没说完:先回”知道了”,把剩余内容发完,再说”我也说完了”,最后对方确认。
5.4 UDP:尽力而为的快速传输
Section titled “5.4 UDP:尽力而为的快速传输”UDP(用户数据报协议) 不需要建立连接,把数据包发出去就不管了:不保证到达、不保证顺序、不自动重传,所以叫”尽力而为”(best effort)。
那为什么还要用它?因为它没有连接建立和确认的开销,更快、延迟更低,适合对实时性敏感、丢一点数据也能接受的场景,例如视频通话、直播、一些传感器数据流。想象实时画面:一帧画面丢了,继续播下一帧即可,重传反而会让画面卡顿。
5.5 TCP 与 UDP 对比
Section titled “5.5 TCP 与 UDP 对比”| TCP | UDP | |
|---|---|---|
| 是否建立连接 | 是(三次握手) | 否 |
| 可靠性 | 可靠、有序、自动重传 | 尽力而为,可能丢包乱序 |
| 开销 | 较大 | 较小 |
| 典型用途 | SSH、网页、文件传输 | 实时音视频、直播、部分传感器数据 |
5.6 检查本机端口
Section titled “5.6 检查本机端口”Linux 中可以用 ss 查看哪些端口正在被监听:
ss -tlnp # 列出正在监听(LISTEN)的 TCP 端口及对应程序ss -ulnp # 列出正在监听的 UDP 端口调试时”连不上服务”,先看服务有没有在对应端口监听,再看防火墙是否放行。
六. 应用层:人直接接触的协议
Section titled “六. 应用层:人直接接触的协议”应用层是离人最近的一层。你上网时看到的很多东西都属于应用层协议:
- 浏览器地址栏的
http://xxx用的是 HTTP 协议:浏览器向服务器发请求,服务器返回网页内容;https://则是加了 TLS 加密的 HTTP,默认端口 443。一个地址如https://www.example.com/docs/可以拆成协议(https)、主机名(www.example.com)和路径(/docs/)。 - 你输入
www.baidu.com这样的域名,计算机先用 DNS 把它翻译成 IP 地址,再真正发起连接——DNS 就像”域名电话本”。 - 登录网站后刷新还保持登录状态,常常靠 Cookie:服务器让浏览器保存一小段标识,浏览器以后每次请求都带上它,服务器据此认出”还是这个用户”。
应用层定义了浏览器、服务器等程序之间如何”说同一种语言”。本节的重点在下面要讲的 SSH——它也是应用层协议,之后的实机调试会一直用到。对 HTTP、DNS 的更多细节感兴趣,可以按文末资料自行学习。
七. SSH:远程调试的钥匙
Section titled “七. SSH:远程调试的钥匙”7.1 为什么需要 SSH
Section titled “7.1 为什么需要 SSH”机器人开发板、服务器通常没有屏幕和键盘,或者不方便直接在设备上操作。SSH(Secure Shell) 让你通过网络在自己的电脑上打开一个加密的远程终端,输入的命令实际在远端执行,就像坐在设备面前一样。它默认使用 TCP 的 22 端口,传输过程加密,比早期不加密的远程登录方式安全。
之后传代码、跑程序、看日志、重启机器人,很多操作都是在 SSH 会话里完成的。
7.2 用 ssh 登录
Section titled “7.2 用 ssh 登录”基本格式:
ssh 用户名@目标地址例如登录开发板上的 robot 用户(IP 用实际地址替换):
ssh robot@192.168.1.20第一次连接时,SSH 会让你确认对方主机的指纹(host key),防止有人冒充目标机器:
The authenticity of host '192.168.1.20' can't be established.ECDSA key fingerprint is SHA256:xxxx... .Are you sure you want to continue connecting (yes/no)?确认主机没问题就输入 yes。之后输入密码即可登录。登录成功后,终端提示符会变成远端主机,你输入的每条命令都在远端执行;输入 exit 退出。
提示: 连接前先用
ping 192.168.1.20确认网络可达,并确认双方 IP 在同一网段。
7.3 用 scp 传文件
Section titled “7.3 用 scp 传文件”调试时经常要把代码传到开发板、把日志下载回来,可以用 scp(基于 SSH 的文件复制):
scp 本地文件 用户名@目标地址:远端路径 # 上传scp 用户名@目标地址:远端路径 本地路径 # 下载例如:
scp ./main.cpp robot@192.168.1.20:/home/robot/code/ # 把 main.cpp 传到远端目录scp robot@192.168.1.20:/home/robot/log.txt ./ # 把远端 log.txt 下载到当前目录上传整个目录加 -r:
scp -r ./my_project robot@192.168.1.20:/home/robot/7.4 配置密钥免密登录
Section titled “7.4 配置密钥免密登录”每次输密码很麻烦,配置密钥登录后,SSH 会改用一对密钥验证身份:
ssh-keygen -t ed25519 # 在本机生成一对密钥(一路回车即可)ssh-copy-id robot@192.168.1.20 # 把公钥安装到远端(最后一次输密码)ssh robot@192.168.1.20 # 之后不再需要密码ssh-keygen 生成的私钥保存在本机,千万不要外传;ssh-copy-id 把公钥追加到远端对应用户的 ~/.ssh/authorized_keys 里,远端就认得这把”钥匙”了。
7.5 连不上时怎么排查
Section titled “7.5 连不上时怎么排查”按从下到上的顺序检查:
ping 目标IP——不通先检查网线/无线、IP 和网段(ip addr)。- IP 是否同一网段——电脑
192.168.1.10/24、开发板192.168.1.20/24才是同一网段。 - 远端 SSH 服务是否在监听——在远端执行
ss -tlnp | grep 22(或systemctl status ssh查看服务状态)。 - 端口和防火墙——确认连接的是 22 端口,防火墙放行 SSH。
- 用户名与认证——确认用户名拼写、密码或密钥是否正确,出现
Permission denied优先检查这一点。
八. 常见问题
Section titled “八. 常见问题”电脑和机器人 ping 不通,可能是什么原因?
先看两者的 IP 和掩码是否同一网段,再看物理连接(网线、无线、交换机);同一网段还不同,检查防火墙。跨网段通信还要看默认网关是否正确。
为什么要把机器人配成静态 IP?
DHCP 分配的地址可能随租约变化,之后 SSH、程序配置里写死的 IP 都会失效。静态 IP 保证地址固定,调试更省心。
ping 通了,但 SSH 连不上?
说明网络可达,问题更可能在传输层/应用层:SSH 服务没启动、没监听 22 端口、防火墙拦截或认证信息错误。
TCP 和 UDP 应该选哪个?
需要保证数据完整、顺序正确的用 TCP(SSH、文件、网页);能容忍少量丢失、更看重实时性的用 UDP(音视频流等)。多数编程库中都能显式选择。
- 《计算机网络:自顶向下方法》,James F. Kurose、Keith W. Ross 著:经典教材,适合进一步系统学习。
- 《TCP/IP 详解 卷一:协议》,Kevin R. Fall 等:深入协议细节。
- Linux ip 命令手册:
ip addr、ip route、ip neigh等命令。 - OpenSSH 官方文档:
ssh、scp、ssh-keygen的完整说明。