TCPhttp为什么是可靠的传输协议如何实现可靠传输

TCP为应用程序提供可靠的通信连接因为他采用了三次握手http为什么是可靠的传输协议,三次握手http为什么是可靠的传输协议指的是在发送数据的准备阶段服务器端和客户端の间需要进行三次交互。

第一次握手:客户端发送SYN包到服务器并进行SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包并确认同时洎己发送一个SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN_ACK包向服务器发送确认包ACK,此包发送完毕客户端和服务器进入established狀态,完成三次握手

连接建立后客户端和服务器就开始进行安全可靠的数据传输了。

什么是可靠所谓的可靠就是说发送方发送的数据箌达接收方的时候不会发生错误,不会丢失不会乱序。

在网络层表现看来是这样的当从运输层传下报文段之后,封装成ip数据报然后經过复杂的网络传输到目的主机,在传输过程中可能在这个复杂的大网络中发生数据报的分片丢失的情况。当到达目的主机后在目的主机的网络层进行对收到的数据报进行拼装,发现这个报文段缺少了一些部分不完整所以在目的主机的网络层就是吧这个报恩段丢弃,傳送给源主机一个ICMP报文段请求源主机重新发送这个报文当这个报文安全无误的到达目的主机的网络层之后然后去掉首部直接上相交付给運输层的接受缓存中。但是在向上交付报文段的时候可能接受缓存满了导致这个报文段丢弃或者在硬件传出过程中发生了比特差错这也不昰不可能的为了避免数据不可抛传输,那么在运输层就要对数据的可靠性做一个保证

在运输层分为两个http为什么是可靠的传输协议UDP和TCP,UDP昰一个不可靠的http为什么是可靠的传输协议也就是说他仅仅提供复用和分用的功能但是对于比特差错或者丢弃不做任何处理。但是TCP是一个媔向连接的http为什么是可靠的传输协议他能够保证从源主机交付的数据正确无误的传输到目的主机的对应的进程中。所以接下来将要介绍嘚是TCP是如何保证数据可靠的传输的

1.TCP是怎么保证没有比特差错的?

为了保证接受的报文段是没有比特差错的TCP中引入了这三个机制:

①差錯检测:也就是引入校验和。在TCP的首部中有一个占据16为的空间用来放置校验和的结果在源主机的运输层开始接受到一个从应用进程传下來的数据的时候,会将他封装成一个报文段加上至少20字节的首部。同时会将这个报文段首部和数据还有伪首部部分一起根据取反码和的形式计算出校验和添加到首部中传输到目的主机的运输层之后,会计算这个通过这个校验和检查是否存在比特差错

控制消息:当检測到发生比特差错之后要对发送发进行信息的反馈使得能够根据返回决定是否进行重传。一般理论上会有两种返回一种是肯定的反馈ACK在TCPΦ反馈信息是接收到的分许中最后一个字节序号的下一位。一种是否定反馈但是为了减少网络中的注入分组的数量减少负担取而代之的昰通过发送上一个分组的确认信息表明当下这个分组没有正确的接收。

重传:如果接收方接收到的是一个换掉的ACK或者上一个分组的确认の后意味着要再发一遍这个分许怎么发后面将分析到。

2.TCP是怎么保证重传的

发送发重传之后,接收方值怎么知道这个分组是重传的分许或者说接收方怎么知道我是不是已经接受了这个分组的?引入了序列化的机制由于TCP是面向字节流的http为什么是可靠的传输协议,所以会為每一个字节编制一个序号同时在TCP首部中也会有这个序号字段。但是由于一个分组中包含了多个字节所以说这个TCP首部中的序号是分组Φ发送多个字节的第一个字节的序号值。

3.TCP是怎么处理分组丢弃的问题的

以上这几个问题是基于分组没有丢弃但是仅仅发生比特差错的时候。如果发生比特差错怎么办http为什么是可靠的传输协议张引入了定时器这个机制。也就是说在某一时刻设置一个定时器只要在定时器設置的时间内没有收到对应分组的确认信息,那么就会重传对应的一个或者几个分组

4.TCP是如何提高传输性能的?

在TCPhttp为什么是可靠的传输协議中为了提高传输性能是不可能一次只能发送一个分组介绍到这个分组确认之后在发送下一个分组的因为这样对于信道的利用效率会大夶减少,所以为了提高信道的利用率一般一次发送多个分组并且将这几个分组为单位开始设置定时器。

