一.ip
1.ip的定义
IP是"Internet Protocol"的缩写,即"互联网协议"。它是用于计算机网络通信的基础协议之一,属于TCP/IP 协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机,并确保数据能够在复杂的网络环境中正确地路由和转发。
2.ip地址
IP地址是IP协议的核心组成部分,它是一个用于唯一标识网络设备(如计算机、服务器、路由器等)的地址。IP地址分为两种主要版本:
(1)IPv4(Internet Protocol version 4)
-
格式 :IPv4地址是一个32位的二进制数,通常以点分十进制格式表示,例如:
192.168.1.1
。 -
地址范围 :IPv4地址的范围是从
0.0.0.0
到255.255.255.255
。 -
分类:
-
A类地址 :范围是
1.0.0.0
到126.0.0.0
,默认子网掩码为255.0.0.0
。 -
B类地址 :范围是
128.0.0.0
到191.255.0.0
,默认子网掩码为255.255.0.0
。 -
C类地址 :范围是
192.0.0.0
到223.255.255.0
,默认子网掩码为255.255.255.0
。 -
D类地址 :范围是
224.0.0.0
到239.255.255.255
,用于多播(组播)。 -
E类地址 :范围是
240.0.0.0
到255.255.255.255
,目前保留未使用。
-
-
特点:IPv4地址数量有限(约43亿个),随着互联网的快速发展,IPv4地址逐渐耗尽。
ip4里面的子网掩码是什么?
子网掩码将ip地址划分为网络部分和本地部分,帮网络设备确定ip地址所属的子网。子网通过其二进制形式中的"1"和"0"来区分这两个部分。
-
网络部分:子网掩码中为"1"的部分表示IP地址的网络部分,用于标识网络。
-
主机部分:子网掩码中为"0"的部分表示IP地址的主机部分,用于标识网络中的设备。
子网掩码的分类
根据IPv4地址的分类(A、B、C类),默认子网掩码如下:
A类地址 :默认子网掩码为
255.0.0.0
,表示前8位为网络部分,后24位为主机部分。B类地址 :默认子网掩码为
255.255.0.0
,表示前16位为网络部分,后16位为主机部分。C类地址 :默认子网掩码为
255.255.255.0
,表示前24位为网络部分,后8位为主机部分。
(2)IPv6(Internet Protocol version 6)
-
格式 :IPv6地址是一个128位的二进制数,通常以冒号分隔的十六进制格式表示,例如:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
。 -
特点:
-
提供了几乎无限的地址空间(约3.4×10³⁸个地址),解决了IPv4地址不足的问题。
-
支持更高效的路由和自动配置功能。
-
内置了更好的安全性(如IPsec)。
-
-
推广现状:尽管IPv6已经存在多年,但由于兼容性和成本问题,目前全球范围内的IPv6普及率仍在逐步提高。
(3)特殊的地址 127.0.0.01
127.0.0.1
是IPv4协议中保留的本地回环地址(Loopback Address)。它被用于标识本机上的网络服务,主要用于测试和调试网络程序。
那么为什么我一定要用这个ip地址呢?用别的地址不行吗?
使用127.0.0.1
有其特定的优势和必要性。127.0.0.1
是一个特殊的回环地址,用于本地通信,可以避免网络冲突和配置问题,确保测试环境的一致性和隔离性。因此,推荐使用127.0.0.1
进行本地调试和测试。
二. 端口
1.端口的定义
端口是一个16位的数字,范围从0到65535。它用于标识应用程序或服务在某个IP地址上的具体位置。每个IP地址可以有多个端口,每个端口可以运行不同的应用程序或服务。
2.端口的分类
端口可以分为以下几类:
(1)系统端口(0-1023)
这些端口通常由系统或操作系统保留,用于运行系统服务和关键应用程序。例如:
-
端口80:用于HTTP协议,提供网页访问服务。
-
端口443:用于HTTPS协议,提供安全的网页访问服务。
-
端口21:用于FTP协议,提供文件传输服务。
-
端口25:用于SMTP协议,提供电子邮件服务。
(2) 用户端口(1024-49151)
这些端口可以由用户自定义或由应用程序使用。许多应用程序会使用这些端口进行网络通信。例如:
-
端口3306:用于MySQL数据库服务。
-
端口5432:用于PostgreSQL数据库服务。
(3)动态端口(49152-65535)
这些端口通常由操作系统动态分配,用于临时通信。例如,当你使用浏览器访问一个网页时,浏览器会从这些端口中选择一个临时端口作为通信的源端口。
三.通讯接口
1.通讯接口的定义
-
通讯接口是一个实现通讯协议的接口 ,使得不同设备或应用程序能够按照协议的规定进行通信。
-
通讯接口可以是软件接口 (如API、库)或硬件接口(如USB、RS-232)。
软件接口和硬件接口之间有什么关系呢?
2.通讯接口分类
-
软件接口:如Socket、Snap7、Modbus-TCP等。
-
硬件接口:如USB、RS-232、RS-485等。
3.接口Snap7和Socket
(1)Snap7
-
定义:
- Snap7 是一个用于与西门子 S7 系列 PLC(可编程逻辑控制器)进行通信的开源库。它提供了与 PLC 设备进行数据交换的接口。
-
接口类型:
-
PLC 接口:Snap7 主要用于与 PLC 设备进行通信,因此可以被视为一种 PLC 接口。
-
软件接口:Snap7 提供了软件接口,允许开发者通过编程与 PLC 设备进行通信。
-
-
作用:
- 提供了与西门子 PLC 设备进行高效、可靠通信的接口,适用于工业自动化领域。
(2)Socket
-
定义:
- Socket 是计算机网络中的一种通用通信接口,可以用于实现网络通信。它提供了与网络中其他设备或应用程序进行数据交换的接口。
-
接口类型:
- 计算机软件接口:Socket 是计算机网络中的一种通用接口,适用于各种网络应用。
-
作用:
- 提供了网络通信的接口,使得不同设备或应用程序之间可以进行数据传输,适用于多种网络通信场景。
四.通讯协议
1.通讯协议的定义
-
通讯协议是一组规则和标准 ,用于定义两个或多个通信实体 (如设备、应用程序)之间如何进行信息交换。
-
协议规定了通信的内容、格式、顺序以及错误处理等细节。

