接触网络协议栈TCP/IP的人,就一定绕不开的一个话题就是TCP的三次握手。下面我将简单介绍一下。
三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起。
当然也可以更通俗的去理解:
-
“喂,你听得到吗?”
-
“我听得到呀,你听得到我吗?”
-
“我能听到你”
三次握手为什么不用两次,或者四次
原因很简单,因为只有三次才是最合适的,三次通信是最小值,两次通信满足不了要求,而四次通信则显得冗余。
比如之前的三次改成两次,四次的结果就变味了。
两次握手:
-
“喂,你听得到吗?”
-
“我听得到呀”
-
“喂,你听得到吗?”
-
“草,我听得到呀!!!!”
-
“你TM能不能听到我讲话啊!!喂!”
-
“……”
四次握手:
-
“喂,你听得到吗?”
-
“我听得到呀,你听得到我吗?”
-
“我能听到你,你能听到我吗?”
-
“……不想跟傻逼说话”
TCP的三次握手流程
-
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
-
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
-
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP“三次握手” 这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。这可视为对“三次握手”目的的另一种解答思路。