TCP三次握手原理

如题所述

第1个回答  2022-06-17

本文主要内容

1、TCP数据包格式

TCP数据包格式如下:

注意到中间还有几个标志位:

数据包格式当中,最重要的是理解序号和确认序号。TCP为什么是稳定可靠的,与序号与确认序号这套机制紧密相关,这也是TCP的精髓。

2、TCP的三次握手

众所周知,TCP协议是可靠的,而UDP协议是不可靠的。在一些场景中必须用TCP,比如说用户登录,必须给出明确答复是否登录成功等。而有些场景中,用户是否接收到数据则不那么关键,比如网络游戏当中,玩家射出一颗子弹,另外的玩家是否看到,完全取决于当前网络环境,如果网络卡顿,就会有玩家已经被射杀,但界面仍然刷新不出来的情况。这种情形适合UDP。

为了保证TCP协议可靠,在建立连接之时就要得到保证。

最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,而B被动打开连接。(A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建立状态ESTABLISHED)

B服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。

3、TCP的传输和确认

TCP 传输的可靠性,可以用一句话归结:每收到对方数据,就发送 ACK 进行确定,发送方发送后没有收到 ACK 就隔一段时间重发。

就是 A 向 B 发送消息(下面将 TCP 的报文直接看做是消息,消息一词跟 TCP 报文混用),B 收到消息后需要向 A 发送 ACK。这个 ACK 相当于返回结果,没有返回结果,A 就重新发送消息。

归纳起来,A 有 3 种消息需要确认。

另外 A 也可以发送 RST 消息,代表出错了。出错消息不需要确认。RST 也可以当成返回接口,替代正常的 ACK。返回 ACK,表示消息发送并处理成功,返回 RST 表示消息处理失败。因为通过网络传输,还有第三种结果,就是不确定成功失败。这样归纳起来。就有三种返回结果。

这两种具体情况,A 根本识别不了,都只能重发。

4、TCP的序号和确认序号

A 向 B 发送消息,假如同时发送 a、b、c、d 消息,因为通过网络,这些消息的顺序并非固定的。而 B 返回 ACK 结果,这样就有一个问题,这个结果到底对应了哪个消息?另外当 A 超时重发后,原来的消息延时一段时候,又重新到达了 B,这样 B 就收到两条相同的消息,那么 B 怎么确定这两条消息是相同的呢?

为了解决这个对应问题,每一条消息都需要有一个编号,返回结果也应该有一个编号。TCP 的序号可以看成是发送消息的编号,确认序号可以看成是返回结果的编号。有了编号,重复的消息才可以忽略,返回结果(ACK)才可以跟消息对应起来。

当建立连接的时候,TCP 选定一个初始序号,之后每发送一个数据包(消息),就将序号递增,保证每发送不同的数据包,数据包的序号都是不同的。TCP 是这样处理的:

SYN、FIN 也需要递增序号。不然 A 向 B 重发多个 SYN 或者 FIN, B 根本判断不了 SYN 是否相同,这样就不可以忽略重复的数据包了。

当 TCP 发送 ACK 时,相当于返回结果,需要带有确认序号,以便跟发送的消息对应起来。

当发送包编号为 a,递增长度为 len。其中 SYN 和 FIN 可以看成是递增长度为 1。这条消息可以这样表示为:

现在来回顾三次握手过程。 A 发送序列号x给 B , B 回复 A 确认号 x+ 1,同时发送序列号 y, A 接收到 B 的回复后,再回复确认号 y+1,同时发送序列号 x+1。给对方的回复一定是接收到的序号加1(或者是数据长度),这样对方才能知道我已经收到了,这样才能保证TCP是可靠的。

第2个回答  2024-08-29
一、TCP三次握手的过程
TCP三次握手过程涉及客户端和服务器之间的三次报文交换。以下是具体的步骤:
第一次握手:
客户端向服务器发送一个SYN报文段,并将SYN标志位设置为1。同时,客户端会随机生成一个初始序列号,并将其放在TCP首部的序列号字段中。此时,客户端的TCP连接状态变为SYN_SENT。
报文示例:客户端 -> 服务器 [SYN, seq=x]
第二次握手:
服务器收到客户端的SYN报文段后,会对其进行确认。确认的方式是在响应的报文段中设置ACK标志位为1,并将确认号字段设置为收到的序列号加1。同时,服务器也会随机生成一个自己的初始序列号,并将其放在响应报文段的序列号字段中,并发送一个SYN报文段,即SYN+ACK报文段。此时,服务器的TCP连接状态变为SYN_RCVD。
报文示例:服务器 -> 客户端 [SYN, ACK, seq=y, ack=x+1]
第三次握手:
客户端收到服务器的SYN+ACK报文段后,会对其进行确认。确认的方式是发送一个ACK报文段,将ACK标志位设置为1,并将确认号字段设置为收到的服务器序列号加1。此时,客户端的TCP连接状态变为ESTABLISHED,表示连接已经成功建立。
报文示例:客户端 -> 服务器 [ACK, seq=x+1, ack=y+1]
服务器收到客户端的ACK报文段后,其TCP连接状态也变为ESTABLISHED,此时双方可以开始传输数据。
二、TCP三次握手的原理
TCP三次握手的原理主要基于以下几个关键点:
同步序列号:通过SYN报文段,客户端和服务器能够协商并确定各自的初始序列号,这是为了确保数据传输的有序性和可靠性。
确认机制:通过ACK报文段,双方能够确认对方已经准备好接收数据,并且已经成功接收到了对方的序列号。这种确认机制是TCP可靠性保障的重要组成部分。
防止已失效的连接请求报文段突然又传送到了服务端:由于网络的不稳定性,已经失效的连接请求报文段可能会在网络中滞留并突然传送至服务端。三次握手机制能够确保服务端不会错误地接受这些失效的请求,从而避免了不必要的资源消耗和潜在的安全风险。
相似回答
大家正在搜