一、TCP的基本概述
1、TCP的基本特点
- TCP是面向连接的运输层协议
- 每条TCP连接只能有两个端点,TCP连接是点对点的。
- TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
- TCP提供全双工通信。
- 面向字节流
2、TCP与UDP发送报文的方式
TCP并不关心应用进程一次把多长的报文段发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节。如果应用进程传送到TCP缓存的数据块太长,TCP就把它划分短一些再传送;如果应用进程一次只发来一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
对UDP来说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。UDP一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文,若报文过长,UDP就把它交给IP层后,IP层在传送时就可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层之后,会使IP数据报的首部相对长度太大,也会降低IP层的效率。
3、TCP的连接
首先明确TCP是面向连接的,每一条TCP连接有两个端点,TCP连接的端点是套接字(socket)或插口。
套接字就是端口号拼接到IP地址,如下所示:
若IP地址是192.3.4.5,端口号是80,那么套接字就是(192.3.4.5:80)。
那么TCP连接唯一地被通信两端的两个套接字所确定。
二、TCP的可靠传输
1、停止等待协议
停止等待就是每发完一个分组就停止发送,等待对方的确认,在收到确认之后再发送下一个分组。
(1)超时重传
A只有超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而会重传前面发送过的分组。
要实现超时重传,就要在每发送完一个分组设置一个超时计时器,如果早超时计时器到期之前收到对方的确认,就撤销已设置的超时计时器。
停止等待协议优点是简单,缺点是信道利用率太低。
2、连续ARQ协议
连续ARQ协议就是流水线传输版本的停止等待协议。
位于发送窗口的5个分组都可以连续发送出去,而不需要等待对方的确认。
连续ARQ协议规定:发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方采用累积确认的方式,接收方不必对收到的分组逐个发送确认,而是在收到几个分组之后,对按序到达的最后一个分组发送确认。
三、TCP报文的首部格式
一个TCP报文段分为首部和数据部分,TCP首部的前20个字节是固定的,后面有4n字节是根据需要而增加的。
四、TCP的流量控制
流量控制是让发送方的发送速率不要太快,让接收方来得及接收。
1、利用滑动窗口实现流量控制
五、TCP的拥塞控制
拥塞的概念是若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。
- 拥塞控制是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载;前提是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程;
- 流量控制指点对点的通信量的控制,接收端控制发送端的问题;流量控制就是抑制发送端发送数据的速率,以便接收端来得及接收。
四种进行拥塞控制的算法:慢开始、拥塞避免、快重传、快回复;
1、慢开始和拥塞避免
发送方维持一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度,在动态的变化。发送方让自己的发送窗口等于拥塞窗口。
发送方拥塞控制窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去;但只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络的分组数。
(1)慢开始算法:
当主机开始发送数据时,如果立即把大量数据字节注入到网络,就有可能引起网络拥塞,但是因为不清楚网络的负荷状况。所以经验表明:先探测一下,即从小到大逐渐增大发送窗口,也就是从小到大增大拥塞窗口数值。
通常在刚刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS,在每收到一个对新的报文段的确认之后,把拥塞窗口增加至多一个MSS的数值。
使用慢开始算法之后,每经过一个传输轮次,拥塞窗口就会加倍。
为防止拥塞窗口cwnd增长过大引起网络拥塞,需要设置一个慢开始门限ssthresh状态变量,用法如下:
- 当cwnd<sstresh时,使用上述的慢开始算法;
- 当cwnd>sstresh时,停止使用慢开始算法而改用拥塞避免算法;
- 当cwnd=sstresh时,即可使用慢开始算法,也可以使用拥塞避免算法。
(2)拥塞避免算法
拥塞避免算法是让拥塞窗口cwnd缓慢增大,每经过一个RTT就把发送窗口的cwnd加1,而不是加倍。
无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
(3)加法增大乘法减小(AIMD)
加法增大是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞;
乘法减小是指无论在慢开始阶段还是拥塞避免阶段,只要超时(即可能出现网络拥塞),就把慢开始门限值ssthresh减半,即设置为当前的拥塞窗口的一半,并执行慢开始算法。
2、快重传和快恢复
(1)快重传算法
首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等待自己发送数据时才进行捎带确认。
发送方只要一连收到三个重复确认就应当立即重传对方尚未传到报文段,而不必等待为尚未传到的报文段的重传计时器到期。由于发送方能尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。
(2)快恢复算法
当发送方连续收到三个重复确认,就执行乘法减小算法,把慢开始门限减半,注意,不执行慢开始算法。
由于发送方现在认为网络很可能没有发生拥塞(如果发生拥塞,就不可能一连有好几个报文段连续到达接收方),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢的线性增大。