码迷,mamicode.com
首页 > Web开发 > 详细

web----tcp三次握手

时间:2019-09-22 11:12:13      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:bsp   现象   img   随机   数据传输   发送   mamicode   取数据   --   

1、首先为什么需要握手

首先我们看一下TCP报文段的结构

技术图片

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

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

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

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

第一次,客户机发送TCP短报文。

第二次,服务器发送应答,并建立缓存和变量。

第三次,客户机发送应答,并建立缓存和变量。

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

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

2、为什么需要握手3次

TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。 如果采用两次的话,会出现下面这种情况。 比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机; 于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。 传完东西后,断开。 结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。 2. 三次握手改成仅需要两次 握手,死锁是可能发生 考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。这样就形成了死锁

 

TCP中的seq

TCP连接中传送的字节流中的每个字节都按顺序编号,第一个字节的编号由本地随机产生

seq其实就是这个报文段中的第一个字节的数据编号。

例如,一段报文的序号字段值是 200 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从300开始;

[200,300)长为100!!!

 

web----tcp三次握手

标签:bsp   现象   img   随机   数据传输   发送   mamicode   取数据   --   

原文地址:https://www.cnblogs.com/yanxiaoge/p/11565944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!