同时也引入了快速重传的机制 

5.TCP為什么引入接受缓存这个?

如果没有接受缓存的话或者说只有一个缓存的话,为了保证接受的数据是按顺序传输的所以如果位于x序号の后的序号分组先到达目的主机的运输层的话必然丢弃,这样的话将在重传上花费很大的开销所以一般如果有过大的序号达到接收端,那么会按照序号缓存起来等待之前的序号分许到达然后一并交付到应用进程。

TCP可靠传输的详细过程:

若分组在之前未被接收过则被缓存并且发送ACK(这个ACK是上一个完整交付了的最后一个分组的序号);如果检查序号接受过则丢弃。

若该分组的序号等于接收窗口的继续号則该分组以及以前缓存的序号连续的分组(交付给上层)。发送ACK

其他情况,忽略该分组

_我是如何讲清楚TCPhttp为什么是可靠的傳输协议是如何保证可靠传输的

(1)UDPuser datagram protocol,用户数据报http为什么是可靠的传输协议不提供复杂的控制机制,利用IP提供面向无连接的通信服务并且它是将应用程序发送过来的数据包在收到的那一刻,立即按照原样发送到上的一种机制

(2)即使在网络拥堵的情况下,UDP也无法进荇流量控制等避免网络拥塞的行为此外,在传输过程中如果出现丢包UDP也不负责重发,甚至当数据包的到达顺序乱掉之后也没有纠正顺序的功能因此,如果需要这些细节控制的话就需要在采用UDPhttp为什么是可靠的传输协议的应用层去作出处理。

(3)由于UDP面向无连接所以咜可以随时向对端发送数据包,再加上UDP本身的处理既简单右高效所以UDP经常用于如下几个方面:

  • 数据包总量比较少的通信,比如DNS、SNMP
  • 视频、音频等对实时性要求比较高的多媒体通信。

(1)TCP控制传输http为什么是可靠的传输协议,和UDP的差别很大它充分实现了数据传输时的各种控制功能

针对发送端发出的数据包的确认应答信号ACK、、、针对数据包丢失或者出现定时器超时的重发机制、、、针对数据包到达接收端主机顺序乱掉的顺序控制、针对高效传输数据包的流动窗口控制、、、针对避免网络拥堵时候的流量控制、、、针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。

(2)而这些在UDP中都是没有的!此外TCP作为一种面向有连接的控制传输http為什么是可靠的传输协议,只有在确认对端主机存在时才会发送数据从而可以控制通信流量的浪费。

(1)如图1 所示:在TCP中当接收端主機接收到来自客户端主机的数据包之后,接收端主机会返回一个已收到消息的通知这个通知消息就叫做确认应答信号ACK包

(2)TCP通过肯定嘚确认应答信号ACK包来实现可靠的数据传输当发送端将数据发出之后会等待对端的确认应答。如果有确认应答说明数据已经成功到达对端主机了。反之若没有收到确认应答,则数据包丢失的可能性比较大

(3)情况1:数据包丢失的情况:

如图2 所示在特定的等待时间间隔内发送端主机还是没有收到来自接收端的确认应答发送端就可以认为数据已经丢失了,并且进行重发处理由此,即使产生了丢包也能够保证数据到达对端实现可靠传输。

(4)情况2:确认应答丢失的情况:

如图3 所示未收到对端的确认应答信号并不一定意味着数据包嘚丢失,也有可能是因为对端主机已经收到了该数据包但是针对该数据包的确认应答包在回送途中丢失了而已,或者没有丢失、只是因為网络中的其他一些原因延迟很长时间才到达源主机

此时,源主机只会按照重发机制重发数据包而已但是这对于对端主机来说简直就昰灾难,因为对端主机会反复接收到很多重复的不必要的数据而为了对上层应用http为什么是可靠的传输协议提供可靠的传输,对端主机不嘚不丢掉这些重复的数据包因此,这对网络拥塞的形成造成了很大的促进

所以,需要一种机制来识别是否已经接收到了这个数据包、叒能够判断数据包是否需要接收

上述这些 确认应答处理、重发控制、重复处理 都可以使用数据包的序列号来进行实现。

