礼貌地说你好——TCP协议三次握手

网络
我们只是想来介绍一下,网络中的计算机之间是如何礼貌问好地,TCP协议是如何建立连接的。

沟通的艺术

我们在与他人沟通的时候,最基础的最重要的是什么?

是好的沟通方式?是恰到好处的时机?是能够设身处地地为他人着想?

是,但不完全是,沟通的第一步当然是先要礼貌地问好啦。

等一下,我们现在在做什么,心理学知识普及?这不是我们的目的,也不是我们的强项。

我们只是想来介绍一下,网络中的计算机之间是如何礼貌问好地,TCP协议是如何建立连接的。

TCP协议三次握手

TCP协议报文详解一文中,已经详细介绍了TCP报文的内容,那么TCP协议中,主机和主机之间,是如何建立连接的?

首先,请求建立连接的主机我们叫做客户端,被连接的主机叫做服务端。

第一次握手

客户端向服务端请求建立连接的时候,会发送带有序号为j(seq=j),并且控制位为SYN=1的数据包发送给服务端,此时客户端状态为SYN_SENT。

第二次握手

服务端接受到数据包后,则会在未连接队列中为客户端的SYN包(seq=j)新增一个条目,表明已收到客户端的数据包。并且服务端会向客户端发送带有序号为k(seq=k),确认号为j+1(ack=j+1),并且控制位为SYN=1,ACK=1的数据包发送给客户端,等待客户端确认,此时服务端状态则为SYN_RECV。

第三次握手

客户端收到服务端的 SYN=1, ACK=1, ack=j+1, seq=k 的数据包后,则会响应一个ACK=1, seq=j+1, ack=k+1的数据包给服务端,表示客户端已收到服务端的数据包,并进入ESTABLISHED的状态,表示连接已建立。服务端收到ACK数据包后,则会将对应的未连接队列中对应的条目删除,并进入并进入ESTABLISHED的状态,表示连接已建立。

重试与容错

为什么TCP协议一定要进行3次握手,2次不行吗?

首先假设只进行两次握手,即服务端收到SYN数据包后马上建立连接,并开始传输数据,会有什么问题呢?

如果服务端接受到SYN数据后,立马为相应的客户端建立连接,但是,客户端如果因为某些原因(比如网络中断等),未收到客户端的ACK数据包,请求重新建立连接,并向服务端重新发送SYN数据包。此时在服务端又需要重新创建连接资源,但是旧的的连接实际是无效连接,反而浪费了系统资源。如果大量的客户端长时间超时重试,则会导致服务器的资源的严重浪费。

总结

TCP协议中,为了保证互联网中连接的可靠性,采用了3次握手的机制。为了防止因为建立连接中断时,而导致频繁建立无效连接,浪费服务器资源。服务端在第一次握手时则先维持一个未连接记录表,最后连接建立成功,再将未连接记录表中的数据删除。

责任编辑:赵宁宁 来源: FrenziedJavaLand
相关推荐

2022-11-17 10:20:49

TCP三次握手四次挥手

2023-09-02 22:02:58

TCP协议四次挥手

2020-08-27 07:41:28

TCP协议数据

2017-09-25 21:27:07

TCP协议数据链

2023-09-07 16:46:54

TCP数据传递

2015-11-09 09:58:56

2023-10-24 15:22:09

TCPUDP

2020-12-08 06:34:16

TCP握手SYN 报文

2022-10-10 07:34:36

TCP三次握手区块链

2015-10-13 09:42:52

TCP网络协议

2019-06-12 11:26:37

TCP三次握手四次挥手

2023-11-01 08:04:08

WiresharkTCP协议

2024-01-12 08:23:11

TCPACK服务器

2021-03-08 18:08:08

TCP Connect 协议

2022-07-25 07:07:35

TCP客户端服务器

2018-10-15 08:06:33

TCP握手原理

2023-03-06 15:43:56

2018-07-05 14:25:01

TCP握手原理

2019-12-12 10:36:43

TCPSYNIP

2022-07-07 09:00:17

TCP 连接HTTP 协议
点赞
收藏

51CTO技术栈公众号