tcp校验和计算校验和例子_电脑网络知识:传输控制协议(TCP)的学习

一、TCP协议简介

TCP(传输控制协议)协议是TCP/IP协议族中的面向连接的、可靠的传输层协议。TCP与UDP不同,它允许发送和接收字节流形式的数据。为了使服务器和客户端以不同的速度发送和接收数据,TCP提供了发送和接收两个缓冲区。TCP提供全双工服务,数据同时能双向流动。通信的每一方都有发送和接收两个缓冲区,可以双向发送数据。TCP在报文中加上一个递增的确认序列号来告诉发送端,接收端期望收到的下一个报文,如果在规定时间内,没有收到关于这个包的确认响应,则重新发送此包,这保证了TCP是一种可靠的传输层协议。

TCP的常用熟知端口如下表所示:

表7-1 TCP常用熟知端口

3d6116faffc547dfbcfec5191b18bff2

二、TCP报文格式

TCP报文的格式如下图所示:

f8da12dba4074040a673def796351e90

图7-1 TCP报文格式

TCP报文包括20~60字节的首部,接着是应用程序的数据部分。首部在没有选项时是20字节,而当有选项时长度会增加,但是最大不会超过60字节。 ● 源端口:该字段定义了在主机中发送这个报文的应用程序端口号。

● 目的端口:该字段定义了数据报发往的主机中接收这个报文的应用程序的端口号。

● 序列号:该字段定义了指派给本报文第一个数据字节的一个序号。TCP是流式传输协议,为了保证连通性,要在发送的每一个字节上编号。序号指定了这个序列中的哪一个字节是报文的第一个字节。在连接建立时,双方使用随机数产生器产生初始序号,通常每一方的初始序号都是不同的。

● 确认号:该字段定义了报文的接收端期望从对方接收的序号。如果报文的接收端成功地接收了对方发来的序号为x的报文,它就把确认号定义为x+1。确认可以和数据一起发送。

● 首部长度:该字段指定TCP首部的长度,以4字节为单位。首部长度可以在20~60字节之间。因此,这个字段的值可以在5至15之间。

● 保留:这是6位字段,保留为今后使用。

● 控制:这个字段定义了8种不同的标志。如下图所示。在同一时间可设置一位或多位标志。

a3f2cc87f9884458b1410f89fe9ecb19

图7-2 控制字段

这些标志用在TCP的流量控制、连接建立和终止以及数据传送的方式等方面。下表给出了每一位的简要说明。

表7-2 TCP标志位

a05425e6b2ea4d8b96ca7c0bd0d27551

● 窗口大小:该字段定义对方必须维持的窗口值(以字节为单位)。这个字段的长度是16位,因此窗口值的最大长度是65535字节。这个值通常是作为接收窗口,并由接收端来确定。这时,发送端必须服从接收端的决定。

● 校验和:该字段的校验范围包括伪首部、TCP首部和TCP数据部分。

● 紧急指针:只有当紧急标志置位时,这个16位字段才有效,这时的报文中包括紧急数据。

● 选项:在TCP首部中可以有多达40字节的可选信息。三、TCP封装 TCP报文封装在IP数据报中,然后再封装成数据链路层中的帧,如下图所示:

832d441e3a3f46a9ac43498df99bd9d8

图7-3 TCP封装

四、TCP校验和

TCP的校验和与UDP的校验和计算过程是一样的。但是,UDP是否使用校验和是可选的,而TCP是否使用校验和则是强制性的。在计算TCP校验和时也要在报文上添加伪首部。对于TCP的伪首部,高层协议类型字段的值是6。如下图所示:

e75631b0aaa34e86b7b2801c8f177b42

图7-4 伪首部加到TCP报文上

五、TCP连接建立与释放

1.连接建立

TCP以全双工方式传送数据。当两个进程建立了TCP连接后,它们能够同时向对方发送数据。在传送数据之前,双方都要对通信进行初始化,得到对方的认可。

2.三次握手(动画演示)

TCP的连接建立过程叫做三次握手。服务器程序首先准备好接受TCP连接,这个过程叫做被动打开请求。这时,服务器的TCP就已准备好接受任何一台主机的TCP连接了。

客户程序发出TCP连接请求的过程叫做主动打开。然后服务器与客户端就开始三次握手过程,如下图所示(在图中客户端与服务器端各使用一条时间线,并给出每个阶段的几个重要字段,包括序号、确认号、控制标志以及非零的窗口值)。这个过程有以下3个步骤。

f998e3944b594c5f84b8327230c1ad58

图7-5 使用三次握手的连接建立

