简单理解为:

IP 地址负责找到“哪台设备/哪块网卡”,
端口负责找到这台设备上的“哪个程序/服务”。


一台电脑上可能同时运行很多网络服务:

浏览器代理服务
数据库服务
网页服务器
机器人控制程序
摄像头图像服务
ROS 通信节点

这些程序都在同一台电脑上,光靠 IP 地址还不够区分,所以需要端口号。

因此127.0.0.1:7890就代表:

访问本机上监听 7890 端口的那个程序。


其中,127.0.0.1 永远代表“当前这台设备自己”。

注意这个“自己”是相对的。

比如:

在你的电脑上访问 127.0.0.1
= 访问你的电脑自己

在机器人主控电脑上访问 127.0.0.1
= 访问机器人主控电脑自己

在树莓派上访问 127.0.0.1
= 访问树莓派自己

所以 127.0.0.1 不是某一台固定电脑的地址,而是每台设备都认识的“自己”。


而对于局域网 IP, 可以理解为:

在同一个 Wi-Fi / 路由器下面,路由器给每个设备分配的内部地址。

比如你家里有这些设备:

路由器
你的电脑
你的手机
一台机器人
一台摄像头

它们连接到同一个 Wi-Fi 后,路由器可能会分配:

你的电脑:192.168.1.101
你的手机:192.168.1.102
机器人:  192.168.1.103
摄像头:  192.168.1.104

这就是局域网 IP。

它只在这个局域网内部有意义。

也就是说,在你这个 Wi-Fi 里:

192.168.1.103

可能是你的机器人。

但在别人家的 Wi-Fi 里:

192.168.1.103

可能是他的手机、电脑或者电视。

所以局域网 IP 不是全球唯一的,它可以在不同局域网里重复使用。


网段可以理解为:

一组 IP 地址的范围。

也就是说,网段不是某一个具体 IP,而是一片 IP 地址区域。

IPv4 地址由 4 段组成:

192 . 168 . 1 . 0

每一段叫一个 字节 / 八位组 / octet,每一段都是 8 位二进制,所以一共是32位,前24位就是前三段

比如192.168.1.0/24就代表:

192.168.1.xxx 这一组地址

192.168.123.0/24就代表:

192.168.123.xxx 这一组地址

/24 是子网掩码的简写,表示前 24 位用来表示网络部分,后面的部分用来分配给不同设备。

处在同一个网段意味着设备认为彼此在“同一个局域网范围内”,可以直接找对方通信,不需要经过路由器转发。


而在网络传输协议中,工业界唯二两款协议就是TCP和UDP。

1. TCP (Transmission Control Protocol):极其严谨的“挂号信”

TCP 是一个“强迫症晚期患者”。它为了保证数据 100% 完美无缺地送到,愿意牺牲一切速度和资源。

  • 工作模式:
    1. 三次握手(建连): 发数据前,先打电话确认:“喂,你在吗?” -> “在的,你能听到我吗?” -> “能听到,我开始发了。”(这极其耗时!)
    2. 编号发货: 把数据切成小块(数据包),给每个包打上序号(1,2,3,4…)。
    3. 丢包重传: 接收方收到 1 和 2,没收到 3。TCP 会立刻叫停:“等一下,3 丢了!重新发 3!” 直到 3 到了,才会处理后面的 4。
  • 优点: 绝对可靠。 数据不会丢、不会错、不会乱序。
  • 缺点: 太慢了,且开销极大。 只要网络稍微抖一下丢了个包,整个传输就会卡住等重传(这叫“队头阻塞”)。TCP 包的头部也很大(带有几十个字节的控制信息)。
  • 工业应用场景:
    • 网页浏览 (HTTP/HTTPS)
    • 文件下载 (FTP)
    • 发邮件 (SMTP)
    • 数据库查询
    • 总结:任何“哪怕错一个字节或者少一个字节,整个文件就打不开”的场景。

2. UDP (User Datagram Protocol):狂野的“机关枪”

