简介
本文主要基于wireshark工具对tcp报文进行分析,带着读者一步一步分析客户端与服务端之间的每一条报文的作用及上下报文之间的关系,有利于开发者在实际工作中快速定位报文丢失的原因,有效提高工作效率。
1 tcp报文分vlan与vxlan报文
vlan报文格式:
vxlan报文格式:
2 关于tcp报文中各种字段含义及作用
详见:网络工程师必学知识:TCP抓包分析Seq、SYN、ACK的变化过程
2.1 握手阶段报文分析
上面三行分别对应三次握手的报文,其中client端为192.168.0.197,server端为100.82.13.121,
-
第一行:197client端发送一个连接请求的报文,其中
- SYN为1,表示握手请求阶段
- Seq的值一般为0,一般表示同一条流(同一个五元组)发送端共发送了多少长度的数据,它的的值,会随着报文的交互,不断增长:Seq = Seq + Len
- ACK为0
- Win=64240表示本端的滑动窗口剩余大小为64240;
- LEN=0,表示报文中数据部分的长度,这里为0表示不带数据。
- MSS表示最大报文大小选择,表示每一个分片报文中的数据
- TSval: 发送时间戳
- TSecr:应答时间戳,当前要发送的包应答的那个包的发送时间戳,因为是第一个包,应答的时间戳为 0。
-
第二行为121server端发送的连接请求应答的报文,其中
- SYN为1,表示同意tcp建立连接,
- Seq的值一般为0
- ACK为1,= 上一条的Seq + 1
-
第三行为197client端发送的确认应答包,用来再次告诉server端,这次我是真的要连接tcp连接了,你收到后无需再回报文。
2.2 发送阶段报文分析
由于tcp是可靠性连接,具有滑动窗口,报文重发,确认应答机制,故client与server报文交互阶段产生不同类型的报文
- [TCP segment of a reassembled PUD]
用来表示应用层一次性发送了大量的数据,在tcp层需要进行分片发送,其中59号报文表示接收端对58号(Seq + Len = 137384 + 1432 = 138816)及之前发送端发送的所有的报文的确认应答,表示你发送的第ACK=138816个字节的报文我都收到了,你可以放心了,
同样61号号报文表示接收端对60号及之前发送端发送的所有的报文的确认应答,我都收到了,你可以放心了, - [TCP Dup ACK]
TCP Dup ACK 表示发送方发送了数据,在一定时间内,期望收到接受方回的ACK报文,但是可能由于接收方本地处理慢或者网络时延等问题,导致发送方在RTO时间内没收到ACK报文而又重新发送给了之前的数据给发送方,触发接收端收到了两份重复的报文从而触发接收方发送TCP Dup ACK报文给发送方 - [TCP Window Full],[TCP ZeroWindow]与[TCP Window Update]
TCP Window Full]表示告诉对方 我本地发送端数据刚好达到你的的滑动窗口剩余大小
TCP ZeroWindow表示我的滑动窗口满了,你先别发送,等我处理完了会通过 [TCP Window Update]通知你,你再发送数据
TCP Window Update表示的滑动窗口剩余大小跟新了
其余详见:
https://zhuanlan.zhihu.com/p/7194737103
2.3 挥手阶段报文分析
这里只抓到三次挥手
- 第一次挥手
客户端发送FIN报文表示需要断开连接 - 第二次挥手
server端发送FIN报文表示同意断开连接,猜测这次挥手实际可能包含两次挥手,一次为第一次ACK回复,一次为向客户端发送FIN报文 - 第三次挥手
client发送ACK报文,表示正式断开连接