用Tcpdump定位服务器和客户端通信问题

注意:Tcpdump需要用root帐号登录

一、应用场景1

客户端发送过来的数据包,在服务器解开之后发现数据包不对?

[root@IED_224_42_sles10_64]~>tcpdump -i eth1 port 8029 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:03:06.125337 IP 10.18.124.47.4217 > 10.6.224.42.8029: P 651073194:651073233(39) ack 1685844515 win 64472
        0x0000:  4500 004f 056d 4000 3a06 caca 0a12 7c2f  E..O.m@.:.....|/
        0x0010:  0a06 e02a 1079 1f5d 26ce 96aa 647b f223  ...*.y.]&...d{.#
        0x0020:  5018 fbd8 51a5 0000 0027 0001 0000 0000  P...Q....'......
        0x0030:  0000 0000 0000 02bd 03ea 2540 0000 0000  ..........%@....
        0x0040:  0000 0000 0a40 4553 355a 4961 5969 5a    .....@ES5ZIaYiZ
11:03:06.125869 IP 10.6.224.42.8029 > 10.18.124.47.4217: . ack 39 win 1460
        0x0000:  4500 0028 b292 4000 4006 17cc 0a06 e02a  E..(..@.@......*
        0x0010:  0a12 7c2f 1f5d 1079 647b f223 26ce 96d1  ..|/.].yd{.#&...
        0x0020:  5010 05b4 f599 0000                      P.......
[Msg version="1"]:
    [m_stMsgHead]
        m_shMsgVersion=1
        m_uiTimeStamp_Low=0
        m_uiTimeStamp_High=0
        m_uiMsgID=ACCOUNT_CREATEROLE_REQUEST
        m_uiUin=65676608
        m_iFeedback=0
        m_uiBodyLength=0
        m_ucSKeyLength=0xa
        m_szSessionKey[10]=0x40 0x45 0x53 0x35 0x5a 0x49 0x61 0x59 0x69 0x5a
    [m_stMsgBody]
        [m_stAccountCreateRoleRequest]

可以看出这一行以下为客户端发给服务器的数据包,再根据上面的协议比对,很明显就可以看出客户端发送过来的包是有问题的,没有MsgBody部分内部。
11:03:06.125337 IP 10.18.124.47.4217 > 10.6.224.42.8029: P 651073194:651073233(39) ack 1685844515 win 64472


二、应用场景2

客户端发送登录请求,在服务器端却收到一个没有MsgBody部分内容的包?

命令同场景1,从tcpdump打印看出服务器确实收到了完整的数据包,但在服务器逻辑层收到的是空的MsgBody,很明显问题就在服务器接入层。

再到接入层定位,很快发现由于配置原因,接入层对客户端数据包验证不通过,问题就找到了。


三、应用场景3

在对时延非常高的场景中(ms级),服务器发的包,客户端未能及时收到?

或者客户端发送的包,服务器未能及时收到?

命令同场景1,从日志可以看出服务器确实没有按时发送,在服务器逻辑层打印时间,却是按时发送的,这就奇怪了?

进一步想想发送层,就想到了TCP延迟发送和延迟确认,Nagel算法,设置sock的no delay属性,关闭Nagel算法就可以了。

你可能感兴趣的:(用Tcpdump定位服务器和客户端通信问题)