一实验目的
1.
掌握TCP协议的报文格式
2. 掌握TCP连接的建立和释放过程
3. 掌握TCP数据传输中编号与确认的过程
4. 掌握TCP协议校验和的计算方法
5. 理解TCP重传机制
二实验网络结构
IP地址分配规则为主机使用原有IP,保证所有主机在同一网段内
三实验原理
1. TCP报文格式
16位源端口号
16位目的端口号
32位序号
32位确认序号
4位首部长度
保留(6位)
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
16位窗口大小
16位校验和
16位紧急指针
选项
数据
2.
TCP连接的建立
TCP是面向连接的协议。
在面向连接的环境中,开始传输数据之前,在两个终端之间必须先建立一个连接。对于一个要建立的连接,通信双方必须用彼此的初始化序列号seq和来自对方成功传输确认的应答号ack(指明希望收到的下一个八位组的编号)来同步,习惯上将同步信号写为SYN,应答信号写为ACK。
整个同步的过程称为三次握手如图所示
3.
TCP连接的释放
对于一个已经建立的连接,TCP使用四次握手来结束通话(使用一个带有FIN附加标记的报文段)。
4.
TCP重传机制
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期,但还没有收到确认,就要重传这一报文段。
四实验内容
按照拓扑结构图连接网络,使用拓扑验证检查连接的正确性。
练习一:察看TCP连接的建立和释放
1.主机B、C、D启动协议分析器进行数据捕获,并设置过滤条件(提取TCP协议)。
2.主机A启动仿真编辑器,进入TCP连接视图。在“服务器信息/IP地址”中填入主机C的IP地址;使用“端口扫描”获取主机C的TCP端口列表,在“服务器信息/端口”中填入主机C的一个TCP端口(大于1024);点击“连接”按钮进行连接。
3.察看主机B、C、D、捕获的数据。
4.主机A断开与主机C的TCP连接。
5.察看主机B、C、D捕获的数据并且结合步骤3、5所填的表,理解TCP的三次握手建立连接和四次握手的释放连接过程,理解序号、确认号等字段在TCP可靠连接中所起的作用。
练习二:利用仿真编辑器编辑并发送TCP数据包
本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组,现仅以主机A和B为例,说明实验步骤。
在本实验中由于TCP连接有超时时间的限制,故仿真编辑器和协议分析器的两位同学要默契配合,某些步骤(如计算TCP校验和)要求熟练、迅速。
为了实现TCP三次握手过程的仿真,发送第一个连接请求帧之前,仿真端主机应该使用“仿真编辑器/工具菜单/TCP屏蔽/启动屏蔽”功能来防止系统干扰(否则计算机系统的网络会对该请求帧的应答帧发出拒绝响应)。
通过手工编辑TCP数据包实验,要求理解实现TCP连接建立、数据传输以及断开连接的全过程。在编辑的过程中注意体会TCP首部中的序列号和标志位的作用。
首先选择服务器主机上的一个进程作服务器进程,并向该服务器进程发送一个建立连接请求报文,对应答的确认报文和断开连接的报文也编辑发送。其步骤如下:
主机B启动协议分析器捕获数据,设置过滤条件(提取http协议)。
主机A上启动仿真编辑器,在界面初始状态下,程序会自动新建一个单帧,可以利用仿真编辑器打开时默认的以太网帧进行编辑。
填写该帧的以太网协议首部,其中:源MAC地址:主机A的MAC地址。目的MAC地址:服务器的MAC地址。协议类型或数据长度:0800(IP协议)。
填写IP协议头信息,其中:
高层协议类型:6(上层协议为TCP)。
总长度:40(IP首部+TCP首部)。
源IP地址:主机A的IP地址。
目的IP地址:服务器的IP地址(172.16.0.10)。
其它字段任意。
应用前面学到的知识计算IP首部校验和。
填写TCP协议信息,其中:
源端口:任意大于1024的数,不要使用下拉列表中的端口。
目的端口:80(HTTP协议)。
序列号:选择一个序号ISN(假设1942589885),以后的数据都按照这个来填。
确认号:0。
首部长度和标志位:5002(即长度20字节,标志SYN=1)。
窗口大小:任意。
紧急指针:0。
使用协议仿真编辑器的“手动计算”方法计算校验和;再使用协议仿真编辑器的“自动计算”方法计算校验和。将两次计算结果相比较,若结果不一致,则重新计算。
TCP在计算校验和时包括哪些内容?将设置完成的数据帧复制2份;修改第二帧的TCP
层的“首部长度和标志”位为5010(即标志位ACK=1),TCP层的“序号”为1942589885+1。修改第三帧的TCP层的“首部长度和标志”位为5011(即标志位ACK=1、FIN=1),TCP层的“序号”为1942589885+1。
在发送该TCP连接请求之前,先ping
一次目标服务器,让目标服务器知道自己的MAC地址。
使用“仿真编辑器/工具菜单/TCP屏蔽/启动屏蔽”功能,为TCP\IP协议栈过滤掉收到的TCP数据。
点击菜单栏中的“发送”按钮,在弹出对话框中选择发送第一帧。
我们假设接收字节序号为:3246281765,修改第二帧和第三帧的TCP层的“ACK确认序号”的值:3246281766。
计算第二帧的TCP校验和,将该帧发送。对服务器的应答报文进行确认。
计算第三帧的TCP校验和,将该帧发送。断开连接,完成TCP连接的全过程。
协议分析器一端截获相应的请求及应答报文并分析,注意观察“会话分析”中的会话过程。
仿真端主机使用“仿真编辑器/工具菜单/TCP屏蔽/停止屏蔽”功能,恢复正常网络功能。
练习三:TCP的重传机制
练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。现仅以主机A和B为例,说明实验步骤。
主机B启动协议分析器开始捕获数据并设置过滤条件(提取TCP协议)。
主机A启动仿真编辑器,进入TCP连接视图。在“服务器信息/IP地址”中填入主机B的IP地址;使用“端口扫描”获取主机B的TCP端口列表,在“服务器信息/端口”中填入主机B的一个TCP端口(大于1024);点击“连接”按钮进行连接。
主机A向主机B发送一条信息。
主机B使用“仿真编辑器/工具菜单/TCP屏蔽/启动屏蔽”功能,过滤掉接收到的TCP数据。
主机A向主机B再发送一条信息。
主机B刷新捕获显示,当发现“会话分析视图”中有两条以上超时重传报文后,使用“仿真编辑器/工具菜单/TCP屏蔽/停止屏蔽”功能,恢复正常网络功能。
主机A向主机B再发送一条信息,之后断开连接。
主机B停止捕获数据。依据“会话分析视图”显示结果,绘制本练习的数据报交互图。
五实验涉及的理论基础
TCP(传输控制协议)简介
TCP是TCP/IP协议栈中的传输层协议,TCP称为面向字节流连接的和可靠的传输层协议。它给IP协议提供了面向连接的和可靠的服务。TCP与UDP不同,它允许发送和接收字节流形式的数据。为了使服务器和客户端以不同的速度产生和消费数据,TCP提供了发送和接收两个缓冲区。TCP提供全双工服务,数据同时能双向流动。每一方都有发送和接收两个缓冲区,可以双向发送数据。TCP在字节上加上一个递进的确认序列号来告诉接收者发送者期望收到的下一个字节,如果在规定时间内,没有收到关于这个包的确认响应,重新发送此包,这保证了TCP是一种可靠的传输层协议。
TCP服务的可靠性
TCP通过下列方式来提供可靠性:
· 数据被分割成TCP最适合发送的数据块,也就是最大报文段长度。当一个连接建立时,连接的双方都要通告各自的MSS(最大报文段长度)。
· 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认将重发这个报文段。
· 当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常将推迟几分之一秒,以便将ACK与需要沿该方向发送的数据一起发送。绝大多数实现采用的时延为200ms。
· TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发)。
· 既然TCP报文段作为IP数据报来传输,因此TCP报文段的到达也可能会失序。TCP将对收到的数据进行重新排序,将数据以正确顺序交给应用层。
· 既然IP数据报会发生重复,TCP接收端必须丢弃重复的数据。
· TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
TCP连接的建立
TCP是一个面向连接的协议,无论哪一方发送数据之前,都必须先在双方之间建立一条连接,这种连接是通过三次握手建立起来的
主机A(客户端)发送一个SYN段指明主机A打算连接的主机B(服务器)的端口,以及初始序号ISN,无ACK标记。
主机B发回包含主机B的初始序号的SYN报文段作为应答。同时将确认序号设置为主机A的ISN加1以对主机A的SYN报文段进行确认。
主机A必须将确认序号设置为主机B的ISN加1以对主机B的SYN报文段进行确认。
当握手进程没有成功完成最终的确认时就会发生半开放连接
主机A向主机B发送第1个数据包,也就是SYN数据包。
主机B发送ACK
SYN数据包作为回应。
这时主机A应该发送第3个数据包,即ACK数据包来结束握手,但实际却没有发送第3个数据包,使得主机B一直发送ACK
SYN数据包.
通常TCP连接的建立都是一方主动打开,而另一方则是被动打开,但两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个SYN,且这些SYN必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口,这被称为同时打开。
例如,主机A中的一个应用程序使用本地端口7000,并与本机B的端口8000执行主动打开。主机B的应用程序则使用本地端口8000,并与主机A的端口7000执行主动打开。它们仅建立一条连接而不两条连接,而且每一端既是客户机又是服务器。
TCP连接的终止
TCP客户端发送一个FIN,用来关闭从客户到服务器的传送,当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN,客户必须发回一个确认,并将确认序号设置为收到序号加1.
主机A(TCP客户端)发送一个FIN,用来关闭从主机A到主机B的传送
。
当主机B(服务器)收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
。
同时主机B还向应用程序传送一个文件结束符。接着主机B就关闭它的连接,导致它的TCP端发送一个FIN
。
主机A必须发回一个确认,并将确认序号设置为收到序号加1。
TCP提供了连续的一端在结束它的发送后还能接受另一端数据能力。这就是半关闭。
主机A(TCP客户端)发送一个FIN。
当主机B(服务器)收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
。
此时,主机B仍可发送数据,主机A仍然可以对数据发送ACK应答。
正常关闭是发送第一个FIN执行主动关闭,两方其实都可以主动关闭,同时发送FIN,这种情况就叫做同时关闭。TCP正常的终止方式也称为有序释放。但也可以发送一个复位报文而不是FIN来结束连接,这称为异常释放,这有两个优点:1.应用程序丢弃待发数据,并立刻发送复位报文;2.复位报文的接收方会区分是异常释放还是正常关闭。复位报文还有一个用处:当连接请求到达时,目的端口没有监听进程,TCP就发送复位报文。
滑动窗口
为了实现流量控制,TCP使用一种滑动窗口协议。用这种方法,双方主机为每个连接使用一个窗口。窗口区间是缓冲区的一部分包含了一台主机在等待另一台主机的确认期间所能发送的字节数据。该窗口之所以称为滑动窗口,是因为它能随着数据和确认的发送和接收在整个缓冲区内滑动。
TCP的滑动窗口是面向字节的。滑动窗口的使用使传输效率更高,同时也能控制数据流量,使接收端不被数据所淹没
状态转换图
为了记录TCP不同时期发生的所有不同事件,TCP软件实现为一个有限状态机,是指在有限个状态之间变化的机器。为了说明这个概念,我们使用状态转换图
拥塞控制
拥塞控制是网络或者接收方的负载过重。当网络发送的数据过多时就会发生网络过载,会使数据包丢失;当数据字节数大于接收方窗口大小时,接收方就会过载。
TCP提供4种拥塞控制机制来确保有效的利用带宽,并快速修复阻塞和错误,它们是:慢速启动,避免阻塞,快速重发,快速修复。
五实验涉及的一些思考问题
1. 试用具体例子说明为什么在运输连接建立时要使用三次握手。说明如不这样做可能会出现什么情况。
例如三次握手改成仅需要两次握手,可能会发生死锁。作为例子,考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
2. 使用TCP对实时话音数据的传输有没有什么问题?使用UDP在传送数据文件时会有什么问题?
TCP是基于连接对系统资源的要求较多,并且是基于流模式的传输协议,保证数据正确性和数据顺序保证数据正确性和数据顺序,但是延时比较大,因为其具有拥塞控制算法,对于实时性要求高的业务来说,有其必然的缺点。
UDP基于无连接,但对对系统资源的要求较少且程序结构较简单,它是基于数据报模式的传输协议,不保证数据正确性和数据顺序,因为UDP没有拥塞控制,只能提供尽力而为的服务,所以会出现丢包现象,且不重传。所以不适合传准确性要求比较高的,不允许有错误的等数据文件。
3. TCP在进行流量控制时是以分组的丢失作为产生拥塞的标志。有没有不是因拥塞而引起的分组丢失的情况?如有,请举例说明情况。
数据分组传输期间发生损坏丢失的方法和装置,分组丢失区分是基于对每个数据分组的差错检测/纠错码的估算,并通过检测序号进行的,该方法包括步骤:根据所接收的数据分组的差错检测码来检测所接收数据分组的数据损坏,提取所接收数据分组的序号,根据所提取序号的序列来检测丢失的序号,如果已经检测到了损坏的数据分组,就指出是由数据损坏而造成的数据分组丢失,和如果已经检测到了丢失的数据分组并且没有检测到该数据分组的数据损坏,就指出是由于拥塞引起的数据分组丢失。
实验总结
牛老师以自己特殊的教学方式教会我们很多东西,让大家懂得如何用书本上的理论知识进行实践,老师提醒大家常常忽略的基础的知识,让我们从最基本的架构中更加深入的学习。