如图4 所示序列號 是指按照顺序给发送数据包中的每一个字节都标识上号码编号,接收端主机 根据接收数据TCP包首部中的序列号和数据长度来将自己下一步应该接收的序列号作为确认应答返送回去。就这样根据序列号和确认应答信号,TCP可以实现可靠传输

(1)重发超时,是指在发送端主機在重发数据包之前等待接收端主机的确认应答信号到来的“那个特定的时间间隔

如果超过了这个特定的时间间隔仍未收到ACK包发送端则会进行重发。

(2)那这个特定的时间间隔如何确定呢 TCP为了保证在任何网络下都能够提供比较高的传输性能,并且在任何网络下都能够保持住这一特性它在每次发包时都会计算往返时间及其偏差,将这个“往返时间+偏差”重发超时就是比这个总和值要稍大一点的徝。

(3)在Windows系统中超时时间都是以0.5s 为单位进行控制的,因此超时时间都是0.5s 的整数倍不过由于最初的数据包还不知道往返时间,所以最初的重发超时时间一般设置为6s 左右

另外,若是进行了重发处理则第二次、第三次的等待的超时时间会以2倍、4倍的指数函数增长,以此類推

但是,数据包也不会倍无限次的反复的进行重发当重发次数达到一定次数过之后,如果发送端还是接收不到对端主机的ACK包那么發送端主机就会认为网络或者对端主机出现了异常,进行强制关闭连接并且通知应用程序异常强制终止。

(1)TCP是面向有连接的数据通信也就说在进行实际的数据包的收发之前,会先做好通信两端主机的准备工作:TCP三次握手!

(2)在双端主机进行数据的交互完成过之后會进行TCP连接的断开处理。见上面的博客

(1)在建立TCP连接的同时,也可以确定发送数据包的单位称之为“最大消息长度”:MSS。最理想的凊况是最大消息长度MSS正好是IP层中不被分片处理的最大数据长度。

(2)TCP在传送大量数据的时候是以“段=MSS的大小”将数据进行分割发送的,进行重发时也是以MSS为单位的

(3)如图5 所示:最大消息长度——MSS是在三次握手的时候,在两端主机之间被计算得出的两端主机在发出“建立TCP连接请求的SYN包”时,会在SYN包的TCP首部中写入MSS选项告诉对方自己所能够适应的MSS的大小,然后发送端主机会在两者之间选择一个较小的MSS徝投入使用

(1)如图6 所示:TCP是以一个段为单位进行数据的传输的,每发送一个段就会等待对端主机的针对这个段的确认应答信号ACK,但這样的传输方式的缺点也很明显就是:当数据包的往返时间越长,通信性能越低

(2)为了解决这个问题,TCP引入了窗口这个概念即使茬往返时间比较长的情况下,它也能够控制网络性能的下降如图7 所示:确认应答包不再以每个段为单位进行确认了,而是以更大的单位進行确认转发时间将会被大幅度的缩短。也就是说发送端主机在发送了一个段之后,没必要一直等待对端主机的确认应答信号而是繼续发送。

(3)窗口大小指的就是无需等待接收端主机的确认应答信号而可以持续发送的数据的最大值,或者说段的最大值比如图7 所礻的窗口大小是4 个段。  滑动窗口控制的实现使用了大量的缓冲区,通过对多个段的数据同时进行确认应答来实现高效传输

(4)如图8 所礻,发送数据中的高亮部分正是前面提到的窗口在这个窗口内的数据即便没有收到确认应答也可以发送出去,此外发送端主机在等到对端主机的确认应答之前必须在缓冲区中保留这部分数据,以便数据包的丢失而重发

(5)在滑动窗口以外的数据,包括尚未发送出去的數据以及已经确认对端收到的数据,当发送端确认对端已经收到数据包之后此数据包就可以从缓冲区中清除了。

当收到确认应答信号過之后会把滑动窗口的位置滑动到确认应答的序列号的位置,这样就可以顺序的将多个段同时发送以提高通信功能了这就是滑动窗口控制。

6、滑动窗口控制与重发控制

(1)在使用了窗口控制中,如果出现了丢包怎么办呢

首先,我们先考虑接收端已经收到数据包只是反馈的确认应答包ACK包在途中丢失了的情况

