《计算机网络》课程实验报告 - 图文 下载本文

内容发布更新时间 : 2024/4/27 15:38:47星期一 下面是文章的全部内容请认真阅读。

3.TCP的三次握手过程

4. TCP重传

主机报文重传是TCP最基本的错误恢复功能,它的目的是防止报文丢失。 报文丢失的可能因素有很多种,包括应用故障,路由设备过载,或暂时的服务宕机。报文级别速度是很高的,而通常报文丢失是暂时的,因此TCP能够发现和恢复报文丢失显得尤为重要。

决定报文是否有必要重传的主要机制是重传计时器(retransmission timer),它的主要功能是维护重传超时(RTO)值。当报文使用TCP传输时,重传计时器启动,收到ACK时计时器停止。报文发送至接收到ACK的时间称为往返时间(RTT)。对若干次时间取平均值,该值用于确定最终RTO值。在最终RTO值确定之前,确定每一次报文传输是否有丢包发生使用重传计时器,下图说明了TCP重传过程。

当报文发送之后,但接收方尚未发送TCP ACK报文,发送方假设源报文丢失并将其重传。重传之后,RTO值加倍;如果在2倍RTO值到达之前还是没有收到ACK报文,就再次重传。如果仍然没有收到ACK,那么RTO值再次加倍。如此持续下去,每次重传RTO都翻倍,直到收到ACK报文或发送方达到配置的

- 34 -

最大重传次数。

最大重传次数取决于发送操作系统的配置值。默认情况下,Windows主机默认重传5次。大多数Linux系统默认最大15次。两种操作系统都可配置。

实验步骤:

1、TCP介绍 (1)连接建立:

打开wireshark, 打开浏览器输入 http://www.cuit.edu.cn,然后关闭浏览器,在wireshark filter中输入:tcp.stream eq 5,得到与浏览器打开网站相关的数据包。

从上图中可以看到wireshark截获到了三次握手的三个数据分组。第四个分组是HTTP的,这说明HTTP是使用TCP建立连接的。

分组34是没有数据的TCP报文段,首部SYN位设置为1。因此,第一条报文常被称为SYN分组。这个报文段里的序号可以设置成任何值,表示后续报文设定的起始编号。连接不能自动从1开始计数,选择一个随机数开始计数可避免将以前连接的分组错误地解释为当前连接的分组。观察分组34,Wireshark显示的序号是0。选择分组首部的序号字段,原始框中显示“65 f1 9a 38”。Wireshark显示的是逻辑序号,真正的初始序号不是0。如下图所示:

- 35 -

SYN分组通常是从客户端发送到服务器。这个报文段请求建立连接。一旦成功建立了连接,服务器进程必须已经在监听SYN分组所指示的IP地址和端口号。如果没有建立连接,SYN分组将不会应答。如果第一个分组丢失,客户端通常会发送若干SYN分组,否则客户端将会停止并报告一个错误给应用程序。

如果服务器进程正在监听并接收到来的连接请求,它将以一个报文段进行相应,这个报文段的SYN位和ACK位都置为1。通常称这个报文段为SYNACK分组。SYNACK分组在确认收到SYN分组的同时发出一个初始的数据流序号给客户端。

分组40的确认号字段在Wireshark的协议框中显示1,并且在原始框中的值是“65 f1 9a 39”(比“65 f1 9a 38”多1)。这解释了TCP的确认模式。TCP接收端确认第X个字节已经收到,并通过设置确认号为X+1来表明期望收到下一个字节号。分组40的序号字段在Wireshark的协议显示为0,但在原始框中的实际值却是“65 f1 9a 39”。这表明TCP连接的双方会选择数据流中字节的起始编号。所有初始序号逻辑上都视同为序号0。

- 36 -

最后,客户端发送带有标志ACK的TCP报文段,而不是带SYN的报文段来完成三次握手的过程,这个报文段将确认服务器发送的SYNACK分组,并检查TCP连接的两端是否正确打开合运行。此时,序号字段为1,确认号字段为1,在原始框中的值是“65 f1 9a 39”。

(2)关闭连接

当两端交换带有FIN标志的TCP报文段并且每一端都确认另一端发送的FIN包时,TCP连接将会关闭。FIN位字面上的意思是连接一方再也没有更多新的数据发送。然而,那些重传的数据会被传送,直到接收端确认所有的信息,见上图中的分组123,124,126。

2、TCP重传

当一个TCP发送端传输一个报文段的同时也设置了一个重传计时器。当确认到达时,这个计时器就自动取消。如果在数据的确认信息到达之前这个计时器超时,那么数据就会重传。

重传计时器能够自动灵活设置。最初TCP是基于初始的SYN和SYN ACK之间的时间来设置重传计时器的。它基于这个值多次设置重传计时器来避免不必要的重传。在整个TCP连接中,TCP都会注意每个报文段的发送和接到相应的

- 37 -

确认所经历的时间。TCP在重传数据之前不会总是等待一个重传计算器超时。TCP也会把一系列重复确认的分组当作是数据丢失的征兆。

打开两个Wireshark应用,选择file->open, 分别打开文件pcattcp_retrans_t.cap和pcattcp_retrans_r.cap,对所俘获的分组进行分析如下:

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号字节的传输。但是他们确实被传输送了,只是在发送端和

- 38 -