跳转到内容

计算机网络及 SSH

《计算机网络》是计算机专业的一门专业课,通常从协议原理、报文格式讲到性能分析。但我们在四足机器人的开发中发现,它的实用价值非常高:调试机器人要 SSH 登录、给开发板传代码、查 IP、判断”连不上”到底是网线、地址还是服务的问题,几乎每天都会用到这些知识。而且不止 SSH——ROS 2 的底层本身就是网络通信(运行在 DDS 之上),一条机器狗往往搭载主控板、树莓派、UP board 等多个联网设备,无论是它们之间的 DDS 通信,还是自己编写的 TCP/UDP 通信,都需要计算机网络基础才能真正玩转。

今年我们也计划借鉴宇树(Unitree)的架构思路。去看宇树 A1 或 MIT Mini Cheetah 的架构就会发现,它们都在很大程度上使用了网络通信:控制电脑、多块板卡与电机驱动之间大量依赖以太网和 TCP/UDP。下图是宇树 A1 的网络框架——手柄、用户电脑、主控板、树莓派/TX2 和 UP board 通过交换机连在同一个网段,用户电脑正是通过这个网段访问机器狗的各块板卡:

宇树 A1 网络框架
宇树 A1 网络框架:多块板卡通过交换机与以太网互联

因此,本节不打算复述整本教材,而是把这门课抽象成工程实践真正需要的那部分:讲清楚网络是怎么组织起来的、数据怎么找到目标机器和目标程序,再学会之后调试会一直用到的 SSH 工具。学完本节,你应该能看懂日常的网络配置,并独立完成”电脑连上机器人”这件事。

说明: 对《计算机网络》这门课程本身感兴趣的读者,可以自行搜索网课,进一步系统学习。

网络解决的是”多台设备之间如何交换数据”。单台电脑自己运行程序不需要网络;当程序需要和其他设备协作时——比如你的电脑要把代码传到机器人、浏览器要访问网站——就需要一条通路,以及一套”怎么找到对方、怎么把数据送过去”的规则。

1.2 设备靠两个地址标识自己:MAC 与 IP

Section titled “1.2 设备靠两个地址标识自己:MAC 与 IP”

网络中的每台设备都有两个重要身份:

  • MAC 地址:网卡出厂自带、全球唯一的硬件地址,类似”身份证”,由链路层使用。
  • IP 地址:网络层分配的逻辑地址,类似”收件地址”,既标识设备,也表明设备属于哪个网络。

数据从一台机器发往另一台时,网络层凭借 IP 地址找到目标机器所在的网络并规划路径;进入目标所在网段后,再用 ARP 把 IP 翻译成 MAC 地址,由链路层完成最后的实际发送。一个负责”送到哪个网络、哪台机器”,一个负责”落到哪块网卡上”。

这两个概念后面第三、四节还会详细展开,这里先建立整体印象。

局域网(Local Area Network,LAN) 是覆盖范围较小、通常由同一批人管理的网络,例如实验室的网络、宿舍的路由器网络。同一个局域网内的设备可以直接通信。

把几台设备连起来,最早常用集线器(hub),但它会把数据发给所有人;现在普遍使用交换机(switch)

  • 交换机记住每个接口上连接设备的 MAC 地址;
  • 收到数据后,只转发给目标设备所在的接口,而不是广播给所有人;
  • 交换机在链路层工作,通常不关心 IP,只关心”同一个网段内送到哪台设备”。

可以把局域网想象成一个办公室:大家能互相喊话,交换机就是负责把话递到具体某个人桌上的收发员。

局域网能解决小范围内的通信,但不同局域网之间呢?比如实验室网络和学校网络、你家和公司机房之间,需要用路由器(router)把它们连起来。跨越多个局域网、覆盖范围更大的网络叫广域网(Wide Area Network,WAN)

路由器在网络层工作,根据 IP 地址决定数据”下一跳送到哪里”,把数据从一个网络转发到另一个网络。家庭和实验室里那个”上网用的盒子”通常是路由器,它一边接入上级网络(WAN 口),一边提供局域网(LAN 口/无线)。

1.5 互联网:把许多网络互连起来

Section titled “1.5 互联网:把许多网络互连起来”

把许多局域网、广域网用路由器连接起来,就得到一张”网络的网络”,也就是互连网络(internet);我们平时说的”上网”里的互联网 / 因特网(Internet),特指全球范围那张互连起来的大网。它本身不属于任何人,而是由无数网络和路由器共同组成。

