(2)关闭连接
当两端交换带有FIN标志的TCP报文段并且每一端都确认另一端发送的FIN包时,TCP连接将会关闭。FIN位字面上的意思是连接一方再也没有更多新的数据发送。然而,那些重传的数据会被传送,直到接收端确认所有的信息。在tcp_pcattcp_n1.cap中,通过分组13至16我们可以看到TCP连接被关闭。
2、TCP重传
当一个TCP发送端传输一个报文段的同时也设置了一个重传计时器。当确认到达时,这个计时器就自动取消。如果在数据的确认信息到达之前这个计时器超时,那么数据就会重传。
重传计时器能够自动灵活设置。最初TCP是基于初始的SYN和SYN ACK之间的时间来设置重传计时器的。它基于这个值多次设置重传计时器来避免不必要的重传。在整个TCP连接中,TCP都会注意每个报文段的发送和接到相应的确认所经历的时间。TCP在重传数据之前不会总是等待一个重传计算器超时。TCP也会把一系列重复确认的分组当作是数据丢失的征兆。
在Wireshark中选择file-〉open,打开文件pcattcp_retrans_t.cap和pcattcp_retrans_r.cap,对所俘获的分组进行分析如下:
(1) SACK选项协商
在上面的每次跟踪中,我们能观察建立连接的三次握手。在SYN分组中,发送端在TCP的首部选项中通过包括SACK permitted选项来希望使用TCP SACK。在SYN ACK包中接收端表示愿意使用SACK。这样双方都同意接收选择性确认信息。SACK选项如图2所示:
26
图2 SACK选项
在TCP SACK选项中,如果连接的一端接收了失序数据,它将使用选项区字段来发送关于失序数据起始和结束的信息。这样允许发送端仅仅重传丢失的数据。TCP接收端不能传递它们接收到的失序数据给处于等待状态的应用程序,因为它总是传递有序数据。因此,接收到的失序数据要么被丢掉,要么被存储起来。
接收端的存储空间是有限的,TCP发送端必须保存一份已发送的数据的副本,以防止数据需要重发。发送端必须保存数据直到它们收到数据的确认信息为止。
接收端通常会分配一个固定大小的缓冲区来存储这些失序数据和需要等待一个应用程序读取的数据。如果缓冲区空间不能容纳下更多数据,那么接收端只有将数据丢弃,即使它是成功到达的。接收端的通知窗口字段用来通知发送端还有多少空间可以用于输入数据。如果数据发送的速度快于应用程序处理数据的速度,接收端就会发送一些信息来告知发送端其接收窗口正在减小。在这个跟踪文件中,接收端通知窗口的大小是变化的,从16520个字节到17520个字节。
TCP发送端在发送之前有一个容纳数据的有限空间。然而,和接收端不同的是,发送端是限制自己的发送速率。如果缓冲区的空间满了,尝试写入更多数据的应用程序将被阻塞直到有更多的空间可以利用为止。
(2)分组的丢失与重传
用显示过滤器tcp.analysis.retransmission搜索重传。在pcattcp_retrans_t.cap中应用
27
该过滤器,在这个跟踪文件中,我们看见分组12是这9次重传的第一次。如图所示3:
图3 pcattcp_retrans_t.cap中9次重传
通过观察分组12的细节,我们发现序号是1001,我们发现分组5也有同样的序号。有趣的是,分组5是对1001到2460号字节的传输,而分组12却是对1001到2000号字节的重传。分组20是对2001到2460号字节的重传。
分组4是对1到1000号字节的传输,分组5是对1001到2460号字节的传输,分组7是对2461到3920号字节的传输。
我们已检查了发送端上获取的所有跟踪记录。我们从接收端的角度来看同一个连接,我们会发现有些不同。在pcattcp_retrans_r.cap中,我们发现1到1000号字节是在分组4里被传送的,而2461到3920号字节是在分组6(而不是分组7)中被传送的。在这个跟踪文件中,分组5是1到1000号字节的确认。我们没有看到1001到2460号字节的传输。但是他们确实被传输送了,只是在发送端和接收端的某个环节丢失了。
现在我们来看接收端是如何处理这些丢失字节的。在分组4达到以后,接收端会以确认号1001(分组5)作为响应。在分组6的2461到3920号字节达到之后,接收端仍然以确认号1001(分组7)作为响应。即使它接到的是附加数据,确认号仍然是它期望收到的下一个有序字节的序号。同样在含有3921到5381号字节的分组8到达之后,接
28
收端仍然以1001响应。
最后,1001到2000号字节被重传。在这两次跟踪中,我们都在分组12里看到这种情况。于是接收端增加它的确认号到2001。
最终2001到2460号字节被重传。在这次重传之后,接收端可以立即从确认字节2001跳到确认字节11221。 四、实验报告内容
在实验的基础上,回答以下问题: 1、
客户服务器之间用于初始化TCP连接的TCP SYN报文段的序号(sequence
number)是多少?在该报文段中,是用什么来标识该报文段是SYN报文段的?
2、
服务器向客户端发送的SYNACK报文段序号是多少?该报文段中,
ACKnowledgement字段的值是多少?
3、
找出pcattcp_retrans_t.cap中所有在到达接收端之前丢失的分组。对于每个丢
失的报文段,找出重传分组(提示:找出第一个丢失的字节和重传它们的分组).
4、
当接收端发送一个TCP报文段来确认收到的数据时,这个报文段也可能丢
失。在pcattcp_retrans_t.cap和pcattcp_retrans_r.cap中存在这样的丢失吗?你是怎么得到这样的答案的?
29
实验六 使用Wireshark分析UDP
一、实验目的
比较TCP和UDP协议的不同 二、实验环境
与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。 三、实验步骤
1、打开两次TCP流的有关跟踪记录,保存在tcp_2transmit.cap中,并打开两次UDP流中的有关跟踪文件udp_2transmit.cap 。如图所示:
图1 TCP 流跟踪记录
30