实验目的:
- 熟悉 TCP 通信的三个阶段:通过此次实验,结合理论课知识深入理解并熟悉 TCP 通信的三个主要阶段,即连接建立(SYN-SYN),数据传输(DATA),以及连接释放(FIN-ACK)三个阶段,重点关注报文段信息数据发送的具体信息,包序号、ACK号、数据长度等;
- 理解 TCP 连接建立过程和 TCP 连接释放过程:通过此次实验,更为直观的进一步学习理解 TCP 连接建立过程和连接释放过程的细节,在连接建立过程中,掌握三次握手的机制、原理和流程,在连接释放过程中,理解四次挥手的机制、原理和流程,重点理解握手为什么必须是三次,挥手又为什么必须是四次。
实验器材:
一台安装有Cisco Packet Tracer软件的Windows操作系统的PC机。
实验准备:
1.配置网络拓扑:为开展实验内容,首先在 Packet Tracer 7.3.1 模拟器中配置好如下的网络拓扑结构。如下图所示,具体包括一台主机与一台服务器相连:
2. 配置 IP 地址和子网掩码:根据实验要求,为主机与服务器配置IP地址,点击 PC与服务器的【桌面】,打开参数表如下所示,在 PC与服务器 的配置窗口中配置合理的 IP 地址和子网掩码如下图所示:
3. 捕获TCP传输:由于我们此次实验目的主要为理解 TCP 连接建立过程和 TCP 连接释放过程,因此我们只需要观察TCP事件即可,在 Simulation 模式下单击 Edit Filters 按钮,仅选择 TCP 事件:
随后,单击逻辑工作空间中的 PC,在 Desktop 选项卡中打开 Web Browser,在 URL 框中输入服务器的IP 地址,然后单击 Go 按钮,最小化模拟浏览器窗口,可以看到此时在主机上已经预备发送TCP数据包,至此数据准备工作已经全部完毕。
实验内容:
任务一:观察TCP 连接建立的三次握手事件
1.第一次握手:首先我们可以看到在PC0向服务器0正式发送第一个TCP报文进行第一次握手1前,事件列表中已经存在了两次TCP事件,这是因为主机会先在设备上尝试创建一个到目的端口TCP的连接,这两次TCP事件分别在主机的第四、三层与第一、二层,最终结果为根据需要成功生成了一个TCP报文段用以建立TCP连接;
通过在 Simulation 模式下的 Event List 区域中单击 Info 列中的单色框,可以打开 PDU Information 窗口,观察可得此时主机的设置连接状态为SYN_ SENT(同步己发送),TCP可接受的最大窗口值为65535字节,首部中的选项字段 MSS(最大报文段程度)值为 1460字节,连接请求被接受:
主机上的TCP报文段生成完毕后,即可向服务器0发送TCP报文段,而当服务器0接收成功后说明连接的第一次握手完毕,具体接收得到的报文段序号为0,ACK号为0,数据长度为24:
2.第二次握手:服务器0从端口 80 收到 PC 发来的 TCP 同步报文段后,取出首部的选项字段 MSS 的值,同意接收 PC 的连接请求,并将其连接状态设置为 SYN RECEIVED(同步已接收),TCP 将窗口大小设置为 16384B,同时将首部中的选项字段 MSS(最大报文段长度)值设置为 536B,服务器0向 PC0 发送一个 TCP 的同步确认 (SYN+ACK)报文段,PC0接收成功后完成了第二次握手,PC0具体接收得到的报文段序号为0,ACK号为1,数据长度为24:
除此之外值得一提的是,在上述的PDU Information 窗口中显示TCP连接成功,但这仅仅只是针对PC0来说TCP连接成功,因此此时PC0就开始缓存(由于端口正在发送另一个帧,因此HTTP数据包被缓存)准备发送HTTP数据包,如下图所示,而HTTP数据包正式开始发送需要等到我们的第三次握手成功:
3.第三次握手:上述两次握手成功后,TCP 将PC0的窗口大小重置为 536B,此时,PC0 将其连接状态设置为 ESTABLISHED(连接己建立),此时PC0即可向 Server0 发送一个 TCP 确认(ACK)报文段,Server0具体接收得到的报文段序号为1,ACK号为1,数据长度为20,因为报文段中具有所期望的对等序号,因此TCP连接成功,Server0同样将其连接状态设置为 ESTABLISHED(连接己建立):
任务二:观察HTTP数据文件发送过程
1.PC0 ——> Server0:在PC0与Server0 的TCP连接建立完成后,设备PC0将从其缓冲区取出之前步骤中缓存的HTTP数据文件并发送给Server0,通过观察显示Server0接收的报文段信息具体为序号为1,ACK号为1,数据长度为101,其TCP PUSH+ACK中的PUSH表示发送方希望接收方立即将缓冲区中的数据交付给上层应用:
2. Server0 ——> PC0:当Server0接收到PC0发送的 HTTP 请求后,Server0将会生成并发送一个 HTTP 响应给PC0,如下图所示,PC0接收的报文段信息具体为:序号为1,ACK号为102,数据长度为471:
任务三:观察 TCP 连接释放的四次挥手事件
1.第一次挥手:决定释放连接后,PC0 将首先关闭与 Server0 的 80 端口之间的 TCP 连接,将连接状态设置为 FIN WAIT 1(关闭等待 1),并且PC0 将向 Server0 发送一个 TCP 关闭确认 (FNN+ACK)报文段,报文段的具体信息为:序号为102,ACK号为472,数据长度为20:
2.第二、三次挥手:Server0 收到 PC0 的 1025 端口发来的 TCP 关闭确认报文段,该报文段中的序号也正是原先期望收到的,Server0 将其连接状态设置为CLOSE_ WAIT(关闭等待)后,Server0 从其缓存中取出最后一个 TCP 关闭确认(FIN+ACK)报文段发送给 PC报文具体的信息为:序号为472,ACK号为103,数据长度为20。此时 Server0 将其连接状态设置为 LAST ACK(最后确认),可以看到在此次报文段传输过程中,第二次挥手与第三次挥手是同时进行的:
3.第四次挥手:PC0 收到 Server0 从 80 端口发来的 TCP 关闭确认报文段,该报文段中的序号也正是原先期望收到的。PC0 向 Server0 发送一个 TCP 确认(ACK)报文段,报文的具体信息为:序号为103,ACK号为472,数据长度为20。此时 PC 进入 CLOSING(正在关闭)连接状态;Server 收到该报文段后,将其连接状态设置为 CLOSED(己关闭),至此TCP连接的释放过程已经全部结束。
实验结果、分析与结论:
思考题:
(1)连接建立阶段的第一次握手是否需要消耗一个序号?其 SYN 报文段是否携带数据?为什么?第二次握手呢?
第一次握手需要消耗一个序号,且其SYN 报文段是不携带数据的。客户端发送的SYN报文段都会携带一个初始序号(ISN,Initial Sequence Number),该序号就是我们此处所说的被消耗的序号,这个初始序号是随机选择的,用于建立连接时同步双方的初始序列号。并且,由于第一次握手的SYN报文段主要用于同步双方的序列号和表明客户端希望建立连接,通常情况不会携带实际的应用层数据。第二次握手的报文段同上所示,也需要消耗一个序号,且不会携带数据。
(2)本实验中连接释放过程的第二、三次挥手是同时进行的还是分开进行的?这两次挥手何时需要分开进行?
通过回顾实验内容可以看到,本实验中连接释放过程的第二、三次挥手同时进行的,服务器0收到第一次挥手的FIN后,向PC0发送一个ACK报文段,表示收到了PC0的FIN,并与此同时,服务器0发起自己的关闭过程,向PC0发送了一个FIN,这种同时进行的挥手效率较高。
但如果PC希望在发送FIN后继续接收数据,即进入一种“半关闭”状态,在这一状态下,主动关闭方仍然可以接收来自被动关闭方的数据,但主动关闭方不再向被动关闭方发送新的数据,那么第二次与第三次挥手就需要分开进行。
(3)本实验中连接释放阶段的第四次挥手,PC 向 Server 发送最后一个 TCP 确认报文段后,为什么不是直接进入 CLOSED(己关闭)连接状态,而是进入 CLOSING(正在关闭)连接状态?
在TCP协议中,当PC发送完最后一个确认报文段后,它会进入“连接正在关闭,但还未完成”的CLOSING 状态。在这个状态下,PC会等待确认来自 Server 的最后一个 ACK 报文段,当 PC 收到 Server 的最后一个 ACK后,设备连接才会进入 CLOSED(己关闭)状态。
这样的设计是为了应对网络延迟或其它导致的报文段丢失的情况,如果 PC 直接进入 CLOSED 状态,而由于一些原因 PC 没有接收到 Server 的确认,那么 PC 就无法得知连接是否真正关闭,而如果Server没有接收到PC的TCP确认报文段,此时的PC由于已经关闭也无法向Server进行重传。通过先进入 CLOSING 状态,PC 能够等待确认,确保TCP连接释放的可靠性。
4) 本实验中 TCP 连接建立后的数据通信阶段,PC 向 Server 发送了多少数据? Server 向 PC 发送了多少数据?
如下实验结果所示,PC 向 Server 发送的数据长度为101,而Server 向 PC 发送的数据长度为471:
通过上述的实验内容,我们可以总结TCP连接的三个阶段对应的报文信息如下图所示:
实验心得与体会:
- 转眼间计算机网络的实验课已经进入尾声,与我们地信专业其它的实验课相比,这门实验课没有复杂的操作,相关软件的使用也不具有很大的难度,但我却认为这是将理论与实际结合的最好的一门实验课程,我认为其根本原因在于:计算机网络中的许多过程对于我们来说都是瞬息之间或者自然而然发生的,让我们具有很好的接收程度,而实验课的内容又可以把这些过程剖析地非常具体与详细的展现在我们的面前;
- 而以此次实验课的内容为例,在实际生活中,TCP连接的建立与释放过程都是十分迅速的,虽然我们在课堂上深入学习了“三次握手”与“四次挥手”的具体过程,但难免还是会有些不详细清楚了解的地方。而通过实验课的学习,借助一个虚拟的环境与具体的TCP连接的例子,我们不仅可以了解理论课上所说的“三”与“四”的具体含义,甚至可以从OSI模型的角度深入了解设备的连接状态、输出报文段信息与输入报文段信息等等,这样一个从浅入深从简到繁的学习过程,大大加深了我们对学习的印象与理解;
- 在整个这一门实验课的学习过程中,如果是对课堂理论知识没有真正理解与深入学习的同学,可能认为实验课程就是在搭建好网络拓扑后随便点几个按钮,截几张图片就能完成的任务,但事实上这只是我们实验课程中需要完成的最基础的部分;
- 我认为实验课程作为辅助我们理论课程深入理解相关概念的重要方法,我们应该善于利用这一工具中“展现直观”的特点,将理论课中的抽象讲解与我们可以具体应用的例子相结合,并最终将相关知识再转化为我们自己的抽象理解,只有这样才能说是真正完成了一节实验课的任务与内容。