主机(host) 指网络中收发数据的设备:你的电脑、机器人开发板、服务器都算主机。下图中,“你的电脑”发数据给”服务器”,数据要先在局域网 A 内经过交换机,再被路由器逐跳转发出局域网、进入互联网,最后到达局域网 B:

局域网、路由器和互联网的关系
局域网内用交换机转发,跨网络用路由器逐跳转发
术语含义
主机(host)网络中收发数据的设备,例如电脑、开发板、服务器
局域网(LAN)覆盖范围小、通常同一网段的网络
广域网(WAN)覆盖范围大、跨区域的网络
交换机(switch)链路层设备,按 MAC 地址在同一网段内转发
路由器(router)网络层设备,按 IP 地址在不同网络之间转发
网关(gateway)局域网通往其他网络的出口,通常就是路由器在局域网内的地址
互联网(Internet)由无数网络互连而成的全球大网

从”发一句话”到”对方收到这句话”,中间要做很多事:物理上怎么传送比特、怎么找到目标设备、数据属于哪个程序、内容怎么解释。把这些工作分层,每一层只负责一件事,并向上一层提供简单接口,问题就变得可管理:某层出问题时,也更容易定位。

现实中最常用的是 TCP/IP 四层模型,从上到下是:应用层、传输层、网络层、链路层。

主要职责关键概念
应用层定义程序之间”说什么”,例如网页、远程登录HTTP、SSH、DNS
传输层端到端地把数据交给正确的程序端口、TCP、UDP
网络层跨网络寻址,把数据送到正确的机器IP 地址、子网掩码、路由
链路层同一网段内完成实际传输MAC 地址、交换机、以太网/Wi-Fi

发送数据时,应用层的数据先交给传输层,传输层加上”源端口、目标端口”等头部;网络层再包上”源 IP、目标 IP”;链路层最后加上帧头和帧尾,变成一整个以太网帧发送出去。接收方再自下而上逐层拆开,取出原始数据:

TCP/IP 四层模型与数据封装
四层模型左右一一对应:发送时从应用数据开始,自内向外逐层封装

三. 链路层:同一网段内怎么传输

Section titled “三. 链路层:同一网段内怎么传输”

链路层只负责相邻设备之间、同一网段之内的数据传输,不关心数据最终要去哪个网络。

每块网卡在出厂时都有一个全球唯一的 MAC 地址(48 位,通常写成 6 组十六进制,例如 a0:b1:c2:d3:e4:f5),相当于设备的”硬件身份证”。它跟设备走,一般不会因为换网络而改变。

链路层传输的数据单位叫帧(frame)。以太网帧里包含目标 MAC、源 MAC、上层数据和一个校验字段,接收方用校验字段检查数据有没有在传输中出错。常用的有线”以太网”和无线 Wi-Fi 都属于链路层技术,只是具体实现不同。

交换机学习并维护”MAC 地址 → 接口”的对照表。收到帧后,查表把帧只转发到目标 MAC 对应的接口;如果还不知道目标在哪,才会向其他接口广播。路由器在把数据从自己的一个网络转发到另一个网络时,链路层负责的是”这一跳”的实际收发。

链路层对工程实践来说,记住”MAC 是网卡身份证、交换机按 MAC 转发”就基本够用了。至于”知道对方 IP、怎么找到对方 MAC”,需要网络层的 IP 和 ARP,接下来讲。

四. 网络层:让数据到达正确的机器(重点)

Section titled “四. 网络层:让数据到达正确的机器(重点)”

网络层回答的问题是:目标设备在哪个网络、数据该走哪条路。 它解决跨网络通信,是理解日常网络配置的重点。

IP 地址是网络层给每台主机分配的逻辑地址,相当于”邮寄地址”:既标识了设备,也包含了”它在哪个网络”的信息。目前最常用的是 IPv4:

  • IPv4 是 32 位二进制数,写成 4 组十进制数字,每组 0–255,例如 192.168.1.10
  • 同一个网络内,IP 地址不能重复,否则会出现冲突(后接的设备或双方都可能无法正常通信)。
  • IPv6 用 128 位地址解决 IPv4 地址不够用的问题,写法如 fe80::1。多数局域网调试仍以 IPv4 为主,本节重点讲 IPv4。