2.通讯协议分类
-
网络协议:如TCP/IP、UDP、HTTP、FTP等。
-
工业协议:如Modbus、Profibus、Profinet、S7等。
-
应用层协议:如HTTP、HTTPS、SMTP、POP3等。
可是为什么会有这么多通讯协议的分类呢?
因为通讯协议的多样性是由于不同的应用场景、历史背景和技术发展导致的。
五.UDP和TCP
-
UDP
-
定义:UDP是一种无连接的传输层协议,它不提供可靠的数据传输服务,也不保证数据能够成功到达接收方。它在发送数据前不需要与接收方建立连接,发送数据后也不会等待接收方的确认。
-
特点:UDP协议简单高效,适用于实时性要求较高的应用场景,如视频会议、在线游戏等。
-
-
TCP
-
定义:TCP是一种面向连接的传输层协议,它在发送数据前需要与接收方建立可靠的连接。TCP通过三次握手(SYN、ACK、SYN-ACK)来建立连接,通过四次挥手(FIN、ACK、FIN-ACK)来断开连接。
-
特点:TCP提供可靠的数据传输服务,能够保证数据的按序到达和完整性。它适用于对数据可靠性要求较高的场景,如文件传输、电子邮件等。
-
协议的比较与区别
协议 | UDP | TCP |
---|---|---|
连接类型 | 无连接 | 面向连接 |
可靠性 | 不可靠,不保证数据到达 | 可靠,保证数据按序到达 |
速度 | 较快,无连接开销 | 较慢,有连接和确认开销 |
头部开销 | 较小,8字节 | 较大,通常20-60字节 |
应用场景 | 实时性要求高的场景(如视频会议、在线游戏) | 数据可靠性要求高的场景(如文件传输、电子邮件) |
传输方式 | 以数据报为单位,无连接 | 以字节流为单位,面向连接 |
拥塞控制 | 无拥塞控制 | 有拥塞控制 |
协议的报文格式和字段含义
-
UDP 报文格式
-
首部:8字节,包含以下字段:
-
源端口:2字节,发送方的端口号。
-
目的端口:2字节,接收方的端口号。
-
长度:2字节,UDP用户数据报的总长度(包括首部和数据)。
-
校验和:2字节,用于检测UDP用户数据报在传输过程中是否有错误。
-
-
数据区:存放实际要传输的数据。
-
-
TCP 报文格式
-
首部:通常20-60字节,包含以下字段:
-
源端口:2字节,发送方的端口号。
-
目的端口:2字节,接收方的端口号。
-
序号:4字节,用于标识TCP报文段的顺序。
-
确认号:4字节,用于确认接收到的报文段。
-
首部长度:1字节,标识TCP首部的长度。
-
标志位:6位,用于控制TCP连接的状态(如SYN、ACK、FIN等)。
-
窗口大小:2字节,用于流量控制。
-
校验和:2字节,用于检测TCP报文段在传输过程中是否有错误。
-
紧急指针:2字节,用于紧急数据的传输。
-
-
数据区:存放实际要传输的数据。
-
协议的使用方式和编程示例
-
UDP 编程示例
Python复制
pythonimport socket # 创建UDP套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口 udp_socket.bind(('localhost', 12345)) # 发送数据 udp_socket.sendto(b'Hello, UDP!', ('localhost', 12346)) # 接收数据 data, addr = udp_socket.recvfrom(1024) print(f"Received from {addr}: {data.decode()}") # 关闭套接字 udp_socket.close()
-
TCP 编程示例
Python复制
pythonimport socket # 创建TCP套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定端口 tcp_socket.bind(('localhost', 12345)) # 监听连接 tcp_socket.listen(5) # 接受连接 conn, addr = tcp_socket.accept() print(f"Connected by {addr}") # 发送数据 conn.sendall(b'Hello, TCP!') # 接收数据 data = conn.recv(1024) print(f"Received from {addr}: {data.decode()}") # 关闭连接 conn.close() tcp_socket.close()