杭电计网实验4

实验目的:

•了解TCP报文段的结构;

•掌握TCP数据流追踪的方法;

•理解TCP三次握手的基本过程;

•理解TCP连接终止的基本过程;

•认识TCP重置;

•理解TCP可靠数据传输的基本原理。

实验环境说明:

Win10

  1. 查找资料了解TCP/IP的报文结构,如图1所示:

图1:IPv4数据包报文形式

其中:

TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。

TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。

序列号字段(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。

确认号字段(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。

数据偏移字段(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。

保留字段

保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。

标志位字段:

CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。

ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。

URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。

ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。

PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。

RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。

SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。

FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。

窗口大小字段(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。

TCP 校验和字段(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。

紧急指针字段(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。

紧急指针字段(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。

  1. 使用wireshark进行TCP数据流追踪,如图2,3所示:

图2.进行TCP数据流追踪

图3.弹出的TCP流

  1. 进行三次握手抓包,先过滤http,再进行追踪,得到结果。

第一次握手的抓包,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN_SENT 状态,等待服务器确认,如图4所示:

图4.第一次握手,客户端发送SYN到服务器,seq=0,syn=0

第二次握手的抓包,服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。服务器再向客户端发送一个 SYN 包建立连接的请求,此时服务器进入 SYN_RECV 状态,如图5所示:

图5.第二次握手,服务器回送SYN=0和ACK=1

第三次握手的抓包,客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入 ESTABLISHED 状态,完成 3 次握手,如图6所示。

图6.第三次握手,客户端发送确认ACK包,SYN=1,ACK=1

  1. 进行四次挥手实验:

第一次挥手的抓包,客户端向服务器端发送断开 TCP 连接请求的 [FIN,ACK] 报文,在报文中随机生成一个序列号 SEQ=x,表示要断开 TCP 连接,如图7所示。

图7:客户端向服务单发送FIN=1,第一次挥手

第二、三次挥手,当服务器端收到客户端发来的断开 TCP 连接的请求后,回复发送 ACK 报文,表示已经收到断开请求。回复时,随机生成一个序列号 SEQ=y。由于回复的是客户端发来的请求,所以在客户端请求序列号 SEQ=x的基础上加 1,得到 ACK=x+1;服务器端在回复完客户端的 TCP 断开请求后,不会马上进行 TCP 连接的断开。服务器端会先确认断开前,所有传输到客户端的数据是否已经传输完毕。确认数据传输完毕后才进行断开,向客户端发送 [FIN,ACK] 报文,设置字段值为 1。再次随机生成一个序列号 SEQ=z。由于还是对客户端发来的 TCP 断开请求序列号 SEQ=x 进行回复,因此 ACK 依然为 x+1,如图8所示。

图8.服务器回复报文ACK(第二与三挥手因为提高效率被合并了)

第四次挥手的抓包:服务器端在回复完客户端的 TCP 断开请求后,不会马上进行 TCP 连接的断开。服务器端会先确认断开前,所有传输到客户端的数据是否已经传输完毕。确认数据传输完毕后才进行断开,向客户端发送 [FIN,ACK] 报文,设置字段值为 1。再次随机生成一个序列号 SEQ=z。由于还是对客户端发来的 TCP 断开请求序列号 SEQ=x 进行回复,因此 ACK 依然为 x+1,如图9所示。

图9.客户端收到服务端确认结束所有数据传输

后的FIN报文,向服务器发出ACK确认报文

  1. 理解TCP重置:

TCP重置为立即断开TCP连接,释放连接占用的资源并使得系统可以再次使用这些资源,如客户端的端口号和服务端的fd(文件描述符)。

常见的Reset的场景如下:

    1.在三次握手建联之后,当一个网络传输包传输失败(没有接收到该包的ack包超时)时,会进行重传,并尝试等待一段时间ack包,当重传五次依然失败,就会reset该连接。这里的重传次数可以设置,默认为5。reset的原因是我们认为此时在两个网络节点间或希望发送ack包的节点上发生了问题,这也意味着本次连接变得不再有效。这里需要注意几点:重传指的是同一个包重传5次;重传的包之前的包传输不受影响;迟到的ack不会导致reset,迟到的包会在后续超时重传时成功被确认。

2.许多应用程序也会Reset连接,这些很难发现,如果我们排查了网络问题和TCP本身没有重置该连接,我们基本可以断定是应用程序重置了该连接。一个很常见的场景,我们会在应用上建立很多的短连接,这样的应用由于保持了太多的Time Wait State会导致端口资源被耗尽,所以这些等待的连接会被应用程序主动重置。但此时开发者应该明白Time Wait State存在的意义。我们可以通过查看应用中关于socket的代码或查看socket日志来确认是否是应用重置了连接。如果三次握手的连接正常关闭,应该是采用FIN包的四次握手。还有一些更为罕见的场景是端口被抢占,常出现在系统重启时不同应用抢占同一个端口来进行监听。

6.TCP可靠数据传输原理:

TCP协议规范和当前绝大多数TCP 协议实现代码均采用数据重传和数据确认应答机制来完成TCP 协议的可靠性数据传输。数据超时重传和数据应答机制的基本前提是对每个传输的字节进行编号,即我们通常所说的序列号。数据超时重传是发送端在某个数据包发送出去,在一段固定时间后如果没有收到对该数据包的确认应答,则(假定该数据包在传输过程中丢失)重新发送该数据包。而数据确认应答是指接收端在成功接收到一个有效数据包后,发送一个确认应答数据包给发送端主机,该确认应答数据包中所包含的应答序列号即指已接收到的数据中最后一个字节的序列号加1,加1 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。数据超时重传和数据确认应答以及对每个传输的字节分配序列号是TCP 协议提供可靠性数据传输的核心本质。

7.TCP重置

使用wireshark,抓取重置的包,打开专家信息栏,找到note栏中的Retransmission列表,如图10所示:

图10.专家信息中Retransmission列表

打开报文界面,观察具体内容,发现RST参数代替了FIN参数,如图11所示:

图11,重置报文的内容

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值