【开端】记一次诡异的接口排查过程

2024-08-22 04:52

本文主要是介绍【开端】记一次诡异的接口排查过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、绪论

     最近碰到这么一个情况,接口请求超时。前提是两台服务器间的网络是畅通的,端口也是通,应用代码也是通。意思是在应用上,接口没有任何报错,能正常返回数据。客户端到服务端接口也能通,但是接收不到服务的数据。比较诡异的,如果报文比较短,客户端是可以收到返回数据。

现象:

本地windows系统网络去请求接口可以通

linux服务器网络去请求接口

前提是telnet是可以通

于是就开始抓包分析

linux 抓包命令:  sudo tcpdump -i eth0 port 19999

这个过程展示了两个IP地址(10.22.33.22 和 10.200.33.229)之间通过TCP协议在端口dnp-sec(非标准端口,可能是某个特定应用的自定义端口)上建立连接、交换数据、然后关闭连接的过程。不过,最后出现了RST(重置)包,这通常表示连接被异常终止。下面是对这个过程的详细解释:连接建立(三次握手):
SYN包(16:06:28.412328):10.22.33.22的40778端口向10.200.33.229的dnp-sec端口发送SYN包,请求建立连接。SYN包中包含了序列号(seq)3884995505,窗口大小(win)29200,以及其他TCP选项(如MSS、SACK支持、时间戳等)。
SYN-ACK包(16:06:28.420340):10.200.33.229的dnp-sec端口回应SYN-ACK包,确认收到SYN包,并发送自己的序列号(seq)325552826,同时确认对方的序列号(ack)为3884995506(即SYN包的序列号+1)。SYN-ACK包中也包含了窗口大小、TCP选项等信息。
ACK包(16:06:28.420359):10.22.33.22的40778端口发送ACK包,确认收到SYN-ACK包,完成三次握手,连接建立。
数据传输:
PSH包(16:06:28.420400):10.22.33.22的40778端口发送PSH包(尽管这里也使用了PUSH标志,但通常数据包的类型是通过长度和内容来判断的,而不是仅仅依赖标志位),携带了389字节的数据。
ACK包(16:06:28.428450):10.200.33.229的dnp-sec端口发送ACK包,确认收到数据。
PSH包(16:06:28.453221):10.200.33.229的dnp-sec端口也发送了数据(11字节),尽管这里也使用了PUSH标志,但实际上是普通的数据包。
ACK包(16:06:28.453229):10.22.33.22的40778端口发送ACK包,确认收到数据,并使用SACK选项确认接收到的数据段(尽管这里SACK的范围与确认的序列号不匹配,可能是个错误或特殊情况)。
连接保持:
在数据传输之后,双方继续发送ACK包以保持连接活跃,但没有新的数据传输。这些ACK包中包含了SACK选项,表明接收方已经确认接收到的数据段。
连接关闭:
FIN包(16:07:43.452938):10.200.33.229的dnp-sec端口发送FIN包,表示它已完成数据传输,准备关闭连接。
ACK包(16:07:43.452959):10.22.33.22的40778端口发送ACK包,确认收到FIN包,但此时它可能还在等待应用层完成某些操作,因此没有立即发送自己的FIN包。
连接异常终止:
在一段时间后(1分钟后),10.200.33.229的dnp-sec端口发送RST包(16:08:43.475557),异常终止连接。这可能是因为它认为连接已经超时或不再需要,或者是因为它接收到了无法识别的序列号等。RST包的发送通常会导致TCP连接立即关闭,且不会进行正常的四次挥手过程。
总结:这个过程展示了TCP连接的建立、数据传输、保持和异常终止。尽管在大多数情况下,TCP连接会通过正常的四次挥手过程来关闭,但在这个例子中,连接被RST包异常终止了。

发现tcp 第三次握手发送消息失败

这个过程展示了两个IP地址(10.22.33.22 和 10.200.33.229)之间通过TCP协议在端口dnp-sec(非标准端口,可能是某个特定应用的自定义端口)上建立连接、交换数据、然后关闭连接的过程。不过,最后出现了RST(重置)包,这通常表示连接被异常终止。下面是对这个过程的详细解释:

连接建立(三次握手):
SYN包(16:06:28.412328):10.22.33.22的40778端口向10.200.33.229的dnp-sec端口发送SYN包,请求建立连接。SYN包中包含了序列号(seq)3884995505,窗口大小(win)29200,以及其他TCP选项(如MSS、SACK支持、时间戳等)。
SYN-ACK包(16:06:28.420340):10.200.33.229的dnp-sec端口回应SYN-ACK包,确认收到SYN包,并发送自己的序列号(seq)325552826,同时确认对方的序列号(ack)为3884995506(即SYN包的序列号+1)。SYN-ACK包中也包含了窗口大小、TCP选项等信息。
ACK包(16:06:28.420359):10.22.33.22的40778端口发送ACK包,确认收到SYN-ACK包,完成三次握手,连接建立。
数据传输:
PSH包(16:06:28.420400):10.22.33.22的40778端口发送PSH包(尽管这里也使用了PUSH标志,但通常数据包的类型是通过长度和内容来判断的,而不是仅仅依赖标志位),携带了389字节的数据。
ACK包(16:06:28.428450):10.200.33.229的dnp-sec端口发送ACK包,确认收到数据。
PSH包(16:06:28.453221):10.200.33.229的dnp-sec端口也发送了数据(11字节),尽管这里也使用了PUSH标志,但实际上是普通的数据包。
ACK包(16:06:28.453229):10.22.33.22的40778端口发送ACK包,确认收到数据,并使用SACK选项确认接收到的数据段(尽管这里SACK的范围与确认的序列号不匹配,可能是个错误或特殊情况)。
连接保持:
在数据传输之后,双方继续发送ACK包以保持连接活跃,但没有新的数据传输。这些ACK包中包含了SACK选项,表明接收方已经确认接收到的数据段。
连接关闭:
FIN包(16:07:43.452938):10.200.33.229的dnp-sec端口发送FIN包,表示它已完成数据传输,准备关闭连接。
ACK包(16:07:43.452959):10.22.33.22的40778端口发送ACK包,确认收到FIN包,但此时它可能还在等待应用层完成某些操作,因此没有立即发送自己的FIN包。
连接异常终止:
在一段时间后(1分钟后),10.200.33.229的dnp-sec端口发送RST包(16:08:43.475557),异常终止连接。这可能是因为它认为连接已经超时或不再需要,或者是因为它接收到了无法识别的序列号等。RST包的发送通常会导致TCP连接立即关闭,且不会进行正常的四次挥手过程。
总结:这个过程展示了TCP连接的建立、数据传输、保持和异常终止。尽管在大多数情况下,TCP连接会通过正常的四次挥手过程来关闭,但在这个例子中,连接被RST包异常终止了。

既然是终止了,网上百度一大堆:说什么的都有,但是最终没有解决问题

 比较诡异的 同一个服务器 去请求同一个接口,数据报文短的能返回了

这就很诡异了,所以我猜测,长报文无法返回,需要网络排查哪里限制了第三次握手,服务端终止了客户端发送报文,并终端了链接

这篇关于【开端】记一次诡异的接口排查过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095290

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音