如图9 所示:在这种情况下,数据是已经被对端主机成功接收了的是不需要进行重新发送的。嘫而在没有使用窗口控制的前提下,没有收到确认应答包的数据包都会被重发但是,在使用了窗口控制以后就如图9 所示,某些应答包即使丢失了也无需重发这也提高了传输效率。

(2)其次我们再来考虑一下某个数据包丢失的情况。

如果当接收端主机接收到一个自巳应该接收的序列号之外的数据包时它会一直对当前接收到的数据包返回确认应答包。

因此如图10 所示当某一个数据包丢失以后,发送端会一直接收到序列号为1001的确认应答包这个确认应答包好像是在提醒发送端主机“我现在想要接收的数据包序列号是1001开始的”。

因此在滑动窗口比较大的情况下,同一个序列号的确认应答将会被重复不断地返回而发送端主机如果 连续 3 次 接收到同一个确认应答包,就會将其对应的数据重发这种机制比之前提到的“超时重发”更加高效,所以被称之为“高速重发控制”

(1)发送端主机会根据自己的實际情况发送数据,而接收端也会跟据自己的实际情况接收数据因此,TCPhttp为什么是可靠的传输协议提供了这样一种机制:可以让发送端主機根据接收端主机的实际接收能力来控制自己发送的数据量这就是所谓的“流控制”。

(2)具体操作就是:接收端主机向发送端主机通知自己所能够接收数据的大小于是发送端主机就会发送不超过这个限度的数据,该大小被称之为“通告窗口”就是之前提到的“控制窗口”,这个值是由接收端主机决定的

TCP首部中,专门有一个字段用来通知“窗口大小”接收端主机可以将自己的实际接收缓冲区大小寫入到这个字段中通知给发送端,这个值越大说明网络的吞吐量越大

不过,接收端主机的缓冲区一旦面临数据溢出就会主动减小窗口嘚大小再次发送给发送端主机,从而可以控制数据发送量也就是说,发送端主机会根据接收端主机的指示对发送的数据量进行控制,這也就形成了一条完整的TCP流量控制

(3)如图11 所示:当接收端主机收到了从3001号开始的数据包之后其缓冲区即将满,不得不暂时停止接收数據于是把窗口大小设置为0,然后通知该发送端之后,发送端在收到新的窗口更新值的通知之后通信才得以继续进行

如果这个滑动窗ロ的更新通知在传输途中丢失了,则很有可能导致无法继续进行通信为了避免此种问题的发生,发送端主机会时不时的发送一个叫做“探测窗口”的数据包次数据包仅含有一个字节,以获取最新的窗口大小

(1)有了TCP的滑动窗口控制,收发主机之间即使不再以一个“段”为单位发送确认应答信号也能够连续发送大量数据包。然而如果在通信刚开始的时候就发送大量的数据包,也有可能会导致其他问題

问题的发生: 要知道,计算机网络都处在一个共享的环境中因此也有可能是因为其他的主机之间的通信使得整个网络出现拥堵。所鉯在网络拥堵时,如果突然发送一个较大量的数据包极有可能导致网络的瘫痪。

(2)TCP为了防止这种问题的发生在通信一开始的时候會通过一个叫做“慢启动”的算法对发送的数据量进行控制。

首先为了在发送端调节所要发送的数据量,定义了一个叫做“拥塞窗口”嘚概念于是,在慢启动刚开始的时候把这个拥塞窗口设置为1个MSS(1个数据段)发送数据,之后每收到一个接收端主机的确认应答信号ACK包 僦把这个拥塞窗口的数值加1然后,在发送数据的时候把拥塞窗口和滑动窗口的大小作比较,按照它们当中较小的那个值来发送比其还偠小的数据量

不过,随着数据包的每次的往返拥塞窗口会以1、2、4、8等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生为了防止这些,又引入了“慢启动阈值”的概念只要拥塞窗口超过这个阈值,在每收到一个ACK包的时候只允许以下面这种方式来增大拥塞窗ロ:(1个数据段的字节数的平方 / 拥塞窗口的字节数)。这样的话拥塞窗口越大,确认应答的数目也会增加但是其涨幅却逐渐减少,因此会导致拥塞窗口是直线形式的上升

TCP在刚开始通信的时候,并没有设置慢启动阈值而是在超时重发时,才会把慢启动阈值设置为当前窗口的一半大小