(1)客户发送第一个报文,这是一个SYN报文,在这个报文中只有SYN标志置为1。这个报文的作用是使序号同步。 (2)服务器发送第二个报文,即SYN+ACK报文,其中SYN和ACK标志被置为1。这个报文有两个目的。首先,它是一个用来和对方进行通信的SYN报文。服务器使用这个报文同步初始序号,以便从服务器向客户发送字节。服务器还使用ACK标志确认已从客户端收到了SYN报文,同时给出期望从客户端收到的下一个序号。另外,服务器还定义了客户端要使用的接收窗口的大小。 (3)客户发送第三个报文。这仅仅是一个ACK报文。它使用ACK标志和确认号字段来确认收到了第二个报文。3.连接终止 通信双方中的任何一方都可以关闭连接。当一方的连接被终止时,另一方还可继续向对方发送数据。TCP的连接终止有两种方式:三次握手和具有半关闭的四次握手。4.三次握手方式终止连接 使用三次握手的TCP终止过程如下图所示:

e112588d0ae2404bb97d2dada5291682

图7-6 使用三次握手的连接终止

(1)当客户端想关闭TCP连接时,它发送一个TCP报文,把FIN标志位设置为1。 (2)服务器端在收到这个TCP报文后,把TCP连接即将关闭的消息发送给相应的进程,并发送第二个报文——FIN+ACK报文,以证实从客户端收到了FIN报文,同时也说明,另一个方向的连接也关闭了。 (3)客户端发送最后一个报文以证实从TCP服务器收到了FIN报文。这个报文包括确认号,它等于从服务器收到的FIN报文的序号加1。5.半关闭的四次握手方式终止连接 在TCP连接中,一方可以终止发送数据,但仍然保持接收数据,这就叫做半关闭。半关闭通常是由客户端发起的。图7-7描绘了半关闭的过程。客户发送FIN报文,半关闭了这个连接。服务器发送ACK报文接受这个半关闭。但是,服务器仍然可以发送数据。当服务器已经把所有处理的数据都发送完毕时,就发送FIN报文,客户端发送ACK报文给予确认。 在半关闭一条连接后,客户端仍然可以接收服务器发送的数据,而服务器也可以接收客户端发送的确认。但是,客户端不能传送数据给服务器。

六、流量控制

在发送端收到接收端的确认报文之前,流量控制可以对发送端发送的数据量进行管理。

在不考虑流量控制的情况下,传输层协议可以每次只发送一个字节的数据,然后在发送下一个字节数据之前等待接收端的确认报文。这是一个非常缓慢的过程,如果数据要走很长的距离,发送端就要在等待确认报文时一直处在空闲状态。还有一种情况是传输层协议一次就将全部数据发送出去,而不理会确认报文。这样虽然加速了发送过程,但可能会使接收端来不及接收而瘫痪。此外,若有一部分数据丢失、重复、失序或损坏,发送端就要一直等到接收端将全部数据都检查完毕后才能知道。 TCP的流量控制采用一种折中的方法。它在缓存上定义一个窗口。缓存是用来暂时存放将要发送的数据的。TCP发送数据的多少由这个窗口决定。

a4bc35560c324dbabf484cede1e8b761

图7-7 半关闭

1.滑动窗口协议 为了完成流量控制,TCP使用滑动窗口协议。窗口覆盖了缓存的一部分,在这个窗口中的数据是可以发送而不必考虑确认的。窗口有两个沿:一个在左边,另一个在右边。因为左沿和右沿都是可以滑动的,所以这个窗口叫做滑动窗口。如下图所示:

76e615b506b1435b883b3e38d18f0078

图7-8 滑动窗口

窗口有三种动作:展开、合拢或缩回。这三种动作受接收端的控制而不是发送端的控制。 展开窗口表示窗口的右沿向右移动,这样就可以从缓存中发送更多的数据。合拢窗口表示窗口的左沿向右移动,这表示某些数据已经被确认了,发送端可以不再担心它们。缩回窗口表示窗口的右沿向左移动,这在某些实现中是不允许的,因为这会使某些可以发送的数据变成不能发送的。如果发送端已经发送了这些字节,就会产生错误。窗口的左沿不能向左移动,因为这表示已经发送出去的并且经过确认的数据现在又要收回了。 窗口大小由接收窗口和拥塞窗口两者中的较小者决定。接收窗口大小由接收方发送的确认报文中的窗口大小字段值所确定。这是接收端在缓存溢出导致数据被丢弃之前所能接受的最大字节数。拥塞窗口大小是由网络根据拥塞情况而确定的。七、差错控制

