第三次实验报告:使用Packet Tracer分析TCP连接建立过程

0 个人信息

   姓名:雷坛春

  学号:201821121030

  班级:计算1811

1 实验目的

  • 使用路由器连接不同的网络
  • 使用命令行操作路由器
  • 通过抓取HTTP报文,分析TCP连接建立的过程

2 实验内容

使用Packet Tracer,正确配置网络参数,通过抓取HTTP数据包,分析TCP连接建立过程。

  • 建立网络拓扑结构
  • 配置参数
  • 抓包
  • 分析数据包

3. 实验报告

3.1 建立网络拓扑结构

网络拓扑图如下图所示:

 

3.2 配置参数

  • 客户端的IP地址为192.168.1.30
  • 服务端的IP地址为192.168.2.30

路由器参数配置

 

• Router>enable                   # 进入特权执行模式

• Router#config t       # 进入全局配置模式 

• R(config)#interface F0/0

• R(config-if)#ip address 192.168.1.1 255.255.255.0

• R(config-if)#no shutdown                               # 激活接口

• R(conf)# router rip

• R(conf)#version   2                                       # 使用rip 2版本

• R(conf)#network 192.168.1.0

• R(conf)#network 192.168.2.0                      # 指定网络

 

3.3 抓包,分析TCP连接建立过程

通过抓取HTTP数据包得到的TCP报文,完成如下事情:

(1)画出TCP连接建立示意图

如下图所示:

(2)分析序号和确认号的变化

  三次报文握手中客户端先向服务端发送连接请求报文,此时首部中的同步位SYN=1,同时选择一个初始序号seq=x,因为SYN报文段不能携带数据,但要消耗掉一个序号;Server端收到请求报文后,如果同意建立连接,则向PC端发送确认,确认报文段中,SYN和ACK都置为1,确认号ack=x+1,同时为自己选择一个初始序号seq=y,因为此报文段也不能携带数据,但要消耗掉一个序号;客户端收到服务端的确认后,需要再给服务端发送确认报文,其中,ACK=1,确认号ack=y+1,seq=x+1,因为ACK报文段可以携带数据,所以如果携带了数据就要消耗掉一个序号,若没有携带数据则下一数据报文段的序号仍然是seq=x+1。

(3)解答:为什么连接建立需要第三次握手

  这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。

  所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况。A发出连接请求,但因连接请求报文丟失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。

  现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。

  由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。

  采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。

4. 拓展 (不作要求,但属于加分项)

(1)分析TCP连接释放

TCP连接释放示意图:

 

为什么会跟课本不一样?

  课本上的连接释放过程,在客户端发出连接释放请求后,服务端又发送了一个确认报文,然后进入CLOSEWAIT(半关闭状态),等服务端没有数据要传送后才会发送连接释放报文给客户端。而本例中客户端发送了连接释放请求后,服务端就立刻发送连接释放响应,没有经过半关闭状态。

为什么连接释放需要四次握手?

  这是由于TCP的半关闭造成的。因为TCP连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接。

(2)通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题

  为什么TIME_WAIT状态必须等待2MSL的时间?

   第一,为了保证A发送的最后一个ACK报文能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。 
     第二,A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。

参考文章:

  https://blog.csdn.net/guyuealian/article/details/52535294

posted @ 2019-10-20 10:36  殇墨痕  阅读(198)  评论(0编辑  收藏  举报