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

网络 通信技术
再看计算机网络的时候,始终有一个问题总是弄不明白,那就是TCP为什么要先三次握手,然后再是发送数据,最后在断开。

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

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

要回答这个问题首先得知道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可靠传输的名头!!!

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2023-09-07 16:46:54

TCP数据传递

2022-07-25 07:07:35

TCP客户端服务器

2019-07-19 06:58:03

TCP三次握手网络协议

2019-12-12 10:36:43

TCPSYNIP

2024-10-14 16:40:59

2020-09-21 07:55:40

退款交易

2021-04-30 13:32:17

TCP三次握手网络协议

2020-03-10 08:27:24

TCP粘包网络协议

2019-05-14 10:09:06

TCP连接握手

2024-07-10 12:00:42

2024-10-16 08:38:37

TCP编号信息

2016-09-22 16:06:21

微服务架构RPC框架

2010-02-03 11:08:44

IT人

2021-12-13 06:23:14

TCP三次握手网络

2021-05-28 09:08:20

TCP连接序列号

2021-03-26 10:04:38

数据结构技术

2023-02-10 08:58:46

2021-09-09 08:47:57

TCP三次握手协议

2019-05-05 05:39:23

TCP三次握手网络协议

2024-06-05 10:07:00

限流微服务算法
点赞
收藏

51CTO技术栈公众号