3、TCP/IP协议栈精讲:OSI七层模型与TCP/IP四层模型对比、IP地址与子网掩码、端口与Socket概念

各位同学,欢迎来到第三章。这一章,我们要啃一块硬骨头——TCP/IP协议栈。

说实话,很多搞了三五年工控的老工程师,一提到协议栈就头疼。为什么?因为这东西看不见摸不着,全是逻辑概念。但我告诉你,搞工业以太网,不懂协议栈,就像开车不懂交通规则——能跑,但迟早要出事。

我个人习惯,讲协议栈从来不死记硬背。咱们换个思路:你想想看,数据从A设备到B设备,中间要经历什么?

3.1 OSI七层模型:理论上的完美蓝图

OSI七层模型,全称是开放系统互连参考模型。1984年由ISO组织提出。嗯,这里要注意,它只是一个参考模型,不是实际应用的协议。

七层分别是:

  1. 物理层:传比特流。说白了就是网线、光纤、电信号这些东西。
  2. 数据链路层:组帧、MAC地址寻址。我经常跟徒弟说,这一层负责的是「隔壁老王能不能收到」。
  3. 网络层:IP地址、路由选择。跨网段通信就靠它。
  4. 传输层:TCP/UDP、端口号。保证数据可靠到达。
  5. 会话层:建立、管理、终止会话。
  6. 表示层:数据加密、压缩、格式转换。
  7. 应用层:HTTP、FTP、Modbus TCP等,直接面向用户。

核心理解:OSI模型是「理论派」的产物。每一层职责清晰,边界分明。但在实际工业场景中,没人完全按这个来。为什么?太啰嗦了。

我在项目中遇到过一件事。有个客户非要按OSI七层去排查网络故障,结果搞了三天没找到问题。我过去一看,其实就是物理层的网线接触不良。你想想看,从第七层查到第一层,这不是绕远路吗?

3.2 TCP/IP四层模型:工业界的实战派

TCP/IP模型就务实多了。它把七层压缩成了四层:

TCP/IP四层模型 对应OSI层 典型协议/设备
应用层 5、6、7层 HTTP、Modbus TCP、Profinet
传输层 4层 TCP、UDP
网络层 3层 IP、ICMP、路由器
网络接口层 1、2层 以太网、交换机、网卡

你看,TCP/IP把会话层、表示层、应用层合并了。为什么?因为在实际开发中,这三层经常是揉在一起的。比如你写一个Modbus TCP的客户端程序,你会在代码里单独分一个「会话层」出来吗?不会的。

我个人建议:搞工业通信,重点掌握TCP/IP四层模型就够了。OSI七层作为知识储备,面试时可能会用到。

3.3 IP地址与子网掩码:设备的名片和门牌号

IP地址,说白了就是设备的身份证。在工业网络里,每个PLC、每个HMI、每个驱动器,都得有一个唯一的IP地址。

IPv4地址长这样:192.168.1.100。32位,分4段,每段8位。

但光有IP地址还不够。你想想看,一个工厂可能有几百台设备,怎么知道哪些设备在同一个网段?这时候就需要子网掩码。

我的经验:子网掩码可以理解为「门牌号系统」。255.255.255.0 表示前24位是网络号,后8位是主机号。同一个网络号下的设备,可以直接通信。

举个例子:

  • 设备A:IP 192.168.1.10,掩码 255.255.255.0
  • 设备B:IP 192.168.1.20,掩码 255.255.255.0
  • 设备C:IP 192.168.2.10,掩码 255.255.255.0

A和B在同一个网段,可以直接通信。A和C不在同一个网段,需要路由器转发。

避坑指南:我曾经在调试一条生产线时,发现两台PLC死活ping不通。查了半天,结果是子网掩码设成了255.255.0.0。两台设备IP分别是192.168.1.10和192.168.2.10,按这个掩码算,它们居然在同一个网段!但实际网络拓扑又不是这样。嗯,从那以后,我每次配IP都会再三确认子网掩码。

3.4 端口与Socket:通信的「门」和「钥匙」

端口是什么?我打个比方:IP地址是工厂的门牌号,端口就是工厂里的各个车间门。

一个设备只有一个IP地址,但可以同时跑很多服务。比如:

  • 端口80:Web服务
  • 端口502:Modbus TCP服务
  • 端口21:FTP服务

数据包到了设备后,系统根据端口号,把数据交给对应的应用程序处理。

那Socket呢?Socket = IP地址 + 端口号。它是一个通信的端点。

记住这个公式:Socket = (IP地址, 端口号)。它唯一标识了网络上的一个通信进程。

在工业以太网编程中,我们经常要创建Socket。比如用C#写一个Modbus TCP客户端:

// 创建一个TCP Socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork, 
                                  SocketType.Stream, 
                                  ProtocolType.Tcp);

// 连接到PLC(IP: 192.168.1.100, 端口: 502)
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 502);
clientSocket.Connect(remoteEP);

// 发送数据
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0A };
clientSocket.Send(data);

// 接收响应
byte[] buffer = new byte[1024];
int bytesRead = clientSocket.Receive(buffer);

你看,代码里最关键的就是IPEndPoint,它就是一个Socket——指定了IP和端口。

重要提醒:工业以太网中,端口号不能乱用。有些端口是保留的,比如502是Modbus TCP的默认端口。如果你用了别的端口,PLC可能不认。我见过有人把Modbus TCP端口改成8888,结果折腾了两天连不上。

3.5 总结:这些概念怎么串起来?

好了,咱们捋一捋:

  1. 数据从应用层下来,经过传输层加上端口号,到网络层加上IP地址,再到网络接口层加上MAC地址,最后变成比特流发出去。
  2. 接收方反过来,一层层解包,最终把数据交给对应端口的应用程序。
  3. 子网掩码决定了哪些设备可以直接通信,哪些需要路由器帮忙。
  4. Socket就是IP+端口,是通信的最终落脚点。

你想想看,这一套流程,是不是很像寄快递?

  • 应用层:你要寄的东西
  • 传输层:快递单上的「收件人姓名」(端口)
  • 网络层:快递单上的「地址」(IP)
  • 网络接口层:快递员和运输车(物理介质)

嗯,这么一比喻,是不是好理解多了?

下一章,咱们要讲ARP协议和MAC地址。到时候你会看到,数据链路层是怎么工作的。准备好了吗?