大白话讲解TCP三次握手

为什么需要三次握手?
三次握手的目的是为了确保客户端和服务端建立稳定可靠的连接。

在讲解之前,需要先明白[SYN]和[ACK]是什么意思?
[SYN]和[ACK]是命令标记。
在客户端和服务端建立连接之前,双方需要互发消息,确认是否可以建立连接。而发送消息的命令就是用[SYN]和[ACK]来标记的。
如果命令是[SYN],表示发送的是数据包的编号;如果命令是[ACK],表示的是确认信息。
SYN:Synchronize Sequence Numbers,同步序列编号,即每个数据包的编号,使用Seq表示,第一次时随机产生。
客户端每发送一条消息,编号自动+1。比如第一次发送时编号为1001,那么第二次为1002,第三次为1003,以此类推。服务端同样如此。
ACK:Acknowledge,确认信息(对方的Seq+1)。

大白话描述TCP三次握手:
1.客户端发消息给服务端,请求建立连接。->[SYN]
2.服务端收到客户端消息后,通过某种机制,确认客户端没问题。但是,此时此刻,客户端还不知道自己想要建立请求的服务端有无问题。需要服务端发送消息给客户端,等待客户端确认。所以服务端就把自己已经确认的信息 + 需要客户端确认的消息发送给客户端。->[ACK,SYN]
3.客户端收到服务端消息后,通过某种机制,确认服务端没问题。然后客户端把自己已经确认的消息发给服务端,告诉服务端我这边确认过了,你没问题,可以连接了。服务端收到后,对确认信息进行核实,如果没问题,连接正式建立。->[ACK]

下面通过分析[SYN]和[ACK]命令来详细了解三次握手

第一次
192.168.3.222 TCP 192.168.3.230 52360 → 9501 [SYN] Seq=0
客户端向服务端发送[SYN]命令,客户端包的编号Seq为0,请求建立连接。
第二次
192.168.3.230 TCP 192.168.3.222 9501 → 52360 [SYN, ACK] Seq=0 Ack=1
服务端收到客户端的请求信息,做确认处理,生成确认信息Ack=客户端的Seq+1。并将服务端包的编号Seq=0一起发送给客户端。这样服务端就发送了2个命令:[SYN]和[ACK]。
第三次
192.168.3.222 TCP 192.168.3.230 52360 → 9501 [ACK] Seq=1 Ack=1 Win=131328 Len=0
客户端收到服务端的信息,将客户端的Seq+1后和服务端返回的确认信息Ack做比较,如果一致,说明服务端没问题。然后再根据服务端发来的Seq+1生成客户端的确认信息Ack,发送给服务端。服务端根据自己的Seq+1跟客户端发送过来的确认信息Ack做比较,如果一致,双方可以建立连接。

最后再看下握手数据,主要是前三条,如图:

提供下比较经典的三次握手图:

参考:
https://www.cnblogs.com/cenglinjinran/p/8482412.html
https://www.cnblogs.com/zcbing/p/6397496.html
https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc
https://blog.csdn.net/qq_38950316/article/details/81087809
https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc

扫描二维码关注公众号,回复: 8428185 查看本文章

猜你喜欢

转载自www.cnblogs.com/subendong/p/12152575.html