IPv4 地址分公有和私有:

  • 公有地址可以在互联网上被直接路由,全球唯一;
  • 私有地址只在局域网内使用,例如 10.0.0.0/8172.16.0.0/12192.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 网段可分配的主机地址是 282=2542^8 - 2 = 254 个。

子网划分就是”把一个大网络切成若干个小网络”。比如把 192.168.1.0/24 的 8 位主机部分借出 2 位给网络部分,得到掩码 /26255.255.255.192),可以分成 4 个子网:

子网网络地址可用主机范围广播地址
第 1 个192.168.1.0/26192.168.1.1 – 192.168.1.62192.168.1.63
第 2 个192.168.1.64/26192.168.1.65 – 192.168.1.126192.168.1.127
第 3 个192.168.1.128/26192.168.1.129 – 192.168.1.190192.168.1.191
第 4 个192.168.1.192/26192.168.1.193 – 192.168.1.254192.168.1.255

每个 /26 子网有 262=622^6 - 2 = 62 个可用地址。工程上更常见的是直接用现成的网段(如 /24),划分子网的价值在于理解”掩码不同,网络就不同”。

对调试最重要的一条结论是:

两台设备的网络地址相同,才能算”同一网段”;同一网段内可以直接通信,不同网段必须经过路由器转发。 电脑和机器人连不上时,第一步往往就是检查两者的 IP 是否在同一个网段。

之后的 SSH、ROS 2 多机通信等操作,通常都要求电脑和机器人处于同一局域网、同一网段。

路由器连接多个网络,内部维护一张路由表,记录”要去某个网络,下一跳该发给谁、从哪个接口出去”。

  • 目标在同一网段:直接交给链路层送达,不需要路由器。
  • 目标在其他网段:发给本网段的网关,由路由器按路由表逐跳转发,直到到达目标网络。
  • 默认网关(default gateway):路由表里 0.0.0.0/0 那条”其他都走这里”的规则,通常就是局域网路由器在局域网内的地址,例如 192.168.1.1

一次跨网访问的过程大致是:主机把数据发给网关 → 路由器查表转发给下一跳 → 逐跳重复 → 最后一跳进入目标网络交给目标主机。你可以把路由器理解为接力赛里的中转站,每站只看”下一站去哪”。

网络层用 IP 地址找到目标,但链路层实际发送帧时用的是 MAC 地址。同一个网段内,“知道对方 IP、不知道对方 MAC”的问题由 **ARP(地址解析协议)**解决:

  1. 发送方向网段内广播:“谁的 IP 是 192.168.1.20?请告诉我你的 MAC。”
  2. 拥有该 IP 的设备单播回复自己的 MAC。
  3. 发送方把结果缓存到 ARP 表(Linux 里可用 ip neigh 查看),之后直接使用。

跨网段时,目标 IP 不是网关自己,但数据要先发给网关,所以主机用 ARP 找到的是网关的 MAC,再由网关继续转发。

一台设备要上网,通常需要四样配置:IP 地址、子网掩码、默认网关、DNS 服务器。手动设置容易出错,DHCP(动态主机配置协议) 让设备开机时自动向网络申请这四项配置:

  • 设备广播 DHCP 请求;
  • DHCP 服务器(通常集成在路由器里)分配一个未使用的 IP 和对应配置,并约定一个”租期”;
  • 到期前设备可以续租,长时间离线后地址可能被回收分给别人。

家用电脑、手机默认都开 DHCP。但机器人开发板经常配成静态 IP:地址固定,你随时都知道该连 192.168.1.20,不会因为租约到期而换地址,调试更稳定。

命令作用
ip addr查看本机所有网卡的 IP 地址和掩码
ip route查看路由表,包括默认网关
ip neigh查看 ARP 缓存(IP 与 MAC 的对应关系)
ping 目标IP测试与目标是否可达,是最常用的连通性检查
traceroute 目标查看数据逐跳经过哪些路由器
Terminal window
ip addr # 找到本机 IP,例如 192.168.1.10/24
ip route # 找到 default via 192.168.1.1 这样的默认网关
ping 192.168.1.20 # 测试能不能到达机器人

提示: ping 不通只能说明”网络层不可达”,不能区分是网线、IP 配置、交换机还是防火墙的问题;ping 通但服务连不上,则问题通常出在传输层或应用层,例如端口没监听、防火墙拦截。

五. 传输层:把数据交给正确的程序

Section titled “五. 传输层:把数据交给正确的程序”

