(2)基于 Wireshark 的 TCP 原理解析的实验完成情况

TCP

TCP的特点:

1、TCP是面向连接的运输层协议

2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

3、TCP提供可靠交付的服务

4、TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

5、面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP应用程序交下来的数据仅仅是一连串的无结构的字节流。

1)实验过程

1 、打开wireshark软件

image-20220611195242487

2、选择网络捕获接口,选择WLAN

image-20220611195324475

3、选择过滤器为HTTP,并右键选择追踪流-TCP流

image-20220611195757423

可以点击查看下方的详情信息

image-20220611201519991

其中

Frame 1667为物理层

Ethernet为数据链路层以太网2

Internet Protocol Version 4为网络层

Transmission Control Protocol为传输层TCP

Hypertext Transfer Protocol为应用层TCP

4、以下为TCP数据包,其中包含三次握手与四次挥手

image-20220611202237016

image-20220611200040974

首先对握手进行分析

image-20220611200603913

选中其中第一次握手,可查看下面的详情信息

image-20220611203447367

下面为捕获的TCP包中的每个字段的说明信息

img

  1. 源端口号:数据发起者的端口号,16bit

  2. 目的端口号:数据接收者的端口号,16bit

  3. 序号:32bit的序列号,由发送方使用

  4. 确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。

  5. 首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

  6. 保留:6bit, 均为0

  7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。

  8. 确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。

  9. 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。

  10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。

  11. 同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。

  12. 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

  13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

  14. 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

  15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

  16. 选项:长度可变,最长可达40字节。

与所示的数据进行对应

image-20220611204650174

image-20220611204535546

2)实验结果与分析

现对TCP三次握手的过程进行分析

image-20220611204901355

第一次握手:

建立连接时,客户端发送syn包(seq=X)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

image-20220611210016517

第二次握手:

服务器收到syn包,必须确认客户端的SYN(ack=X+1),同时自己也发送一个SYN包(seq=Y),即SYN+ACK包,此时服务器进入SYN_RECV状态。

image-20220611210035115

第三次握手:

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=Y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

image-20220611210058955

对四次挥手进行分析

image-20220611205636958

原理分析

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

第一次挥手:

客户端(主动关闭方)发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。

image-20220611210351720

第二次挥手:

服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_WAIT状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

第三次挥手:

服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。(有时候抓挥手包时只会抓到三个,这是因为服务端将第二次挥手与第三次挥手合并发送)

image-20220611210420820

第四次挥手:

客户端收到FIN后,客户端进入Time_WAIT状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

image-20220611210443137