阅读本文大概须要 2.3 分钟。程序员
做者:雨林面试
https://www.cnblogs.com/yuilin数据库
在TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接。编程
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;服务器
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;微信
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。架构
经过这样的三次握手,客户端与服务端创建起可靠的双工的链接,开始传送数据。并发
三次握手的最主要目的是保证链接是双工的,可靠更多的是经过重传机制来保证的。ui
可是为何必定要进行三次握手来保证链接是双工的呢,一次不行么?两次不行么?咱们举一个现实生活中两我的进行语言沟通的例子来模拟三次握手。spa
老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?
结果乙带着耳机听歌呢,根本没听到,没反应。甲内心想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的状况下沟通确定是失败的。
若是乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。
乙听到了甲说的话,可是他是老外,中文很差,不知道甲说的啥意思也不知道怎样回答,因而随便回答了一句学过的中文 :我去厕所了。甲一听马上笑喷了,“去厕所吃饭”?道不一样不相为谋,离你远点吧,沟通失败。说明乙没法作出正确应答的状况下沟通失败。
若是乙听到了甲的话,作出了正确的应答,而且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
经过前两次对话证实了乙可以听懂甲说的话,而且能作出正确的应答。接下来进行第三次对话。
甲刚和乙打了个招呼,忽然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙本身晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲没法作出应答的状况下沟通失败。
若是甲也作出了正确的应答:我也吃了。那么第三次对话成功,两人已经创建起了顺畅的沟通渠道,接下来开始持续的聊天。
经过第二次和第三次的对话证实了甲可以听懂乙说的话,而且能作出正确的应答。
可见,两我的进行有效的语言沟通,这三次对话的过程是必须的。
同理对于TCP为何须要进行三次握手咱们能够同样的理解:
为了保证服务端能收接受到客户端的信息并能作出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端可以接收到服务端的信息并能作出正确的应答而进行后两次(第二次和第三次)握手。
买手机的时候试通话功能的时候:
老机打给新机 : 喂 , 听到了吗 ?
新机回复老机 : 听到了 , 你听到了吗 ?
老机 : 听到了听到了 …
验证通话功能OK !
·END·
程序员的成长之路
路虽远,行则必至
本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。
微信ID:cxydczzl
往期精彩回顾