加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

有没想过TCP为什么要先握手再发送数据

发布时间:2018-11-17 17:49:58 所属栏目:教程 来源:慕名linux嵌入式
导读:再看计算机网络的时候,始终有一个问题总是弄不明白,那就是TCP为什么要先三次握手,然后再是发送数据,最后在断开。注意这里的问题是为什么要先,再次强调的是先三次握手在发数据的疑问,而不是把TCP为什么要先三次握手放在百度上百度后出现的TCP为什么不

再看计算机网络的时候,始终有一个问题总是弄不明白,那就是TCP为什么要先三次握手,然后再是发送数据,最后在断开。注意这里的问题是为什么要先,再次强调的是先三次握手在发数据的疑问,而不是把“TCP为什么要先三次握手”放在百度上百度后出现的“TCP为什么不是2或者4次握手的问题”,有时候还真的是不得不吐槽百度的算法还真不如google,下图为证:

有没想过TCP为什么要先握手再发送数据

额。。。至于google的搜索由于要用到翻墙的软件,影响不好就不贴图了。。。继续我们得话题,回答一下这个问题吧,当然这是我的感悟,还是那句话“若是有问题,还是请到评论区写出自己的见解,以免误人子弟哈”。

要回答这个问题首先得知道TCP报文段的结构,如下图:

有没想过TCP为什么要先握手再发送数据

要说的就是TCP报文段中的窗口这16位字段部分,这里窗口的作用就是为了实现流量的控制,为什么会有流量的控制的引入???它是这样来的:若是发送方发送数据的速度大于了接收方应用程序取数据的速度(假设数据传输过程不拥塞)那么,接收方就会出现失贞的现象,也就是把数据覆盖了,所以数据的发送就要得到控制,就引入了窗口这16位。怎么引入的??

是这样的:发送方和接收方都有一个缓存区(用来接收从网络传来的数据,并提交给应用程序),对于接收方来说,它要维护两个变量值,一个是应用程序从缓存读出去的数据(out来表示);另一个是从网络接收的数据(in来表示),,那么在接收方一个缓存里面剩余的空间就是Buffer-(in - out) = window(假设Buffer表示缓存的数量个数,in - out 表示应用程序没读的个数,也就是缓存被占用的个数,总的减去占用的就是可以利用的空间的个数用window来表示),那么这个window就是窗口所要写入的值,接受方会把这个值传递给发送方表示我还有多少空间可以利用。

同样发送方也会有一个缓存,同样要维持两个变量值:一个是已经发送的数据个数(send);另一个是已经得到确认的数据个数(acked),那么send - acked就表示已经发送出去了,但是还没有得到确认的数据的个数,换句话就是正在传输的数据(这样理解好点,但是有点不对),那么要让接收方缓存数据不被覆盖,那么正在发送的数据要小于接收方的窗口(send - acked < window)。

写以上这些是为了深入理解窗口的概念!!!!仅此而已为理解TCP为什么要握手做准备!!!

在简单说一下三次握手的过程:

  • 第一次,客户机发送TCP短报文。
  • 第二次,服务器发送应答,并建立缓存和变量。
  • 第三次,客户机发送应答,并建立缓存和变量。

注意也就是在三次握手时就建立了缓存,那么也就是说,A与B要通信,两者之间必须先约定好一些参数,比如这里的缓存,那么依据上面的理论来说,建立缓存的目的就是为了避免不可靠的传输数据(也就是为了避免数据被覆盖),所以在传输数据之前,两者之间先做一些约定,换句话就是在做交易时先谈好地点和时间,在做交易。

那么,总的来说,所谓的链接就是为了分配内存等资源,然后避免不可靠的传输,以免污了TCP可靠传输的名头!!!

【编辑推荐】

  1. 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息 - 网络·安全技术周刊第364期
  2. 浅析区块链隐私保护技术之门罗币 - 网络·安全技术周刊第365期
  3. 21个触目惊心网络犯罪统计数据 - 网络·安全技术周刊第366期
  4. 微信自动抢红包,原来是这样实现的 - 网络·安全技术周刊第367期
  5. 通过Shopify平台案例探究微服务安全 - 网络·安全技术周刊第368期
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读