TCP为什么做三次握手、四次挥手

TCP 是为了解决可靠传输出现的。为了实现可靠性,TCP 做了流量控制、拥塞控制,并且在建立、关闭连接前做些机制:三次握手、四次挥手。

三次握手是为了让客户端、服务器在建立连接前能保证相互可以发送、接收报文;

四次挥手也一样,客户端、服务器保证相互都得知要关闭时再关闭连接。

如果建立、关闭连接前没有做出这种保障,而直接发送报文或率先关闭,会出现报文丢失等风险。

(注意这里的保证不是指百分百的)

那为什么是三次握手?而不是两次、四次?

假如客户端 A、服务器 B,这里用打电话来做比喻:

  1. A 说:喂喂,听得到吗?

  2. (B 听了之后,知道了自己能听到 A 讲的话。)

    B 回复说:可以。你能听得到吗?

  3. (A 听了之后,他就能知道 B 可以听到自己的讲的话,并且自己也能听到 B。

    但此时 B 还不知道 A 能不能听得到他自己说的话,所以 A 还要回复。)

    A 回复:嗯,听得到。

    这时 A、B 便可以知道相互都能说、听,接下来可以开始聊了(即建立连接开始发送数据)。

如果是两次握手

从上面例子就能看出,如果只做两次握手,假如当 A 手机没电被关机时,B 就可能不知道情况而一直讲话。

所以,建立连接前,如果想可靠传输,必须要先保证相互能正常接收报文。

如果是四次握手

四次五次或者更多都可以,但这样其实会有点多余了。所以做三次握手即可。

为什么是四次挥手?而不是一次、两次、三次?

与上面例子一样,客户端 A、服务器 B 在打电话:

  1. A 说:我困了,想睡觉。

  2. B 回复:OK,等我还有些事要跟你讲。

  3. B 讲完后,说:我说完了,你去睡吧,拜拜。

  4. A 回复:嗯,晚安。

    这时 A、B 就可以挂电话了。

    说完,A 等 2 秒后挂了电话,同时 B 听到回复后也挂了,即关闭了连接。

如果是一次、两次挥手

从上面例子可以看出,因为 B 可能还有话要讲,所以 A 不能说完就挂掉。

如果是三次挥手

B 说拜拜后直接关闭,他就不确定 A 有没有听到他之前(2到3)讲的话。并且假如 A 恰好没有听到 B 说拜拜,A 就可能一直拿着电话。

所以 B 还要等 A 的回复。

第四次挥手后,客户端为什么还要等 2MSL 的时间后再关闭连接?

(这里 MSL 是:Maximum Segment Lifetime,即报文最大生存时间。是任何报文在网络中存在的最长时间。超过这个时间将被丢弃。)

同上,如果 A 直接关掉,假如 B 没有收到第四次挥手,他就不知道 A 有没有听到自己讲过的话。

所以 B 超过一段时间没收到的话,会再次跟 A 说拜拜。而 A 等待的 2MSL 的时间内,可以接收到该重发的消息,这样 A 就可以再次向 B 回复。(A、B 都有超时机制,如果还是一直收不到会断开连接。)

此外,A 直接关闭的另一个风险就是:如果 A 的原进程端口恰好又被其他新进程占用,那么新进程就会被接收到来自 B 的消息。

猜你喜欢

转载自www.cnblogs.com/eycuii/p/11961229.html