vlambda博客
学习文章列表

从最近三个实际问题来看tcpdump抓包

      在实际开发中,我们经常会遇到一些疑难问题。以网络的客户端和服务端为例,经常出现客户端和服务端的现象矛盾,导致僵持不下,怎么确认和处理这类问题呢?

      之前碰到过很多类似问题,最后直接用tcpdump抓包解决。下面仅来说说最近工作中碰到的三个实际问题(截图数据已经脱敏)。


       场景一: 客户端A通过https API调用服务端B

      服务端B说:   我收到了你的请求,但你没有传file字段

      客户端A说:我明明传了file字段啊

      服务端B说:你没有传file字段,我的代码解析不出file字段

      客户端A说:这是我的log, 里面明明传了file字段啊

      服务端B说:你自己检查一下吧,别人调用我一直没问题     

      僵持.......

      


       场景二: 客户端A调用服务端B

      服务端B说:   我没有收到你的请求

      客户端A说:我发了请求啊

      服务端B说:你发错IP了吧?是环境串扰了吗?

      客户端A说:我调用的是正确的环境IP啊

      服务端B说:不会啊,我的log没有看到请求

      僵持......



      场景三:客户端A调用服务端B

      服务端B说:   我没有收到你的请求

      客户端A说:我发了请求啊

      服务端B说:我没有收到请求,log里面没有记录

      客户端A说:我发了啊,返回log里面都有记录

      服务端B说:不会,要不你再试一下

      客户端A说:我重新发了请求,你收到没?

      服务端B说:没有收到,我们服务很稳定呢

      僵持......



      在实际开发中,这种事情太多了,现象只是表象,还可能是假象,log也不一定可靠。



      针对问题一:

     由于是https API接口,如果直接tcpdump抓包,没法看到明文内容,可以向www.baidu.com发起http请求,同时用tcpdump抓包,从而证明客户端有传递file参数:

     最后,查到的问题是,服务端开发同学给的文档有问题,导致file字段在json中的层级不对,客户端A调整后,就OK了。



      针对问题二:

      直接tcpdump抓包,可以看到客户端A确实有发请求:

从最近三个实际问题来看tcpdump抓包

      最后发现,是服务端B漏了一个配置,导致在最开始入口处,服务端B就出错了,所以服务端B需要改。

      现在看来,当初服务端B说没有收到请求,这只是现象,不一定可靠。



      针对问题三:

     直接tcpdump抓包, 可以看到服务端B是有返回信息的:

      最后发现,是服务端B增加了一条规则,导致出错,所以服务端B需要修改。

      现在看来,当初服务端B一口咬定没有收到请求,这只是现象,不一定可靠。



      tcpdump抓包,超越了应用层的语言、框架、序列化协议和log,  所以它是靠谱且有说服力的。而log的说服力,就没那么强了,所以,很多时候双方各执一词。

      tcpdump的功能很强大,直接man tcpdump就能详细查到它的用法。除了tcpdump,  还有一些其它的抓包工具,也可以在不同场景结合使用。


      OK, 本文先说到这里,tcpdump用起来。