标签:tcp连接 发包 高性能 soc 分享 位置 解决 ssi 资源
消息应答:在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK)
通信过程
TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发送之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。
如果没有收到确认应答,发送端就会认为数据已经丢失,并进行重发。
未收到确认应答有三种情况:
1.数据未发送成功
2.数据发送成功,只是确认应答的包丢失啦
3.数据发送成功,确认应答没有在特定的时间间隔内收到确认应答
由于确认应答延迟到达,在源主机重发数据以后才到达的情况,导致源主机按照重发机制给目标主机反复发相同的数据。所以就得引出一种机制,能够识别是否已经接收数据,又能够判断是否需要接收。所以引出 序列号。
序列号可以解决确认应答处理,重发控制以及重复控制等功能
确认应答中携带序列号,告诉源主机,下一次应该从哪里发送
重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。
那么它是如何确定的呢?
由于重发超时受数据报途径的网络环境的不同而有所变化,TCP要求不论处在何种网络环境下都要提供高性能通信,而且无论网络拥堵情况发送何种变化,都必须保持这一特性。所以,它在每次发包时都会计算往返时间及其偏差。
重发超时 > 往返时间+偏差 (稍大一点)
如果数据重发之后还是收不到确认应答,则进行再次发送。此时,确认应答的时间将会以2倍、4倍的指数函数延长。不过当反复重发多次之后,就会强制关闭连接,并且通知应用通信异常强行终止。
TCP是面向连接的通信传输,所以通信之前要先做好通信两端之间的准备工作。
TCP三次握手 四次挥手
请详细介绍一下TCP协议建立连接和终止连接的过程?
三次握手建立连接时,发送方再次发送确认的必要性?
四次挥手释放连接时,等待2MSL的意义?
在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS:Maximum Segment Size),最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度
TCP传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时,也是以MSS为单位
MSS的确定过程
MSS是在三次握手的时候,在两端主机之间计算得出的,一般是 MTU = IP首部(20字节)+TCP首部(20字节)+MSS
MTU 是数据链路层的最大传输单元
TCP以1个段为单位,每发一个段进行一次确认应答的处理,这样的传输方式有一个缺点:包的往返时间越长通信性能越低
引入窗口,确认应答不再是以每一个分段,而是以更大的单位进行确认时,转发时间将会被大幅度缩短。也就是说发送端主机,在发送一个段以后不必要一直等待确认应答,而是继续发送。
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。
滑动窗口控制:收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。
数据已经到达对端,没有收到确认应答的数据都会被重发,这是没有使用窗口控制的时候发生的
使用窗口控制,某些确认应答即便丢失也无需重发,可以通过下一个确认应答进行确认
高速重发控制:当某一报文段丢失后,发送端会一直收到序号为xxx的确认应答,当连续3次收到同一个确认应答,就会将其所对应的数据进行重发
TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是所谓的流控制。
它的具体操作是,接收端主机向发送端主机通知主机可以接收数据的大小,而是发送端会发送不超过这个限度的数据,该大小限度就被称作 窗口大小。
所以窗口大小的值就是由接收端主机决定的。
TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端,这个字段值越大,说明网络的吞吐量越高。
不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。这也就形成了一个完整的TCP流控制。
当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅含有一个字节以获取最新的窗口大小信息。
在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。
TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念,于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)发送数据,之后每收到一个确认应答,拥塞窗口的值就加1MSS。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小作比较,然后按照他们当中较小那个值,发送比它还要小的数据量。
如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1MSS 以后再进行慢启动修正。有了上述这些机制,就可以有效地减少通信开始时连续发包导致的网络拥堵,还可以避免网络拥塞情况发生。
不过,随着包的往返,拥塞窗口也会以2、4倍指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生,为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许一下面这种比例放大拥塞窗口:
拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。
TCP的通信开始时,并没有设置相应的慢启动阀值,而是在超时重发时,才会设置为当时拥塞窗口一半的大小。
由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。
而由重复确认应答进行高速重复机制,慢启动阀值的大小被设置为当时窗口大小的一半。然后将窗口的大小设置为该慢启动阀值+3个数据段的大小。
当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会极速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好像是在逐步占领网络带宽的感觉
Nagle算法
也是TCP粘包的根源
如果不满足这两个条件,那么数据暂时等待一段时间再发送。
1.已发送的数据都已经收到确认应答时
2.可以发送最大段长度(MSS)的数据时
延迟确认应答
没有必要收到数据就进行确认应答
延迟一段时间的机制:
1.在没有收到2*最大段长度的数据为止不做确认应答(根据操作系统的不同,有时也有不论数据大小,只要收到两个包就即刻返回确认应答的情况)
2.其他情况下,最大延迟0.5秒发送确认应答(很多操作系统设置为0.2秒左右)
捎带应答
TCP的确认应答和回执数据可以通过一个包发送。这种方式叫做捎带应答。
比如,进行http通信 客户端发送请求,服务端返回响应数据
标签:tcp连接 发包 高性能 soc 分享 位置 解决 ssi 资源
原文地址:https://www.cnblogs.com/tangkaishou/p/9429527.html