TCP阻塞控制详解

原创 2016年08月28日 16:16:01

TCP阻塞控制是TCP实现可靠传输的其中一个手段,本文重点讨论一下阻塞控制的原理和几个实现的算法。
为什么会产生TCP的阻塞呢,其实就是发送端发送的报文速度要接收端大。这样就会造成网络阻塞的问题,如果不使用一定手段进行控制,就会造成死锁。如图这里写图片描述
现在我们知道了网络阻塞是要必须要进行控制的,那我们现在要知道什么时候进行控制,一般是两个时刻:1.网络传输TCP报文过程中发生丢失报文,2.报文需要重传。
很明显报文丢失和重传其实都证明了网络出现了拥塞,阻塞是分两种情况的一种是阻塞比较严重,这种情况下一个明显特征就是重传定时器溢出了(重传定时器是一个发送端计算是否超时需要重传的工具)。重传定时器都溢出了,那肯定就是有很多报文没有按时发送到接收端或者接收端的ACK报文没有到达发送端。另一种情况是没有阻塞情况没那么严重的情况,这种情况的特征是同一个报文确定了四次,这也证明了这个报文传输过程中丢失了(如果对重传确定机制不熟悉的朋友可以看看TCP的其他一些博客了解一下,这里就不具体展开了)。
对于上面两种情况TCP采用的措施也是不同的,但是总体思想是一样的就是设立一个阻塞窗口,并且控制阻塞窗口来控制发送窗口(发送窗口=min(阻塞窗口,接收窗口)),TCP对于阻塞控制一共有四种算法,分别是慢开始,阻塞避免,快重传,快恢复四种算法。对于第一种情况就是重传定时器溢出的情况,TCP一般采取的措施是慢开始和拥塞避免。如图这里写图片描述
这种算法流程是阻塞窗口一开始使用从1开始以指数增长也就是(1,2,4,8,16……)。这样增长到ssthresh(慢开始门槛,我可以理解成从慢开始变回阻塞避免算法的一个分割线把),就转换为阻塞避免算法(17,18,19,20,21….),也就是逐步加一。如果碰到重传计时器溢出的情况,就立刻把阻塞窗口变成一,然后慢开始门槛变成出现阻塞时候的窗口值的一半。然后重新执行慢开始和阻塞避免算法。这种算法其实是付出很大代价的把阻塞窗口变成一意味着也把发送窗口也变成一,这种情况其实是付出很大代价的。。。但是没办法谁叫发生了重传定时器溢出呢。
另外一种情况是有一个报文的确定报文重传了三次(也就是发送了四次)。这种情况下的算法采用快重传快恢复,算法如图这里写图片描述。这种情况前面和上面算法是一样的,就是采取慢开始和阻塞避免算法,但是遇到重传四次重复的确定报文的时候。把ssthresh变成出现阻塞时候阻塞窗口的一半同时阻塞窗口也变成阻塞时候的阻塞窗口的一般,然后进行线性增加,也就是拥塞避免算法。
上面的就是我对TCP阻塞控制的一些总结。如果大家对这方面也有自己的见解,欢迎和我一起讨论。

TCP阻塞控制

TCP  阻塞控制            我们知道, 网络层的IP协议是不可靠的,没有提供可靠数据传输的机制,而传输层的TCP却提供了可靠数据传输的机制,依靠错误检测、超时、重传、流量控制和阻塞控制...
  • liaoxr
  • liaoxr
  • 2011年11月27日 00:55
  • 4262

TCP堵塞控制

TCP堵塞控制   前言 在介绍之前,先来说一下最近可能让我感到迷惑的概念:   TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为...

TCP/IP总结1:阻塞socket和非阻塞socket

序:前段时间狂看了很多关于网络编程的资料,这里自己总结一下,以便自己以后可以参考。 什么是阻塞socket,什么是非阻塞socket。对于这个问题,我们要先弄清什么是阻塞/非阻塞。阻塞与非阻塞是...

TCP网络拥堵算法

TCP网络拥堵算法 这个算法解释了网络传输为什么一开始快,后面变慢了。 TCP传输的速度基本是这样的: 横坐标是传输次数,纵坐标是“拥塞窗口”数。 A-B:慢开始段。先发几个包...

TCP send 阻塞与非阻塞

原文连接: http://blog.chinaunix.net/uid-8489474-id-2031025.html tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠...

Java中重写方法应该遵循的规则包括

1可以有不同的访问修饰符, 2 参数列表必须完全与被重写的方法相同。 总结的来说 方法名相同,参数类型相同, 子类返回的类型等于父类返回的类型 子类抛出的异常小于等于父类抛出的异常, 子类...

用scanf读入多行数据

在线笔试,采用scanf读入读入多行输入数据,采用循环时的解决方案。
  • Lmikic
  • Lmikic
  • 2016年09月19日 09:51
  • 2605

TCP协议详解(慢启动,流量控制,阻塞控制之类)

UDP协议提供了端到端之间的通讯,应用程序只需要在系统中监听一个端口,便可以进行网络通讯。随着计算机网络的发展,计算机网络所承载的业务越来越多,有些业务数据的传输需要具备可靠性,譬如我们在进行在线聊天...

Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)

上节我们实现了一个简单的多进程的服务器程序,这节,我们服务器的框架不做修改,只是将其修改为一个多线程的服务器程序。直接上代码server #include #include #include #...
  • gatieme
  • gatieme
  • 2016年03月03日 21:41
  • 2506

TCP send函数 阻塞发送数据详解

send函数  int send( SOCKET s,    const char FAR *buf,    int len,    int flags );     不论是客户还是服务器应...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP阻塞控制详解
举报原因:
原因补充:

(最多只允许输入30个字)