一、实验目的
掌握TCP协议的运行过程
学习TCP协议报文段结构
二、实验内容
任务一、发送一个TCP数据报
任务二、发送多个TCP数据报
三、实验要求
采用以学生自主实验为主的开放模式组织教学
四、实验准备
网络协议分析器Wireshark,PCATTCP工具
五、实验原理、方法和手段
1、所有主机使用【快照】将虚拟机恢复到初始状态。
2、实验分为两人一组,互相发送数据并记录数据包的接收情况。
六、实验条件
网络协议分析器Wireshark,PCATTCP工具

图3-1 实验环境
注:(1)PCATTCP是一个简单、实用的TCP和UDP调试工具,使用这个工具可产生TCP或UDP数据流。(2)将pcattcp应用程序拷贝到C盘Windows下System32文件夹中,可在命令行中使用pcattcp命令。
七、实验步骤
任务一、本地ttcp连接,发送一个TCP数据报。
1.作为客户端的同学,运行pcattcp,并输入命令:pcattcp -t -l 1024 -n 1 10.10.104.141,与此同时打开wireshark来捕捉数据。该命令将向服务器发送一个TCP数据包,数据包大小为1024B。
然后,在客户端命令行窗口会看到下面的信息。

在wireshark中可以看到捕获的信息:

从上图可以看出,上图操作执行了建立连接、发送数据和释放连接等三个阶段,其中,分组40-42是建立连接阶段的分组,对应于三次握手,分组43是发送数据阶段的分组,分组44-47是释放连接阶段的分组,对应于四次握手。
(1)第一条报文分组40不携带数据,其首部的SYN位为1,又被称为SYN分组。这个报文段里的序号可以被设置成任何值,一般被设置为0。观察下图给出的分组40的信息,Wireshark显示的序号是0。然而,如果选择分组首部的序号字段,原始框中"59 db 64 af"被突出显示。Wireshark所显示的是逻辑序号,而真正的初始序号不是0。需要注意的是,TCP规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

注:过滤条件
(tcp and (ip.src==10.10.104.142 and ip.dst==10.10.104.141)) or (tcp and (ip.src==10.10.104.141 and ip.dst==10.10.104.142))
(2)第二条报文分组41的首部SYN位和ACK位都为1,又被称为SYNACK分组。SYNACK分组在确认收到SYN分组的同时也发出一个初始的数据流序号给客户端,通常为0。观察下图给出的分组41的信息,注意到分组41的确认号字段在Wireshark的协议框中显示为1,并且在原始框中的值是"59 db 64 b0"(比"59 db 64 af"多1)。这解释了TCP的确认模式,即TCP接收端确认第X个字节已经收到,并通过设置确认号为X+1来表明期望收到的下一个字节号,另外,也说明了SYN=1的报文段虽然不能携带数据,但消耗掉一个序号。另外,分组41的序号字段在Wireshark中显示为0,但在原始框中的实际值却是"8c 95 dc 44"。这就表明TCP连接的双方会选择数据流中字节的起始编号,所有初始序号逻辑上都视同为序号0。同样地,该报文段也消耗掉一个序号。

(3)最后,客户端发送带有标志ACK,但是不带有SYN的TCP报文段来完成三次握手的过程,对应分组42。这个报文段将确认服务器发送的SYNACK分组,并检查TCP连接的两端是否正确地打开和运作。需要注意的是,TCP标准规定,ACK报文段不携带数据时,不消耗序号。因此,分组43的序号还是1。
(4)分组43表示客户端向服务器传送1024B数据。注意,分组43里的序号是1,长度为1024,也就是说,分组43里面有1024字节,它们的编号是1-1024。

