wireshark 分析 TCP 请求(转)
转自:http://supben.iteye.com/blog/2329780
先看一段代码 程序片段是一个RPC调用 ,根据简历id获取简历实体。
本地IP 10.252.156.132, 远程ip 10.126.83.105
- public static void main(String[] args) {
- long id = 94105403661579l;
- try {
- Resume r = resumeService.loadByID(id);
- PrintUtil.printObject(r);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
通过wireshark 抓包,得到下边的结果
直接上结论
1).Source 发送方IP ,Destination 接收方IP,Protocol 协议类型 Length 包长度 Info 包内容
2). 前三帧是三次握手,
第四帧客户端把方法调用(包括参数)发送到服务端。包长139,
第五帧,服务端应答。
第六帧,服务端传输结果给客户端。长度952,
第七帧,客户端应答,
第八帧:服务端重传,
第九帧:客户端重答。
第十帧:客户端强行关闭,客户端通知服务端RST。
3).Info栏 49999 → 17019 表示了 发送者和接受者的端口
4). FLAGS 常见的有5种类型,分别是
SYN 表示建立连接,
FIN 表示关闭连接,
ACK 表示响应,
PSH 表示有 DATA数据传输,
RST 表示连接重置
5)Seq= 上一次的Ack, Ack = 上一次的Seq+ Len,如 4 5两帧,6 7两帧
6)第六帧,服务端发送的时间点 17:25:16.790782,而客户端相应ACK的发送时间为17:25:16.991076,
超过了200ms,大于RTO的时间,触发了TCP Retransmission (TCP重传),即第8帧
7)服务端收到客户端的调用,是先回了一个ACK包,然后再在新的一帧传输返回数据。而不是理解的直接回复返回值。
8) 注意看 4,5,6 三帧 客户端发起调用,服务端回ACK,服务端返回查询结果。 三次请求Seq的值是一样的,可见Seq并不是调用一次升级一次。而是有点类似于回合的概念。一个回合升级一次
9 ) 笔者第10帧的时候是ctrl+c直接关闭的客户端。 如果友好断开的话,会经过TCP 4次挥手关闭。最后Info体里应该会有FIN标识。 有兴趣的同学可以自测下。
10) INFO包体里的 WIN, MSS,WS,SACK_PERM 等都是优化网络性能很重要的参数。此处不表。