TCP迷途

文章讨论了网络通信中迷途分组的问题,当路由器故障或链路中断导致数据包循环传输时,TCP通过TIME_WAIT状态来解决。在连接关闭后,主动关闭端会等待2MSL时间,确保所有可能的迷途分组得以清除,从而防止新连接受到旧连接的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迷途是指, 当数据传输途中的某个路由器崩溃或者某两个路由器之间的某条链路断开, 路由协议需要花费一段时间来找到另一条通路, 在这个过程中可能会出现从路由器A发送给路由器B的分组又经由B发送回A这种循环情况, 在这个过程中, 发送端可能因为超时而重传了分组, 而这时这个分组经由正确的路径到达了接收端, 又过了一会儿之前迷失在循环中的分组也到了接收端, 这个分组称为迷途重复分组或漫游重复分组

我们假设有这样一种情况, 我们在192.168.1.11主机的5555端口和192.168.1.12的6000端口上建立了连接, 然后我们关闭了这个连接, 紧接着我们又重新在相同的地址和端口上建立了连接, 这后一次连接成为前一次连接的化身, 如果在前一次连接断开前有了迷途现象, 并且迷途重复分组在这次连接中到达了, 那么这个问题不是会很严重吗?

TCP为了解决迷途问题, 用到了TIME_WAIT状态, 当建立连接的两方中某一方发起了断开连接的请求后, 在第三次挥手时, 主动关闭端进入TIME_WAIT状态, 这个状态会持续2MSL 的时间, 之所以是2MSL, 主要是某一方的分组最多存活MSL秒即被丢弃, 而另一方的应答也最多存活MSL秒, 这样经过2MSL秒之后, 迷途分组一定会消失, 这样只要保证在这段时间过后才在同一个端口和地址上建立连接, 就可以避免前一次连接的迷途分组在本次连接中出现

### Modbus TCP 响应报文格式及解析 #### 1. 基本结构 Modbus TCP 的响应报文由多个字段组成,这些字段共同定义了设备如何返回请求的数据。以下是其基本结构: - **事务处理标识符 (Transaction Identifier)** 长度为 2 字节,用于区分不同的通信会话。此字段通常在客户端发起请求时设置,在服务器端的响应中保持不变[^2]。 - **协议标识符 (Protocol Identifier)** 长度为 2 字节,固定值 `0x0000`,表示当前使用的协议是标准的 Modbus TCP 协议。 - **长度域 (Length Field)** 长度为 2 字节,指示后续数据部分的总字节数(不包括前面的 6 字节头部)。高位字节先传输。 - **单元标识符 (Unit Identifier)** 长度为 1 字节,指定目标从机地址或逻辑节点编号。如果未启用多播模式,则该值与请求中的相同。 - **功能码 (Function Code)** 长度为 1 字节,表明执行的操作类型。例如读线圈状态 (`0x01`) 或写单个寄存器 (`0x0F`) 等。正常情况下,响应的功能码与请求一致;但如果发生错误,则会被替换为对应的异常代码。 - **数据区域 (Data Field)** 可变长度,具体取决于所选功能码及其关联操作的结果集大小。对于某些查询而言可能为空白[]。 #### 2. 解析方法示例 下面提供了一个简单的 Python 函数来演示如何解析典型的 Modbus TCP 响应消息: ```python def parse_modbus_tcp_response(response_bytes): transaction_id = int.from_bytes(response_bytes[:2], byteorder='big') protocol_id = int.from_bytes(response_bytes[2:4], byteorder='big') length = int.from_bytes(response_bytes[4:6], byteorder='big') unit_id = response_bytes[6] function_code = response_bytes[7] data_start_index = 8 end_of_data = data_start_index + max(0, length - 1) parsed_result = { 'transaction_identifier': transaction_id, 'protocol_identifier': protocol_id, 'length_field': length, 'unit_identifier': unit_id, 'function_code': hex(function_code), 'data_payload': list(response_bytes[data_start_index:end_of_data]) } return parsed_result ``` 上述函数接受原始字节流作为输入参数,并按照既定顺序提取各个组成部分的信息。 #### 注意事项 当接收到非法命令或者无法完成预期动作时,服务器可能会发送带有特定错误标志的消息代替常规回复。此时,“功能码”字段将增加 0x80 并附加额外的一个字节用来描述具体的故障原因。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值