之所以写这篇文章,主要是为了应对计算机网络实验进行书写的,希望能够为后来的小伙伴避坑带来一些问题的解决。
实验目的
1、掌握 TCP 的特点及其报文结构;
2、掌握 TCP 三报文握手建立 TCP 连接的过程;
3、掌握 TCP 四报文挥手释放 TCP 连接的过程。
实验条件
安装有华为模拟软件 eNSP、Wireshark 的计算机。
实验原理:
网路层为主机之间提供逻辑通信,运输层则为应用进程之间提供端到端的逻辑通信。TCP/IP的运输层有两个主要的协议:UDP和TCP。
TCP具有以下特点:
(1)面向连接:发送数据之前必须先建立连接。主动发起TCP连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。TCP采用三报文握手建立TCP连接,服务器要确认客户的连接请求,然后客户要对服务器的确认进行确认。TCP采用四报文握手释放TCP连接,任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接释放通知,对方确认后就完全关闭了TCP连接
(2)每一条TCP连接只能是点对点的,仅支持单播,不支持广播和多播
(3)提供可靠交付的服务。TCP使用序号、应答、重传、超时等机制解决了网络层造成的数据的损坏、丢失、重复、失序等错误;利用滑动窗口协议进行流量控制;维持一个拥塞窗口,采用慢开始、拥塞避免、快重传和快回复等4重算法,根据网络状态进行拥塞控制。
(4)提供全双工通信。在建立好的一个TCP连接上实现双向传输。
(5)面向字节流。TCP给每一个字节赋予一个序号,将字节封装到TCP报文进行传输。
TCP主要用于对可靠性要求高的应用,在互联网中,SMTP、FTP和HTTP等都是基于TCP实现的。
实验内容与完成情况
(1)使用 eNSP 搭建实验环境,在 Server1 搭建 Web 服务,在交换机 E0/0/2
口开启抓包,在 Client1 上访问 Web 服务,网络拓扑如图所示。
PC、客户机和服务器的 IPv4 地址和子网掩码定义如表所示。
实验步骤
1、
(1)根据提供的网络拓扑图和IPv4地址、子网掩码完成网络连接
(2)双击 Server1 图标,进入 Server 设置界面
(3)点击“服务器”选项卡,选择“HttpServer”选项设置一个根目录,然后启动服务器
2、
(1)在交换机与 Server1 相连的端口上右击鼠标,选择“开始抓包”,自动开启 Wireshark 软件的抓包功能。
3、
(1)双击 Client1 图标,进入 Client 设置界面
(2)点击“客服端信息”选项卡,选择左侧“HttpClient”选项,“地 址:”文本框内填入“http://192.168.10.12”点击“获取”按钮,在 Wireshark 软件界面中将显示被抓取的数据包条目
4、三次握手
(1)握手报文1
(2)握手报文2
(3)握手报文3
5、四次挥手
(1)挥手报文1
(2)挥手报文2
(3)挥手报文3
(4)挥手报文4
实验分析及总结
三报文握手数据分析:
(1)SYN 同步序列号,用来发起一个 TCP 连接,会携带一个随机序号 seq=i,
报文中的 Flags 值 SYN=1,SYN=1 的报文段不能携带数据,但是会消耗掉一个
序号。此时客户端进入到 SYN-SEND 状态。
(2)服务器收到 SYN 之后,如果同意此次连接的建立会回复一个 ACK,确
认号 ack=i+1,同时会选取一个序列号 seq=j,报文中的 Flags 值 SYN=1,ACK=1,
此时服务器进入到 SYN-RCVD 状态。
(3)客户端收到服务器的确认后,还会向服务器发出一个确认报文,确认号
ack=j+1,序列号 seq=i+1,报文中的 Flags 值 ACK=1,ACK 报文可以携带数据,
如果没有携带数据不会消耗序号,下一个报文的序号仍然是 i+1。此时客户端进
入到 ESTABLISED 状态,服务器收到确认报文后也进入到 ESTABLISED 状态。
四次挥手分析
(1)当客户端的数据发送完毕之后,会向服务器端发送一个 FIN=1 的报文,
告诉服务器端数据已经发送完了,可以释放连接了,此时客户端进入到
FIN-WAIT-1 状态去等待服务器端的 ACK 报文。
(2)当服务器端收到 FIN 报文后,会给客户端发送一个释放连接的确认报文
ACK,此时服务器就处于 CLOSE-WAIT 状态,这个时候客户端到服务器的方向
就释放了,但是服务器若有数据要发送,客户端还是要接收。
(3)客户端收到确认报文后就进入到 FIN-WAIT-2 状态等待服务器端发送 FIN
报文。
(4)当服务器端没有数据要发送时,就会向客户端发送 FIN 报文,等待客户
端确认。
(5)客户端收到服务器的 FIN 报文后,必须发出 ACK 确认,此时客户端进
入到 TIME-WAIT 状态,此时 TCP 连接还没有被释放,必须要经过 2MSL(最长
报文段寿命)的时间后,客户端撤销掉 TCB 后,才进入到 CLOSED 状态。(经
过 2MSL 的原因是 1.防止服务器端未收到 ACK 报文 2.防止下一次占用该端口号
的 TCP 连接收到上一次连接迟到的报文)
服务器端收到 ACK 确认报文后,就进入到 CLOSED 状态,服务器端结束
TCP 连接会比客户端早一些。
总结:
客户只有在收到FIN报文并发出ACK报文再经过两个周期后才会关闭,这种设定有效防止了客户端立即关闭造成序号再次被使用而使另一个进程收到错误的报文引发的错误。