1、wireshark介绍
(1)、使用wireshark打开一个pcap文件时,可以讲time改变成实际时间
(2)、数据过滤
<1>、点击表头即可按照此条件排序(默认按照No.排序)
<2>、使用过滤器
使用Ctrl + F 快捷键,选择字符串,即可搜索
(3)、一些小tips
<1>、左侧实线表示一次会话的不同阶段
<2>、√ 表示对应的请求/响应
<3>、数据包大致结构
链路层
网络层
传输层
<4>、左侧小圆点,表示属于同一次请求。在 Transmission Control Protocol 中
一个完整的rtp包如下
<5>、TCP的时间戳由四部分构成:类别(kind)、长度(Length)、发送方时间戳(TS value):表示当前frame的时间戳、回显时间戳(TS Echo Reply):表示期望接收方响应frame的时间戳。时间戳选项类别(kind)的值等于 8,用来与其它类型的选项区分。长度(length)等于 10。两个时间戳相关的选项都是 4 字节。
是否使用时间戳选项是在三次握手里面的 SYN 报文里面确定的。那么这个时间戳选项有什么作用吗?主要有两个作用:
- 两端往返时延测量(RTT)
在真实的网络中,各种丢包情况普遍存在,因此有一套超时重传机制。而通过TSval和TSecr值来设置timeout。
- 序列号回绕(PAWS)
TCP 的序列号用 32bit 来表示,因此在 2^32 字节的数据传输后序列号就会溢出回绕。TCP 的窗口经过窗口缩放可以最高到 2^30,也就是1G,在高速网络中,序列号在很短的时间内就会被重复使用。
如果有 Timestamps 的存在,内核会维护一个为每个连接维护一个 ts_recent 值,记录最后一次通信的的 timestamps 值,当收到的数据包中 timestamps 值小于 ts_recent 值,就会丢弃掉这个数据包。等收到的数据包的timestamps 值大于 ts_recent,这个包可以被正常接收。
实际上timestamps 值是一个单调递增的值, 这个选项不要求两台主机进行时钟同步 。两端 timestamps 值增加的间隔也可能步调不一致,比如一条主机以每 1ms 加一的方式递增,另外一条主机可以以每 200ms 加一的方式递增。 此外, timestamps 是一个双向的选项,如果只要有一方不开启,双方都将停用。 在Linux下可以通过下面方式开启或关闭timestamp功能。
//0表示关闭,1表示打开功能cat /proc/sys/net/ipv4/tcp_timestamps
2、使用wireshark分析TCP三次握手和四次挥手过程
三次握手
三次握手过程:
-
首先客户端发送一个SYN包给服务器(SYN=1,Seq为主机选择的这个连接的初始序号),然后等待应答。
-
服务器端收到SYN包,回应给客户端一个ACK =x+1、SYN=1的TCP数据段(ACK表示确认序号有效,即收到上一个包,这里加1并不是ACK的值加1,ACK是一个标志位,这里会变成1,而x+1则是希望收到的下一个包的序列号,这个值放在包的确认序列号字段中,而只有ACK=1时,确认序列号才有效)。
3、客户必须再次回应服务器端一个ACK确认数据段(这里的Seq为x+1)。
四次挥手
四次挥手过程:
第一次挥手:客户端 发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接,并进入FIN_WAIT_1状态(不能再发送数据到服务端,但能够发送控制信息ACK到服务端)。
第二次挥手:服务端收到FIN后,知道不会再有数据从客户端传来,发送ACK进行确认,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。
第三次挥手:服务端发送FIN给对方,表示自己没有数据要发送了,服务端进入LAST_ACK状态,然后直接断开TCP会话的连接,释放相应的资源。
第四次挥手:客户端收到了服务端对FIN的ACK后,进入FIN_WAIT2状态(等待服务端完成资源释放的一系列工作:然后释放你为创建这个连接所分配的资源,并通知我你关闭了); 客户端收到了服务端的FIN信令后,进入TIMED_WAIT状态,并发送ACK确认消息。客户端在TIMED_WAIT状态下,等待2MSL一段时间,没有数据到来的,就认为对面已经收到了自己发送的ACK并正确关闭了进入CLOSE状态,自己也断开了到服务端的TCP连接,释放所有资源。当服务端收到客户端的ACK回应后,会进入CLOSE状态,并关闭本端的会话接口,释放相应资源。TIME_WAIT状态持续2MSL(MSL是数据分节在网络中存活的最长时间)。
网络上比较主流的文章都说关闭TCP会话是四次挥手,但是实际上为了提高效率通常使用三次挥手或两次挥手
三次挥手
不是每一次发送数据包都能对应收到一个 ACK 确认包,因为接收方可以合并确认。
而这个合并确认,放在四次挥手里,可以把第二次挥手、第三次挥手,以及他们之间的数据传输都合并在一起发送。因此也就出现了三次挥手。
两次挥手
在rtsp断开连接的时候,会出现两次挥手
3、使用wireshark分析rtsp数据包传输过程
-
3次握手成功后,发送OPINIONS请求及响应如下
-
DESCRIBE
-
SETUP
-
PLAY
-
之后开始传递RTP数据包
异常报文:
-
[TCP Dup ACK xxx#x] :表示第几次重新请求某一个包, XXX表示第几个包(不是Seq), X表示第几次请求。
丢包或者乱序的情况下,会出现该标志。 下图中163行第0次请求103807的包,重复请求了6次
-
[TCP Fast Retransmission] (快速重传)
TCP协议规定,当接收方收到乱序片段的时候,需要重复发送ACK。比如接收到乱序片段9的时候,接收方需要回复ACK。回复号为8
(7+1)。此后接收方如果继续收到乱序片段(序号不是8的片段),将再次重复发送ACK=8。当发送方收到3个ACK=8的回复时,发送方推断片段8丢失。即使此时片段8的计时器还没有超时,发送方会打断计时,直接重新发送片段8,这就是快速重新发送机制(fast-retransmission)。
-
[TCP Retransmission] (超时重传)
超时重传,如果一个包的丢了,又没有后续包可以在接收方触发[Dup Ack],或者**[Dup
Ack]也丢失**的情况下,TCP会触发超时重传机制。
-
[TCP Out-Of-Order] (报文乱序)
[TCP Out-Of-Order]指的是TCP发送端传输过程中报文乱序了。
-
[TCP Previous segment not captured]
在TCP发送端传输过程中,该Seq前的报文缺失了。一般在网络拥塞的情况下,造成TCP报文乱序、丢包时,会出现该标志。
需要注意的是,[TCP Previous segment not
captured]解析文字是wireshark添加的标记,并非TCP报文内容。 -
[TCP ZeroWindow]
作为接收方发出现的标志,表示接收缓冲区已经满了,此时发送方不能再发送数据,一般会做流控调整。接收窗口,也就是接收缓冲区win=xxx
,告诉对方接收窗口大小。 传输过程中,接收方TCP窗口满了,win=0,wireshark会打上[TCP ZeroWindow]标签。
-
[TCP window update] 接收方消耗缓冲数据后,更新TCP窗口,
可以看到从win=0逐渐变大,这时**wireshark会打上[TCP window update]**标签
-
[TCP window Full]
作为发送方的标识,当前发送包的大小已经超过了接收端窗口大小,wireshark会打上此标识,标识不能在发送。