3、TCP/IP协议栈精讲:OSI七层模型与TCP/IP四层模型对比、IP地址与子网掩码、端口与Socket概念
各位同学,欢迎来到第三章。这一章,我们要啃一块硬骨头——TCP/IP协议栈。
说实话,很多搞了三五年工控的老工程师,一提到协议栈就头疼。为什么?因为这东西看不见摸不着,全是逻辑概念。但我告诉你,搞工业以太网,不懂协议栈,就像开车不懂交通规则——能跑,但迟早要出事。
我个人习惯,讲协议栈从来不死记硬背。咱们换个思路:你想想看,数据从A设备到B设备,中间要经历什么?
3.1 OSI七层模型:理论上的完美蓝图
OSI七层模型,全称是开放系统互连参考模型。1984年由ISO组织提出。嗯,这里要注意,它只是一个参考模型,不是实际应用的协议。
七层分别是:
- 物理层:传比特流。说白了就是网线、光纤、电信号这些东西。
- 数据链路层:组帧、MAC地址寻址。我经常跟徒弟说,这一层负责的是「隔壁老王能不能收到」。
- 网络层:IP地址、路由选择。跨网段通信就靠它。
- 传输层:TCP/UDP、端口号。保证数据可靠到达。
- 会话层:建立、管理、终止会话。
- 表示层:数据加密、压缩、格式转换。
- 应用层: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 总结:这些概念怎么串起来?
好了,咱们捋一捋:
- 数据从应用层下来,经过传输层加上端口号,到网络层加上IP地址,再到网络接口层加上MAC地址,最后变成比特流发出去。
- 接收方反过来,一层层解包,最终把数据交给对应端口的应用程序。
- 子网掩码决定了哪些设备可以直接通信,哪些需要路由器帮忙。
- Socket就是IP+端口,是通信的最终落脚点。
你想想看,这一套流程,是不是很像寄快递?
- 应用层:你要寄的东西
- 传输层:快递单上的「收件人姓名」(端口)
- 网络层:快递单上的「地址」(IP)
- 网络接口层:快递员和运输车(物理介质)
嗯,这么一比喻,是不是好理解多了?
下一章,咱们要讲ARP协议和MAC地址。到时候你会看到,数据链路层是怎么工作的。准备好了吗?