TCP是可靠的传输层协议。应用程序把数据流交付给TCP后,就依靠TCP把整个数据流交付给接收端的应用程序,并且保证数据流是按序的、没有差错的、也没有任何一部分是丢失的或重复的。 TCP使用差错控制提供可靠性。差错控制包括以下的一些机制:检测受到损伤的报文、丢失的报文、失序的报文和重复的报文。差错控制还包括检测出差错后纠正差错的机制。TCP的差错检测和差错纠正是通过校验和、确认以及超时重传三种机制实现的。1.校验和 每一个TCP报文都包括校验和字段,用来检查报文是否损坏。若报文损坏,接收端就将报文丢弃,并认为这个报文丢失了。2.确认 TCP采用确认报文的方法来证实收到了数据报文。确认报文不携带数据,但消耗一个序号。除了ACK报文之外,确认报文也需要被确认。3.重传 差错控制的核心是报文的重传机制。当一个报文损坏、丢失或延迟时,就需要重传这个报文。有两种情况需要对报文进行重传:当重传超时计时器时间到期时,或当发送端收到了3个重复的确认报文时。 (1)重传超时计时器到期之后的重传 发送端为每一个TCP报文都设置一个重传超时计时器。若计时器时间到期时还没有收到对这个报文的确认报文,就认为这个报文丢失了,于是重传这个报文,即使可能由于报文延迟到达,或确认报文延迟到达,或确认报文丢失等原因。重传超时计时器的值是动态的,它根据报文的往返时间而更新。报文的往返时间是报文离开发送端到发送端收到此报文的确认报文所需的时间。 (2)三个重复的确认报文之后的重传 一个报文的丢失会导致接收端收到的报文失序,这时接收端会发送对丢失报文的确认报文,当发送端收到3个重复的确认报文之后,发送端立即重传这个报文,这叫做快重传。 对不消耗序号的报文不进行重传。对所有ACK报文都不进行重传。

【实验步骤】

练习1 察看TCP连接的建立和释放

各主机打开工具区的"拓扑验证工具",选择相应的网络结构,配置网卡后,进行拓扑验证,如果通过拓扑验证,关闭工具继续进行实验,如果没有通过,请检查网络连接。 本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。现仅以主机A、B为例,其它组的操作参考主机A、B的操作。1.主机B启动协议分析器捕获数据,并设置过滤条件(提取TCP协议)。2.主机A启动TCP工具连接主机B。

(1)主机A启动实验平台工具栏中的"地址本工具"。点击[主机扫描]按钮获取组内主机信息,选中主机B点击[端口扫描]按钮获取主机B的TCP端口列表。

(2)主机A启动实验平台工具栏中的"TCP工具"。选中"客户端"单选框,在"地址"文本框中填入主机B的IP地址,在"端口"文本框中填入主机B的一个TCP端口,点击[连接]按钮进行连接。

3.察看主机B捕获的数据,填写下表。

表7-3 实验结果

e163d3e49b724aa5b6fdbaa394fca6ec

● TCP连接建立时,前两个报文的首部都有一个"最大字段长度"字段,它的值是多少?作用是什么?结合IEEE802.3协议规定的以太网最大帧长度分析此数据是怎样得出的。

4.主机A断开与主机B的TCP连接。

5.察看主机B捕获的数据,填写下表。

表7-4 实验结果

ca3d8c563d1047389dd9e09816bb5956

● 结合步骤3、5所填的表,理解TCP的三次握手建立连接和四次握手的释放连接过程,理解序号、确认号等字段在TCP可靠连接中所起的作用。

【思考问题】

1.为什么在TCP连接过程中要使用三次握手?如不这样做可能会出现什么情况。2.解释TCP协议的释放过程?

练习2 利用协议编辑器编辑并发送TCP数据包

本练习每台主机为一组。现仅以主机A所在组为例,其他组的操作参考主机A所在组的操作。

在本实验中由于TCP连接有超时时间的限制,某些步骤(如计算TCP校验和)要求熟练、迅速。

为了实现TCP三次握手过程的仿真,发送第一个连接请求帧之前,编辑端主机应该使用TCP屏蔽功能来防止系统干扰(否则计算机系统的网络会对该请求帧的应答帧发出拒绝响应)。

通过手工编辑TCP数据包实验,要求理解实现TCP连接建立、数据传输以及断开连接的全过程。在编辑过程中注意体会TCP首部中的序列号和标志位的作用。

首先选择服务器主机上的一个进程作服务器进程,并向该服务器进程发送一个建立连接请求报文,对应答的确认报文和断开连接的报文也编辑发送。其步骤如下:

