TCP三次握手、四次挥手详解(Wireshark实践)

一、ACK、SYN、FIN等标识位

在这里插入图片描述
ACK (Acknowledge character,确认字符)在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(synchronization,同步) 在连接建立时用来同步序号。
当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。
因此,SYN置为1就表示这是一个连接请求或连接接受报文。

FIN (finish,终结) 用来释放一个连接。
当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

RST (ReSeT),复位, 当RST = 1时,表明TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。将RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。

URG: 紧急指针( urgent pointer)有效。
PSH: 接收方应该尽快将这个报文段交给应用层。

确认号 (Acknowledgment Number)占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到

二、TCP报文实例

在这里插入图片描述
在这里插入图片描述

三、三次握手

在这里插入图片描述
1、客户端发送连接请求报文段,无应用层数据。
SYN=1,seq=x(随机)

2、服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。小写的ack表示确认号。
SYN=1,ACK=1,seq=y(随机),ack=x+1

3、客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。后面发数据时SYN均为0。
SYN=0,ACK=1,seq=x+1,ack=y+1

注:SYN Cookie是专门用来防范SYN Flood攻击的一种手段。三次握手的核心是: 确认每一次包的序列号。

TCP 在连接建立时所发送的第一个 SYN 报文段只有首部,其数据部分是空的,但为什么 SYN 报文段要消耗一个序号呢?

解答: TCP 在连接建立时所发送的第一个 SYN 报文段是一个控制报文段,其主要目的是为了和对方建立同步,并明确自己采用的初始序号。这个报文段没有数据部分。按理说,好像这个 SYN 报文段不需要序号。但是 SYN 报文段非常重要,是不允许丢失的(传错了或丢了就要重传,否则无法建立连接),所以必须进行编号。虽然 SYN 报文段没有数据部分,只有首部,但我们可以想象 SYN 报文段包含一个虚字节的数据,因此给 SYN 报文段一个序号,让SYN 报文段消耗一个序号。当对方收到序号为x的SYN 报文段后 给出 的确认就应当是ack =x + 1。发送方收到这个确认,就知道发送的 SYN 报文段已正确地传送到对方了。

TCP 在连接建立时, A发送 SYN 报文段,选择了初始序号 seq=x。B 收到连接请求报文段后,如同意建立连接,则向A发送确认和 SYN 报文段,其确认号是ack = x + 1, 同时也为自己选择一个初始序 seq=y。A 最后要发送确认报文段其序号是 seq= x + 1, 确认号是 ack = y + 1 。这个确认报文段消耗序号吗?
解答:
A所发送的确认报文段#3 是不消耗序号的。
如果A在确认报文段#3 之后接着发送数据报文段,那么这个数据报文段的序号就仍然是seq =x +1, 因为确认报文段#3 是不消耗序号的。
但是应当注意,如果A所发送的确认报文段#3 携带了数据,那么这个报文段就消耗序号。例如, A所发送的确认报文段#3 携带了 100 字节的数据,那么A下一次发送的数据报文段#4的序号就应当是 seq =x+ 101。

四、四次挥手

在这里插入图片描述
1、客户端发送释放连接报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u

2、服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了——半关闭状态。
ACK=1,seq=v,ack=u+1

3、服务器端发完数据(也可不发数据),就发出释放连接报文段,主动关闭TCP连接。
FIN=1, ACK=1,seq=w,ack=u+1

4、客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
ACK=1,seq=u+1,ack=w+1

客户端收到FIN报文后,就知道可以关闭连接了,但是担心自己发的ACK因为网络等因素不能被服务器端收到,服务器端不知道要关闭并且重复发FIN报文。所以发送ACK后进入TIME_WAIT状态,如果服务器端没有收到ACK则可以重传。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那么客户端也可以关闭连接了。
MSL (Maximum Segment Lifetime):最长报文段寿命,一般设为 2 分钟,TCP 允许根据具体情况使用更小的 MSL 值。
在这里插入图片描述

五、数据包的大致结构

第一行:数据包整体概述,
第二行:链路层详细信息,主要的是双方的mac地址(关注mac)
第三行:网络层详细信息,主要的是双方的IP地址(关注IP)
第四行:传输层的详细信息,主要的是双方的端口号(关注端口号)。
在这里插入图片描述
在这里插入图片描述

六、Wireshark中看TCP三次握手、四次断开

模拟tcp会话建立
通过Xshell远程连接Kali Linux就会捕获到完整的TCP3次握手的链接。
先清空数据包然后筛选tcp开始抓包

三次握手

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里三次握手过程就结束了

流程图显示

在这里插入图片描述
在这里插入图片描述
前面3个就是TCP建立链接的过程,后面的就是相互通信的过程了这个时候seq就会根据数据包的大小改变。
在这里插入图片描述
清空数据包来看一下断开链接是一个什么样的过程
在这里插入图片描述

四次挥手

流程图显示
把窗口拉到最下面只看4个数据包
在这里插入图片描述
过程: 我们在终端输入EXIT实际上是在我们Kali 上执行的命令,表示我们SSHD的Server端向客户端发起关闭链接请求。

参考链接

网络基础之网络协议篇——Egon林海峰老师

posted @ 2022-09-10 13:34  Hardworking666  阅读(144)  评论(0编辑  收藏  举报  来源