TCP三次握手建立过程

大家都知道,计算机与网络设备要相互通信,双方就必须基于相同的方法,不同的硬件、操作系统间的通信,这一切都需要一种规则。我们把这种规则称为协议。

TCP/IP是互联网中相关各类协议族的总称。TCP/IP是指TCP和IP这两种协议。TCP/IP是在IP协议的通信过程中使用到的协议族的统称。

附:计算机访问互联网的过程
在这里插入图片描述
可以看到,在利用TCP/IP协议族访问网络时,会通过分层的顺序与对方进行通信。
顺序:
发送端:应用层(HTTP客户端)→传输层(TCP)→网络层(IP)→数据链路层
服务器端:数据链路层→网络层(IP)→传输层(TCP)→应用层(HTTP服务器端)

TCP(Transmission Control Protocol传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议

好了,现在我们回归正题,TCP三次握手的具体过程是怎样的呢

由于 TCP 只存在请求和响应,请求和响应都是数据包。为了更好的理解TCP三次握手的过程,我们需要先了解TCP的报文
在这里插入图片描述
其中比较重要的字段有:

序号(sequence number):Seq 序号,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。

确认号(acknowledgement number):Ack 序号,占 32 位,只有 ACK 标志位为 1 时,确认序号字段才有效,Ack=Seq+1。

标志位(Flags):共 6 个,即 URG、ACK、PSH、RST、SYN、FIN 等。

六个标志位具体含义如下:

URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文发送给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。

注意:不要将确认序号 Ack 与标志位中的 ACK 搞混了。

确认方 Ack=发起方 Seq+1,两端配对。

了解了TCP报文首部了现在我们来看具体的过程:
在这里插入图片描述
初始化状态:客户端:close关闭状态,服务器:listen监听状态。

第一次握手:客户端发送请求报文将 SYN=1 同步序列号和初始化 seq=x发送给服务端,服务端从初始化状态,创建连接,等待客户端,确认接收后的状态为SYN_Receive。这个时候客户端处于等待状态为SYN_Send。

第二次握手,服务器接收到报文后(SYN=1,seq=x)收到请求后请求报文变为同步序列号SYN=1,初始化序列号seq=1,确认号ACK=1,ack=x+1,服务器为SYN_Receive状态,发送端的状态为:SYN_Send。

第三次握手,客户端收到服务端的数据包(收到响应后),然后发送同步序列号ack=y+1和数据包的序列号seq=x+1和ACK=1确认包作为应答(第三次握手:ACK=1,seq=x+1,ack=y+1),客户端和服务端变化为established状态。
动态过程如下图所示
在这里插入图片描述

在这里插入图片描述
我们把客户端和服务器比作两名网瘾少年

这个过程我们可以通俗的理解为:
在这里插入图片描述
至此,三次握手完成,TCP客户端和服务器端成功地建立连接,客户端可以访问网络并开始快乐了
在这里插入图片描述
但是,先别忙着快乐,我们还有一点没整明白:为什么要进行第三次握手?

答:为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误的连接

由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了 SYN=1 创建连接的请求(第一次握手)。

如果服务器端就直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。

客户端可能设置了一个超时时间,时间到了就关闭了连接创建的请求。

再重新发出创建连接的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话,服务器端是不知道客户端有没有接收到服务器端返回的信息的。

这个过程可理解为:
在这里插入图片描述
有连接就应当有释放,当建立的连接不用的时候(在网吧快乐完了),连接的释放将由一方主动释放,另一方被动释放,这就是我们常说的TCP的四次挥手

本文参考了51CTO的博客,如需更详细的解释,请戳以下链接
三次握手+四次挥手

发布了21 篇原创文章 · 获赞 17 · 访问量 5485

猜你喜欢

转载自blog.csdn.net/zhang175gl/article/details/104105589