1.启动协议分析器捕获数据,设置过滤条件(提取HTTP协议)。2.启动协议编辑器,在界面初始状态下,程序会自动新建一个单帧,可以利用协议编辑器打开时默认的以太网帧进行编辑。3.填写该帧的以太网协议首部,其中: 源MAC地址:主机A的MAC地址 目的MAC地址:服务器的MAC地址 协议类型或数据长度:0800(IP协议)4.填写IP协议头信息,其中: 高层协议类型:6(上层协议为TCP) 总长度:40(IP首部 + TCP首部) 源IP地址:主机A的IP地址 目的IP地址:服务器的IP地址(172.16.0.253) 其它字段任意。 应用前面学到的知识计算IP首部校验和。5.填写TCP协议信息,其中: 源端口:任意大于1024的数,不要使用下拉列表中的端口 目的端口:80(HTTP协议) 序列号:选择一个序号ISN(假设1942589885),以后的数据都根据它来填写 确认号:0 首部长度:50(长度20字节) 标志位:02(标志SYN=1) 窗口大小:任意 紧急指针:0 使用协议编辑器的"手动计算"方法计算校验和;再使用协议编辑器的"自动计算"方法计算校验和。将两次计算结果相比较,若结果不一致,则重新计算。 ● TCP在计算校验和时包括哪些内容?6.将设置完成的数据帧复制3份。 修改第二帧的TCP 层的"标志"位为10(即标志位ACK=1),TCP层的"序列号"为1942589885+1。 修改第三帧的TCP层的"标志"位为11(即标志位ACK=1、FIN=1),TCP层的"序列号"为1942589885+1。 修改第四帧的TCP层的"标志"位为10(即标志位ACK=1),TCP层的"序列号"为1942589885+2。7.在发送该TCP连接请求之前,先ping一次目标服务器,让目标服务器知道自己的MAC地址。8.启动实验平台工具栏中的"启动屏蔽",为TCP/IP协议栈过滤掉收到的TCP数据。9.点击菜单栏中的[发送]按钮,在弹出对话框中选择发送第一帧。10.在主机上捕获相应的应答报文,这里要求同学及时准确地捕获应答报文并迅速从中获得应答报文的接收字节序列号。11.假设接收字节序号为:3246281765,修改第二帧和第三帧TCP层的"确认号"的值为:3246281766。12.计算第二帧的TCP校验和,将该帧发送。对服务器的应答报文进行确认。13.计算第三帧的TCP校验和,将该帧发送。14.在主机上观察应答报文,要及时把最后一帧"序列号"记录下来。15.修改第四帧的TCP层"确认号"为接收的序列号+1(即3246281767)。16.计算第四帧的TCP校验和,将该帧发送。断开连接,完成TCP连接的全过程。17.协议分析器端截获相应的请求及应答报文并分析,注意观察"会话分析"中的会话过程。18.启动实验平台工具栏中的"停止屏蔽",恢复正常网络功能。

【思考问题】

1.使用TCP协议对实时话音数据的传输有什么有缺点?使用UDP协议在传送数据文件时会有什么问题?

练习3 TCP的重传机制

本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。现仅以主机A、B所在组为例,其它组的操作参考主机A、B所在组的操作。

1.主机B上启动实验平台工具栏中的"TCP工具",作为服务端,监听端口设置为2483。2.主机B启动协议分析器开始捕获数据并设置过滤条件(提取TCP协议)。3.主机A启动TCP工具连接主机B。 (1)主机A启动"实验平台工具栏中的TCP工具"。 (2)选中"客户端"单选框。 (3)在"地址"文本框中填入主机B的IP地址。 (4)在"端口"文本框中填入主机B的TCP监听端口(2483)。 (5)点击[连接]按钮进行连接。4.主机A向主机B发送一条信息。5.主机B启动实验平台工具栏中的"启动TCP屏蔽",过滤掉接收到的TCP数据。6.主机A向主机B再发送一条信息。7.主机B刷新捕获显示,当发现"会话分析视图"中有两条以上超时重传报文后,启动"实验平台工具栏中的停止TCP屏蔽",恢复正常网络功能。8.主机A向主机B再发送一条信息,之后断开连接。9.主机B停止捕获数据。依据"会话分析视图"显示结果,绘制本练习的数据报交互图。

【思考问题】

1.根据实验,测试重传时间和重传次数。

2.TCP协议在进行流量控制时是以数据包丢失作为产生拥塞的标志。有没有不是因拥塞而引起的数据包丢失的情况?如有,请列举出三种情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值