注意: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算法就可以了。
本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Servers/zs/