UDP 是一个“极其不负责任的狂飙党”。它的座右铭是:“我只管射击,命中率关我屁事”。

  • 工作模式:
    1. 不管三七二十一: 不打招呼,不建立连接,拿到数据直接往对面的 IP 地址狂射。
    2. 不管死活: 不编号,不确认。包在半路上丢了就丢了,UDP 根本不知道,也不在乎。接收方收到 1, 3, 4,那就只有 1, 3, 4,丢了的 2 永远不会重传。
  • 优点: 快!延迟极低!极度轻量化! 它的包头只有 8 个字节,完全不浪费网络带宽。
  • 缺点: 不可靠。 会丢包、会乱序、会收到重复的包。
  • 工业应用场景:
    • 实时语音/视频会议:你宁愿画面偶尔卡出马赛克(丢包),也不希望听到的是 3 秒前的话(延迟)。
    • **机器人遥控与状态同步 **:裁判盒每秒发 60 次比赛状态,丢个 2 次根本无所谓,下一帧的最新状态马上就到了。

什么是 Socket(套接字)?

宏观意义上其就是操作系统的中介。

代码运行在用户态,它是没有权限直接去控制网卡发信号的。 当想要上网时,必须去求操作系统(Windows/Linux):“系统大哥,帮我把这段数据发到网上去。”

Socket 就是操作系统提供给你的一把“带有编号的钥匙”。 操作系统通过这把钥匙告诉你:“网卡太复杂了,你别管。我已经给你分配了一个专属的信箱(Socket),你要发数据,就往这个信箱里扔;你要收数据,就死死盯着这个信箱。其在代码层面就只是一个 int 整数!

而所谓的UDP Socket监听,就是:

占坑(Bind):绑定 IP 和端口。

无脑死循环(RecvFrom):只要坑里掉进来了东西,就拿出来,然后继续等下一个。


补充:TCP三次握手的具体细节

在握手过程中,TCP 数据包的头部会带有特殊的标记(Flag),只需要认识最重要的两个:

  • SYN (Synchronize,同步旗):代表“我想跟你建立连接,这是我的初始编号”。
  • ACK (Acknowledge,确认旗):代表“我收到你的消息了”。

除了小旗子,双方还要交换一个叫 seq(序列号) 的东西,也就是给自己的话编个号,防止以后乱序。

第一次握手:客户端 -> 服务器
  • 动作: 客户端主动举起 SYN 旗子,并随机生成一个自己的编号(假设 seq = 100),发给服务器。
  • 对讲机翻译: “喂喂,服务器!我是客户端,我想跟你建立连接。我发话的起始编号是 100,你能到吗?”
  • 客户端状态: 进入 SYN_SENT(同步已发送)状态。
  • 证明了什么: 此时什么都还没证明。
第二次握手:服务器 -> 客户端
  • 动作: 服务器收到了!它极其兴奋。为了回复客户端,它举起了 ACK 旗子(表示收到 100,期待下一个 101);同时,服务器自己也要测试能不能连通,所以它也举起了 SYN 旗子,并生成自己的编号(假设 seq = 500),发给客户端。
  • 对讲机翻译: “客户端我到了!你的 100 我收到了(期待你的 101)。那你能到我说话吗?我发话的起始编号是 500。”
  • 服务器状态: 进入 SYN_RCVD(同步已接收)状态。
  • 证明了什么: 对于服务器来说,它确认了:客户端的发送能力正常,自己的接收能力正常
第三次握手:客户端 -> 服务器
  • 动作: 客户端收到了服务器的回复!它现在必须告诉服务器“我能听到”。于是它举起 ACK 旗子(表示收到 500,期待 501),并发给服务器。
  • 对讲机翻译: “服务器我也到了!你的 500 我收到了(期待你的 501)。测试完毕,我们开始正式聊天吧!”
  • 客户端状态: 进入 ESTABLISHED(已建立连接)状态。服务器收到后也进入 ESTABLISHED
  • 证明了什么: 对于客户端来说,它确认了:自己的收发正常,服务器的收发也正常。对于服务器来说,它终于确认了:自己的发送正常,客户端的接收正常
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