TCP为什么需要建立连接? 为什么需要3次握手, 2次不行吗?
-
首先,TCP是双向且可靠的连接, 那么在数据的发送前, 必须要保证数据能够到达对方, 这就是建立连接的目的。如果都不能保证两者建立连接, 那么所谓的可靠的就没有意义了。
-
其次, 既然TCP是双向且可靠的连接, 那么就必须要做到 客户端发送的数据服务端能够收到, 服务端发送的消息客户端也能够收到,将TCP的三次握手的按照发送顺序分别编号为1、2 和 3,接下来分别看它们的作用:
-
第1条报文:客户端向服务端发问
(SYN = 1)
:“ 我向你发起连接请求, 你能不能收到 ? ”,
-
第2条报文: 服务端回答
(ACK = 1)
客户端的这个问题:“ 你发的连接请求我能够收到。”
-
如果只有这两条报文的话,服务端不确定客户端是否能够收到他的消息
该条报文还有一个作用:服务端向客户端发问
(SYN = 1)
:“ 我发的回复请求, 你能不能收到 ? ”
-
该条报文有着承上启下的作用
-
-
-
第3条报文: 客户端回答
(ACK = 1)
服务端的这个问题:“ 你发的回复请求, 我能收到。 “
-
经过这三条报文, 不仅客户端和服务端都能够收到对方的消息, 而且还有一个很有意思的现象,即 客户端知道服务端能收到客户端的消息(因为客户端收到了第二条报文), 服务端也知道客户端能收到服务端的消息(因为服务端收到了第三条报文), 通俗来讲就是你和我彼此知道,也知道彼此知道,这能保证双向和可靠,当然保证TCP可靠的机制有很多,但毫无疑问三次握手是最基本的。
-
最后, 看一下双方状态的转换:
-
首先服务端进入
LISTEN
状态, 等待客户端的连接请求; -
然后客户端发送第一个报文进入
SYN_SENT
状态, 等待服务端的回应; -
服务端收到第一条报文时, 发送第二条报文以进入
SYN_RECV
状态; -
当客户端收到第二条报文时, 发送第三条报文以进入
ESTABLISHED
状态, 注意这里的已连接。只是单方面的表示客户端能够收到服务端的消息(相当于半连接), 只有当服务端收到第三条报文并进入ESTABLISHED
状态时, 双方才建立了真正的连接。
-
抄袭 转载请说明文章来源:TCP为什么需要建立连接? 为什么需要3次握手, 2次不行吗?