(5)分组44-47对应的是TCP连接释放的过程。即客户端给服务器发送带有FIN标志的TCP报文段,服务器给出确认,服务器端给客户端发送带有FIN标志的TCP报文段,客户端给出确认。
需要特别注意的是:(a)在分组44中,Ack=1表示客户端期望收到的下一个字节号是1,为了保证Ack有效,ACK设置为了1。 (b)在分组45里,服务器确认已经收到了所有发送的数据,这时确认号为1026而不是1025,这是由于FIN自身被当作第1025个字节了。分组45中的ACK分组并不占字节,所以,分组46的序号还是1。(c)在分组46中,服务器也发送了一个FIN标志只是不会发送任何其它附加的数据了。客户端最后发送一个确认号(Ack )为2的报文段来确认服务器所发的FIN标志,即分组47。再说一遍,确认号是2而不是1,因为FIN本身也被看作为最后的字节。
任务二:本地ttcp连接,发送多个TCP数据报
作为客户端的同学,在运行pcattcp并输入命令:pcattcp -t -l 1024 -n 5 10.10.104.141,并打开wireshark来捕捉数据。该命令表示向服务器发送5个数据包,每个数据包大小为1024B。
然后,在客户端命令行窗口可以看到下面的信息:

在wireshark中可以看到以下数据:

(1)分组39-41是TCP建立连接阶段的分组。
(2)分组42-45是传送数据过程的分组。其中,分组42-44对应的数据包大小分别是1024B、2048B、2048B,共计5120B。分组42的序号是1,有1024个字节,编号从1到1024。分组43的序号是1025,有2048个字节,编号从1025到3072。分组44的序号是3073,有2048字节,编号从3073到5120。
(3)分组46-49是释放TCP连接对应的分组。
当两端交换带有FIN标志的TCP报文段并且每一端都确认另一端发送的FIN包时,TCP连接将会关闭。
八、思考题
- 在任务一实验结果中,哪些分组包含三次握手,哪些分组包含四次握手?
答:分组40-42是建立连接阶段的分组,对应于三次握手。分组44-47是释放连接阶段的分组,对应于四次握手。
- 在任务一实验结果中,每个方向中真实的初始序号是多少?
(1)初始序号为59 db 64 af

- 初始序号为8c 95 dc 44

- 初始序号为59 db 64 b0

- 初始序号为59 db 68 b0

- 初始序号为8c 95 dc 45

- 初始序号为59 db 68 b1

- 在tcp_pcattcp_n1.cap中,哪些分组只包含首部而没有数据?
答:分组3,4,5,8,12,14,15,16只包含首部而没有数据。
- 在TCP流中仅有的没有设置ACK标志的报文段是什么?为什么?
答: 分组3代表TCP第一次握手,用于发起连接请求。此时,客户端并未收到来自服务器的任何报文,因此没有可以确认的内容,也就没有必要设置 ACK 标志位。
- 在tcp_pcattcp_n1.cap中,所有的从服务器到客户端的分组的确认号都是相同的吗?为什么?所有的从客户端到服务器的分组的确认号也都是相同的吗?(注意:在这种情况下,服务器是接收端,因为它监听接入的连接)
答: (1)所有的从服务器到客户端的分组的确认号不相同。在 TCP 协议中,确认号是基于接收方期望的下一个字节序列号。每次服务器发送确认时,确认号等于最后一个成功接收到的字节序列号加1。

- 所有的从客户端到服务器的分组的确认号不相同。在前几个分组中,确认号都为1。但最后一个分组的确认号为2,因为FIN本身也被看作为最后的字节,所以客户端最后发送一个确认号为2的报文段来确认服务器所发的FIN标志。

- 在tcp_pcattcp_n1.cap中,有多少分组是分组12确认的呢?分组14确认的分组又有多少呢?
答:分组12确认2个分组,分别是分组9和分组10。分组14确认2个分组,分别是分组11 [1] 和13。
- 客户端主机通过pcattcp命令向服务器发送了多少数据? 你是如何知道的?
答:将这些分组的length相加,可知客户端主机通过pcattcp命令向服务器发送了8192B数据。

- 15号分组的相对序号是多少?分组16的相对确认号是多少?
答:15号分组的相对序号是1,分组16的相对确认号是2。