(3)由重复确认应答而触发的高速重发与超时重发机制的处理是不一样的。因为前者要求至少 3 次的确认应答包到达对方主机才会触发相比后者网络拥堵的程度较轻一些。

而由重复确认应答进行高速重发控制时慢启动阈值的大小被设置为当时窗口大小的┅半,然后将窗口大小设置为该慢启动阈值+3个MSS的大小

(4)有了这样的一种控制过之后,TCP的拥塞窗口的变化曲线 如图12 所示由于窗口的大尛会直接影响数据被转发的吞吐量,所以一般情况下窗口越大,越会形成高吞吐量的通信

(1) TCP/IPhttp为什么是可靠的传输协议中,无论发送哆少数据总是要在数据前面加上http为什么是可靠的传输协议头。同时对方接收到数据,也需要发送ACK表示确认
 为了尽可能的利用网络带寬,TCP总是希望尽可能的发送足够大的数据(一个连接会设置MSS参数,因此TCP/IP 希望每次都能够以MSS尺寸的数据块来发送数据)。

(2) Nagle算法就是為了尽可能发送大块数据避免网络中充斥着许多小数据块。 Nagle算法的基本定义是:在任意时刻最多只能有一个未被确认的小段

所谓“尛段”指的是小于MSS尺寸的数据块。所谓“未被确认”是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到

(3)这是洇为TCP/IP 中不仅仅有Nagle算法,还有一个TCP确认延迟机制 当Server端收到数据之后,它并不会马上向client端发送ACK而是会将ACK的发送延迟一段时间(假设为 t),
咜希望在 t 时间内server端会向client端发送应答数据这样ACK就能够和应答数据一起发送,就像是应答数据捎带着ACK过去

TCP控制传输http为什么是可靠的传输協议,它充分实现了数据传输时的各种控制功能:
针对发送端发出的数据包确认应答信号ACK;
针对数据包丢失或者出现定时器超时的重发机淛;
针对数据包到达接收端主机顺序乱掉的顺序控制;
针对高效传输数据包的滑动窗口控制;
针对避免网络拥堵时候的流量控制;
针对刚開始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制

此外,TCP作为一种面向有连接的控制传输http为什么是可靠的传输协议只有在确认对端主机存在时才会发送数据,从而可以控制通信流量的浪费

TCP通过序列号、超时重传、检验和、流量控制、滑动窗口、拥塞控制实现可靠性。

1、应用数据被分割成TCP认为最适合发送的数据块

2、TCP给发送的每一个包进行编号,接收方对数据包进行排序把有序数据传送给应用层。

3、TCP的接收端会丢弃重复的数据

4、超时重传:当TCP发出一个段后,它启动一个定时器等待目的端确认收到這个报文段。如果不能及时收到一个确认将重发这个报文段。

5、校验和:TCP将保持它首部和数据的检验和发送的数据包的二进制相加然後取反。这是一个端到端的检验和目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错TCP将丢弃这个报文段和不确认收到此报文段。

6、流量控制:TCP连接的每一方都有固定大小的缓冲空间TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据能提示发送方降低发送的速率,防止包丢失TCP使用的流量控制http为什么是可靠的传输协议是可变大小的滑动窗ロhttp为什么是可靠的传输协议。接收方有即时窗口(滑动窗口)随ACK报文发送。(TCP 利用滑动窗口实现流量控制)

7、滑动窗口:实际中的传输方式
需要说明一下,如果你不了解TCP的滑动窗口这个事你等于不了解TCPhttp为什么是可靠的传输协议。
我们都知道TCP必需要解决的可靠传输以忣包乱序的问题,
所以TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞导致丢包。

8、拥塞控制:当網络拥塞时减少数据的发送。发送方有拥塞窗口发送数据前比对接收方发过来的即使窗口,取小慢启动、拥塞避免、拥塞发送、快速恢复应用数据被分割成TCP认为最适合发送的数据块,TCP的接收端会丢弃重复的数据

停止等待http为什么是可靠的传输协议也是为了TCPhttp为什么是可靠的传输协议传输稳定可靠,它的基本原理就是每发完一个分组就停止发送等待对方确认。在收到确认后再发下一个分组

我要回帖

更多关于 http为什么是可靠的传输协议 的文章

 

随机推荐