IP 地址只能把数据送到”哪台机器”。但一台机器上同时跑着很多程序:SSH 服务、网页服务、ROS 程序……数据到达机器后,还要知道该交给哪个程序。端口(port) 就是给程序用的编号,用来在传输层区分不同的应用。

IP + 端口 才能唯一确定一个通信端点。例如 192.168.1.20:22 表示”这台机器的 22 端口”,即 SSH 服务。端口是 16 位数字,范围 0–65535,常见的知名端口有:

端口服务
22SSH(远程登录)
80HTTP(网页)
443HTTPS(加密网页)
53DNS(域名解析)

TCP(传输控制协议) 的目标是让数据可靠、有序地到达:先建立连接,再传输数据,收到后要确认,丢失会重传,接收方还会按顺序重组。大多数要求”一条数据都不能错”的场景用 TCP,例如 SSH、网页、文件传输。

TCP 把数据看成字节流,并给每个字节编号(序号 seq),接收方回复”期待下一个收到的序号”(ack),以此实现确认和重传。

TCP 建立连接要交换三个报文,叫三次握手;关闭连接要交换四个报文,叫四次挥手

TCP 三次握手与四次挥手
三次握手建立连接,四次挥手关闭连接

可以类比打电话:

  • 三次握手:“喂,能听到吗?”——“能听到,你呢?”——“我也能听到,开始说吧。“双方确认能双向通信后才开始。
  • 四次挥手多一步,是因为一方收到”我要挂了”后,可能还有话没说完:先回”知道了”,把剩余内容发完,再说”我也说完了”,最后对方确认。

UDP(用户数据报协议) 不需要建立连接,把数据包发出去就不管了:不保证到达、不保证顺序、不自动重传,所以叫”尽力而为”(best effort)。

那为什么还要用它?因为它没有连接建立和确认的开销,更快、延迟更低,适合对实时性敏感、丢一点数据也能接受的场景,例如视频通话、直播、一些传感器数据流。想象实时画面:一帧画面丢了,继续播下一帧即可,重传反而会让画面卡顿。

TCPUDP
是否建立连接是(三次握手)
可靠性可靠、有序、自动重传尽力而为,可能丢包乱序
开销较大较小
典型用途SSH、网页、文件传输实时音视频、直播、部分传感器数据

Linux 中可以用 ss 查看哪些端口正在被监听:

Terminal window
ss -tlnp # 列出正在监听(LISTEN)的 TCP 端口及对应程序
ss -ulnp # 列出正在监听的 UDP 端口

调试时”连不上服务”,先看服务有没有在对应端口监听,再看防火墙是否放行。

应用层是离人最近的一层。你上网时看到的很多东西都属于应用层协议:

  • 浏览器地址栏的 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(Secure Shell) 让你通过网络在自己的电脑上打开一个加密的远程终端,输入的命令实际在远端执行,就像坐在设备面前一样。它默认使用 TCP 的 22 端口,传输过程加密,比早期不加密的远程登录方式安全。

之后传代码、跑程序、看日志、重启机器人,很多操作都是在 SSH 会话里完成的。

基本格式:

Terminal window
ssh 用户名@目标地址

例如登录开发板上的 robot 用户(IP 用实际地址替换):

Terminal window
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 在同一网段。

调试时经常要把代码传到开发板、把日志下载回来,可以用 scp(基于 SSH 的文件复制):

Terminal window
scp 本地文件 用户名@目标地址:远端路径 # 上传
scp 用户名@目标地址:远端路径 本地路径 # 下载

例如:

Terminal window
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

Terminal window
scp -r ./my_project robot@192.168.1.20:/home/robot/

每次输密码很麻烦,配置密钥登录后,SSH 会改用一对密钥验证身份:

Terminal window
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 里,远端就认得这把”钥匙”了。

按从下到上的顺序检查:

  1. ping 目标IP——不通先检查网线/无线、IP 和网段(ip addr)。
  2. IP 是否同一网段——电脑 192.168.1.10/24、开发板 192.168.1.20/24 才是同一网段。
  3. 远端 SSH 服务是否在监听——在远端执行 ss -tlnp | grep 22(或 systemctl status ssh 查看服务状态)。
  4. 端口和防火墙——确认连接的是 22 端口,防火墙放行 SSH。
  5. 用户名与认证——确认用户名拼写、密码或密钥是否正确,出现 Permission denied 优先检查这一点。

电脑和机器人 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 addrip routeip neigh 等命令。
  • OpenSSH 官方文档sshscpssh-keygen 的完整说明。