有没想过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短报文。
- 第二次,服务器发送应答,并建立缓存和变量。
- 第三次,客户机发送应答,并建立缓存和变量。