运输层——TCP协议

来源:互联网 发布:矩阵的零次幂 编辑:程序博客网 时间:2024/05/23 23:12

一、TCP协议概述

TCP协议——传输控制协议,可靠性连接协议。使用于一对一的可靠性传输数据的应用,比如打电话,电子邮件等等,基于http协议的web服务器,底层用的就是TCP协议,可见TCP协议的重要性。


二、TCP的主要特点

a、TCP协议是面向连接的运输层协议。应用层在TCP连接之前必须建立TCP连接(三次握手),在传输完数据后要释放连接(四次挥手)。

b、TCP协议针对一对一服务。每一条TCP连接只能是点对点的。

c、TCP提供可靠交付服务。通过TCP传送的数据,无差错(差错校验),不丢失(超时重传机制),不重复(对重复的数据报不再进行确认),并且按序到达(窗口确认机制)。

d、TCP提供全双工通信。TCP允许通信双方的应用程序在任何时候都能够发送数据,TCP连接两端都有发送缓存和接受缓存。

e、面向字节流。TCP把应用程序交下来的数据看成仅仅是一连串无结构的字节流,TCP并不知道字节流的含义。TCP并不关心应用程序一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络的拥塞程度来决定应当包含多少个字节。


三、可靠性传输的原理

(1)传输信道上不产生差错。当出现差错时让发送方重传出现差错的数据。

(2)不管发送方以多块的速度发送数据,接收方总是来得及处理收到的数据。如果接收方来不及处理收到的数据时,应该及时告诉发送方适当降低发送速率。

这样,使得本来不可靠的传输信道能够实现可靠传输了(IP层只做到尽最大努力交付)。


四、滑动窗口

滑动窗口的协议比较复杂,是TCP协议的精髓所在。连续的ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。现在接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组以后,对按序到达的最后一个分组发送确认。这就表示:到这个分组为止的所有分组都已经正确收到了。

累积确认有优点也有缺点:优点是容易实现,即使确认丢失也不必重传。但是缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。


五、超时重传机制及时间选择

TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。

现在来说下设置超时重传的时间。超时重传的时间如果设置的太短,会引起很多报文段不必要的重传,这样会使得网络上的负荷增大。当时如果把超时重传的时间设置的太长,又会使网络空闲的时间增大,降低了传输的速率。

TCP采用了一种自适应算法,他记录了一个报文段发出的时间,以及受到相应的确认时间,这两个时间之差就是报文段的往返时间RTT。


六、TCP的流量控制和持续计时器

所谓的流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收。滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP窗口的单位是字节,不是报文段。

我们要考虑一种情况,就是接收方告诉发送方自己的窗口值是0的时候,发送方就不再发送数据等待接收方告诉发送方自己的窗口值非零的时候才继续传输数据。假定这个时候接收方给发送方发送了窗口值非零的报文段,然而这个报文段在传送的过程中丢失了。那么发送方一直等待接收方非零的窗口通知,二接收方也一直等待发送方发送数据。这样子就造成了死锁的局面。

怎么解决这个问题呢?TCP为每一个连接都设有一个持续计时器,要TCP的一方收到了对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到了,就发送一个零窗口的探测报文段(仅携带一个字节),而对方就在确认这个探测报文段的时候给出现在的窗口值。如果窗口值还是零,那么收到这个零窗口值报文段的一方就要重新设置持续计时器。如果窗口值不为零,那么死锁的僵局就打破了。

                                                        

七、TCP的拥塞控制

在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这就是拥塞的概念。   

所谓的拥塞控制就是防止过多的数据注入网络中,这样可以使得网络中的路由器或链路不致过载。拥塞控制所要做的就是网络能够承受现在网络负荷。拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络已出现麻烦,必须放慢发送速率。


八、四种拥塞控制方法

(1)慢开始。慢开始算法的思路是这样的,当主机开始发送数据时,如果立即把大量的数据字节注入网络中,那么就有可能引起网络拥塞,因为现在并不清楚网络的状况。最好的方法就是先探测一下,即由小到大逐渐增大拥塞窗口数值,通常在刚刚开始发送报文段的时候,先把拥塞窗口cmnd设置为一个最大的报文段MSS的数值,而每收到一个对新的报文段的确认以后,拥塞窗口cwnd就加倍。慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时设置cwnd=1(目的是探测网络上的拥塞情况)。

为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限。

(2)拥塞避免算法。当拥塞窗口值已经达到慢开始门限,就采用拥塞避免算法。思路是让cwnd缓慢增大,每经过一个往返时间RTT就将拥塞窗口cwnd加1.这样,拥塞窗口按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢的多。

当然,无论是慢开始还是拥塞避免算法,只要发送方判断出网络出现拥塞(没有按时收到确认)就要把慢开始门限设置为当前出现网络勇摄时发送方窗口值的一半,然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。

(3)快重传算法。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认而不要等待自己发送数据时才进行捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,二不必继续等待设置的重传计时器到期。由于发送方能够尽早重传未被确认的报文段,因此采用快重传后可以使整个网络的吞吐量提高约百分之二十。

(4)快恢复。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞。然后cwnd不设置为1而是设置为新的慢开始门限值然后进行拥塞避免算法(cwnd每次加1),使得拥塞窗口缓慢的线性增大。


九、为什么要建立三次握手。最后一次请求方为什么还要发送确认报文?

为什么A(请求方)还要发送一次确认呢?这是因为防止已经失效的连接请求报文段突然又传送到了B(被请求方),因而产生了错误。所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常的情况。A发出连接请求,但是因连接请求报文丢失而为收到确认,于是A在重传了一次连接请求,后来收到了确认,建立了连接。当数据传输完毕后,就释放了连接。A共发送的两个连接报文段,其中第一个丢失了,第二个到达了B。假定出现了一种异常的情况,就是A发出的第一个连接请求报文段并没有丢失而是在某些网络结点长时间滞留了,以致于延误到连接释放以后的某个时间才到达B。本来就是一个早就失效的报文段,但是B收到此失效的连接请求报文段后,就误以为这是A又发出的一个新的连接请求,于是又向A发送了确认报文段,同意建立起连接。假定不采用三次握手,那么只要B发出了确认,那么新的连接就建立了。这样B的许多资源就白白浪费了,所以采用三次握手建立连接可以防止上述现象的发生。


十、为什么要进入TIME-WAIT状态?

若是A主动发起断开连接请求,B收到请求后,同意断开连接并且也发送了请求关闭连接的请求并且发送确认,A收到以后还要对B发送断开连接的请求后的确认报文。并进入TIME-WAIT 状态,等待2MSL时间。

(1)为了保证A发送的最后一个ACK报文段能够到达B。

(2)防止上述提到的“已失效的连接请求报文段”出现在本连接中。这样可以使本连接持续的时间内所产生的所有报文段都从网络上消失。


十一、如果客户端和服务器建立了连接后,客户端的主机突然出现了故障,此时服务器应该怎么做?

显然,服务器以后都不能够再收到客户发来的数据了。因此,应当有的措施是使服务器不要在白白等待下去,这里使用的就是保活计时器。服务器每次收到一次客户的数据,就重新设置保活计时器,时间一般设置两个小时。若是两个小时没有收到客户的数据,服务器就发送一个探测报文段,然后以后每隔75分钟就发送一次。如果连续发送10个探测报文段后任然没有客户响应,服务器就认为客户端出现了故障,然后就关闭这个连接。      


十二、TCP的有限状态机