为什么是TCP连接是三次握手?而不是两次或四次?

其实这个问题在谢希仁版的《计算机网络》里说了:

三次握手是 保证双方都得知自已和对方收发能力正常 的最低值

先来看一下三次握手的过程:

为什么是TCP连接是三次握手?而不是两次或四次?_第1张图片

第一次握手: 客户端向服务器发送seq为x的SYN包(这里的SYN包指的是TCP报文头部TCP flag标记位SYN为1的包,下面的ACK同理)后,进入同步发送SYN-SENT状态,等待服务器确认。

第二次握手: 服务端收到客户端的SYN包后,对其进行确认,初始化seq并将ack序号+1,请客户端发送SYN+ACK包,服务器进入SYN-RECV同步接收状态

第三次握手: 客户端收到服务端的同步确认包后,向服务器发送ACK确认包(ack=y+1,seq=x+1),此时包发送完成,客户端和服务器进入ESTABLISHED状态。(ps:这次握手可以携带数据)

关键在于第三次握手,发送的是ACK包,表示对服务端消息的一个确认,前两次连接已经完成同步了,为什么还要做这个确认呢?

第一个原因:是为了初始化seq序列号,通过这个序列号来保证最终的数据有序

第二个原因就是文章首段所说:保证双方都得知对方的接收、发送能力正常。其中第三次握手是为了让服务端得知客户端的接收能力正常、服务端的发送能力正常

可以通过下面这张表来分析:
为什么是TCP连接是三次握手?而不是两次或四次?_第2张图片

也就是说:如果只进行两次握手,服务端不知道客户端能否接收消息,同时也不知道自已的消息发出去了没有,三次握手已经保证了TCP连接的需求,所以就不用第四次握手了

关于三次握手一个深动形象的例子

三次握手:
A:“喂,你听得到吗?”
B:“我听得到呀,你听得到我吗?”
A:“我能听到你,今天balabala……”

两次握手:
A:“喂,你听得到吗?”
B:“我听得到呀”

B:“喂喂,你听得到吗?”
A:“啊,我听得到呀!!!!”
B:“那你干嘛不说话啊!!”
A:“……”

四次握手:

A:“喂,你听得到吗?”

B:“我听得到呀,你听得到我吗?”

A:“我能听到你,你能听到我吗?”

B:???

你可能感兴趣的:(Java,Web)