TCP三次握手(为什么要三次握手?)

引言

在面试的时候最关于计算机网络最常问的算是TCP协议了,TCP的全称是Transmission Control Protocol,是一种传输控制协议,也是一种可靠的,面向连接的传输协议,它是属于传输层。在一些网络通信的项目当中,很多人都会使用TCP去连接客户端与服务端,但是TCP在连接之前会进行三次握手,那么问题来了为什么要进行三次握手,而不是两次握手,或者四次握手呢?

正文

相信很多人在学习计算机网络的时候都会把TCP的三次握手记下来,都会记住TCP的一些作用什么的,却不知道为什么要进行三次握手,那么下面简单的解释下,这也是昨天晚上在知乎上看的,很搞笑,也很容易理解。

  • 三次握手
C:“喂,你听得到吗?”
S:“我听得到呀,你听得到我说得吗?”
C:“我能听到你,balabala.....”
  • 两次握手
C:“喂,你听得到吗?”
S:“我听得到呀”
C:“喂喂,你听得到吗?”
S:“草,我听得到呀!!!”
C:“你TM能不能听到我说话啊!!”
S:“.....”
  • 四次握手
C:“喂,你听得到吗?”
S:“我听得到呀,你听得到我说得吗?”
S:“我能听到你,你能听到我说话吗?”
C:“.....不想跟傻逼说话”

以上对话出自知乎,笑死我了。
很多地方,很多博客,还有一些书上都只是介绍了TCP的三次握手四次挥手的原理,以及实现过程,却都没有介绍为什么要进行三次握手。在一次阿里的面试中,也被问到过TCP的三次握手和四次挥手的原理,还以为这样就问完了,然而并没有,面试官又问了三次握手的过程中假如有一次“断了”,失败了会怎么样,当时就说了会进行重传,然后如果再失败再重传几次,但是具体次数也不确定,最后还是失败就会重新开始三次握手,以前做过实验是这样了。

三次握手过程

TCP three handshake
通过上面知乎的那几段对话,可以理解为什么要进行三次握手,上图是TCP三次握手的具体过程,“SYN seq”其实就是同步序列,首先Client先发送一个同步序列,也就是特定的一个数据包给Server,然后Server接收到这个同步序列(Client发来的那个数据包),在上图中x就是代表这个同步序列,Server对这个同步序列x进行加1操作后,返回给Client说明这个同步序列x已经被Server收到了(也就是图中的ACK确认),并且Server再发送自己的一个同步序列y给Client(注意Server发送给Client的两个数据在这里是同一步操作完成的),最后Client收到Server发来的ACK确认和Server发来的一个特定的数据包,也是Server的同步序列y,对y进行加一操作后(这个操作就是为了说明Client已经收到了Server的同步序列),再次发送给Server,Server收到y+1的确认数据包后结束三次握手,成功建立连接。

至于为什么要弄一个x和一个y的同步序列,再返回这个同步序列确认呢,弄这么麻烦其实就是为了Client发送过去的这个特定的数据包,Client要知道Server能成功接收并处理了,反过来Server发送过去的特定的数据包,Server也要知道Client能成功接收并处理了,就是这么个原理,这样才能成功建立TCP连接。而上面的两次握手为什么会发生这样的情况呢?其实就是C发送过的话,S已经确认返回过去了(C能知道他说的话S能听到了),但是S不知道C有没有收到他的返回过去的话,所以才导致以上情景。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值