TCP的可靠传输的保证和拥塞控制

   TCP和UDP是传输层的两个非常重要的协议,其中相对于TCP来说,UDP的是不可靠传输,实现机制比较简单。首先我们来看看TCP数据包的格式:


TCP提供一种面向连接的、可靠的字节流服务。 其主要特性有特性有以下几点:

(1)面向连接,在数据传送前必须建立连接,在数据传送结束后必须释放连接。意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。

(2)点对点,每一条TCP连接只能有两个端点。从socket角度来说,通信双方需要建立套接字,套接字由IP地址和端口号组成,数据到达传输层之后会被送到端口对应的应用程序。

(3)提供可靠交付服务。可靠交付后续讨论。

(4)支持全双工。数据在两个方向上流动。

(5)面向字节流。面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序数据看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

 TCP通过下列方式来提供可靠性:
1、应用数据被分割成TCP认为最适合发送的数据块。TCP在三次握手建立连接过程中,会在SYN报文中使用MSS(Maximum Segment Size)选项功能,协商交互双方能够接收的最大段长MSS值。MSS是传输层TCP协议范畴内的概念,顾名思义,其标识TCP能够承载的最大的应用数据段长度,因此,MSS=MTU-20字节TCP报头-20字节IP报头,那么在以太网环境下,MSS值一般就是1500-20-20=1460字节。但是如果主机没有填写这一项,该值的默认大小为536字节。客户端与服务器端分别根据自己发包接口的MTU值计算出相应MSS值,并通过SYN报文告知对方.MSS是控制TCP报文段的大小,发送窗口(TCP中发送方可发送的最大数据)的大小由窗口值和拥塞窗口值共同确定;



2、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据).

3、超时重传机制:当TCP发出一个数据后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。在未收到确认之前,这些已经发送的数据报将留在发送缓冲区,直到收到确认之后才清除已发送的数据.
4、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。  (对失序数据进行重新排序,然后才交给应用层).如果TCP的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据)
5、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)。一旦有一方来不及接受数据,势必会造成数据的丢失!!
6.以字节为单位的滑动窗口:

滑动窗口的基本原理可表示如下:


可以看到数据发送方维持了一个大小为20的发送窗口,其中发送前沿向前移动,强烈建议不向后移动,这个时候我们可以看到,当前发送方可以发送的字节序列从31-50为止,现在发送方可以发送的数据为20字节。


A已经发送了从31到41之间的11个字节序,其中32和33已经到达接收方,但31没有按序到达;


此时,B向A发出31的确认(表示31号没有收到),此时窗口值依然为20,因为此时B发送的是对31号的确认,A的发送窗口不能向前移动;随后B收到了31号字节,发送给A一个确认包,这个包的窗口值依然为20(假设窗口值不变),但此时确认号为34,这表明B已经收到了截至33号的所有数据,并把它们交付给了主机,然后将它们删除,B将接收窗口向后挪动3个单位,那么接受范围从34到53;随后,A接收到了B对31-33号数据的接收确认,A将发送窗口向后挪动3个单位,其中p2位置不变,此时代表A可以发送的字节序列为34-53;随后A的p2指针和p3重合,代表已经将所有可以发送的数据全部发送,但是还没有收到确认;


TCP的连接过程可表示为:


所以总结一下这个收发过程就是:

(1)客户端和服务器端各自建立套接字,通过彼此的套接字进行通信;

(2)服务器端绑定监听端口,然后监听,循环等待来自客户端的连接;

(3)一旦收到来自客户端的连接,进行三次握手,一旦连成功就fork()一个子进程来处理和当前客户端的连接,然后父进程继续监听客户端的连接;

(4)此后就是数据传输过程(如上图所示);

(5)一旦数据传输完毕就是放连接;

7.选择确认ACK:

选择确认是针对没有出错但是未按序到达的报文段,如果中间只是缺少一些报文段,那么发送方就可以不重传已发送的所有数据,而只是重传缺少的数据。课本上的具体例子如下:


拥塞控制方法:

(1)慢开始和拥塞避免:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。如下图:


在谢希仁的计算机网络中,是这样描述的:




(2)快重传和快恢复:





各种窗口和其作用:

(1)滑动窗口协议:TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报.

(2)发送窗口和接收窗口:在数据发送方维持的滑动窗口(个人觉得滑动窗口不应该从窗口的角度去理解,应该从滑动窗口协议也就是一种维持双方数据传传送的机制,也就是从动态的角度去理解滑动窗口)的大小(p3-p1)就是发送窗口,同时在接受方维持的滑动窗口叫接受窗口;发送方的发送窗口一定不能超过接收方的接收窗口;

(4)拥塞窗口:指源端在拥塞情况下一次性发送的最大报文段的数量。在刚开始的时候,双方不知道网络的通信状况,在一开始的时候将拥塞窗口值设置为1个报文段(此时数据发送方的发送窗口刚好等于1个报文段),每收到一个ACK, 拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗 口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。因为数据发送方一开始并不知道拥塞窗口的大小,所以刚开始以指数的方式探测,当达到一个门限值时,便线性增长。正如5.8式指出的那样,发送方的发送窗口等于拥塞窗口和接收窗口中较小者的值;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值