tcp的可靠性是如何实现的
tcp的可靠性是利用应答-重传机制来实现的.
百科吧。不复制了

网络协议 | TCP和UDP可靠性传输
前文: 网络协议一、协议1、HTTP协议:基于TCP连接的,主要解决如何包装数据,对应于应用层;2、TCP/UDP协议:主要解决数据如何在网络中传输,对应于传输层;3、IP协议:对应于网络层;· 在传输数据时,可以只使用传输层(TCP/IP),但是那样的话,由于没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。· web使用HTTP作传输层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。· TCP/IP:传输层协议,主要解决数据如何在网络中传输。TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是User Datagram Protocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。可靠性由上层应用实现,所以要实现udp可靠性传输,必须通过应用层来实现和控制。确认机制、重传机制、滑动窗口。1.应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。3.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。4.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。5.既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。[2]6.TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。TCP协议用于控制数据段是否需要重传的依据是设立重发定时器。在发送一个数据段的同时启动一个重传,如果在重传超时前收到确认(Acknowlegement)就关闭该重传,如果重传超时前没有收到确认,则重传该数据段。在选择重发时间的过程中,TCP必须具有自适应性。它需要根据互联网当时的通信情况,给出合适的重发时间。这种重传策略的关键是对定时器初值的设定。采用较多的 算法 是Jacobson于1988年提出的一种不断调整超时时间间隔的动态算法。其工作原理是:对每条连接TCP都保持一个变量RTT(Round Trip Time),用于存放当前到目的端往返所需要时间最接近的估计值。当发送一个数据段时,同时启动连接的定时器,如果在定时器超时前确认到达,则记录所需要的时间(M),并修正[2]RTT的值,如果定时器超时前没有收到确认,则将RTT的值增加1倍。通过测量一系列的RTT(往返时间)值,TCP协议可以估算数据包重发前需要等待的时间。在估计该连接所需的当前延迟时通常利用一些统计学的原理和算法(如Karn算法),从而得到TCP重发之前需要等待的时间值。TCP的一项功能就是确保每个数据段都能到达目的地。位于目的主机的TCP服务对接受到的数据进行确认,并向源应用程序发送确认信息。使用数据报头序列号以及确认号来确认已收到包含在数据段的相关的数据字节。TCP在发回源设备的数据段中使用确认号,指示接收设备期待接收的下一字节。这个过程称为期待确认。源主机在收到确认消息之前可以传输的数据的大小称为窗口大小。用于管理丢失数据和流量控制。UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。实现确认机制、重传机制、窗口确认机制。如果你不利用 Linux 协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:发送:包的分片、包确认、包的重发接收:包的调序、包的序号确认目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为。实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于底层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。本文来自地址:https://blog.csdn.net/gettogetto/article/details/76736365

tcp的可靠性是如何实现的
tcp的可靠性是利用应答-重传机制来实现的.

TCP可靠性的体现:seq和ack机制
提到TCP和UDP的区别,很容易想到的就是TCP的可靠性,那TCP是通过什么机制实现了可靠性的呢?解释这个之前先来区分TCP中的大写ACK和小写ack。看一张经典的TCP三次握手过程图: 这张图里似乎有个大写的ACK也有个小写的ack,这也是容易混淆的地方。大写的ACK是控制位,在TCP报文头中有8个标志比特,也就是TCP报文头中有8位大小的数据是标志位,看一下TCP报文格式更好理解:它们中的多个可以同时被设置成1:CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置ECE标志的TCP包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。ECE(ECN Echo):用来在TCP三次握手时表明一个TCP端是具备ECN功能的。在数据传输过程中,它也用来表明接收到的TCP包的IP头部的ECN被设置为 11,即网络线路拥堵。URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1时表示有紧急数据。当URG=1时,后面的紧急指针字段才有效。ACK:表示前面的确认号字段是否有效。ACK=1时表示有效。只有当 ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为 1。PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为1,表示应当立即把数据提交给上层,而不是缓存起来。RST:表示是否重置连接。如果RST=1,说明TCP连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才为1。FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。这是大写的ACK,而小写的ack是确认序列号,和它一对的是seq即顺序序列号,也就是上图TCP报文格式中的Sequence Number和Acknowledgment Number。前面说了这么多只是为了区分TCP中的大写ACK和小写ack,也没其他方法就用大小写区分吧,本文关注的重点就是TCP中的seq和ack机制,通过它们实现了TCP的可靠性传输,当然TCP通过很多方面去保证了可靠性传输,这里seq和ack机制是防止数据丢失丢包的机制。顺序号seq:用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。理解起来就是TCP用顺序号对每个字节进行计数。由上图TCP报文格式中可以看出序号是 32bit 的无符号数,序号到达 后又重新开始计数。当建立一个新的连接时,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN ( Initial Sequence Number ),也就是说seq并不一定是从0开始的,所以刚在画TCP三次握手的时候,写的seq=x,即使还没有数据传输,seq包含了ISN后就成了一个随机数,并不是0。确认号ack:理解起来就一句话,所期望收到的下一个顺序号seq。TCP为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输,也就是说服务端和客户端都可能成为数据接收或者数据发送的一端。数据发送端在发送TCP报文时,计算在本次seq计数内,之前所有发送的报文中数据长度之和是多少,也就是计数记到哪里了,这就是seq。然后再计算之前所有收到的报文中收到的数据长度之和是多少,这就是ack。需要注意的是seq和ack是分开计数的。需要注意的是,SYN和FIN的TCP报文传输虽然没有数据,但是数据长度算1,ACK的传输,数据长度算0。数据接收端收到TCP报文后,将这次报文中的seq取出来,和自己最后一次发送的ack对比,如果一致,则代表数据没有丢失,理解起来就是这次的顺序号和上次自己期望的顺序号一致嘛。如果不一致就说明有丢包发生。其实就是TCP用0~对每个字节进行计数,用下图举个例子解释一下:三个过程:1.A在发送某个TCP报文前,发现此时自己这边的seq计数已经到了x,那这次的报文中seq=x,也就是在一次seq计数内,该端之前所有发送的报文中数据长度之和为x。然后这次又在这个报文中携带了长度为100bit的数据。2.B在收到这个报文后,拿到报文中的seq=x,又拿到了长度为100bit的数据,然后回包的时候ack=x+100。意思是告诉B你已经发了x+100位的数据了,下次发包的时候别忘了把seq改成x+100。3.A收到B回的数据包后,拿到报文中的ack=x+100,然后和自己这边的计数着的seq一比对,如果一样,说明A发的B都收到了没问题,如果不一样,假如A一看自己这边的seq已经等于y了,也就是自己计数着的已经发送y位的数据了,可是听B的意思它才收到x+100位数据,丢包了呗。然后就是重发什么的是TCP的另外一些机制。TCP就是通过seq和ack机制去确认传输过程中有没有丢包现象,前面说在一次计数范围内,seq并不一定是从0开始的,可以当我们用Wireshark抓包时,上面显示的seq确实从0开始的,这是因为Wireshark等抓包软件为了让seq和ack展示更直观,自动帮我们减去了初始顺序号 ISN,当然也可以设置为直接展示真正的seq和ack,那就看着比较乱了,贴一张Wireshark处理后的seq和ack变化过程图: 图中前三步即TCP的三次握手,之后是数据传输。可以结合该图去更好的理解本文。

TCP的可靠性主要体现在哪些方面?
TCP的可靠性是通过以下几个规则来实现的。 首先,为了防止数据在传输的过程中被损坏,每个信息包都包含一个校验码,这个校验码头就是一个用来保证信息包在传输过程中没有被更改的代码,当信息到达目的地的时候,接收方会对比较验码和收到的信息中的数据,如果校验码不对,则被信息包将被省略。第二,为了防止信息包丢失,TCP会要求接收方每收到一个信息包都反馈一下,如果接收方没有提供反馈,发送方会自动重发一次,一直到接收方收到为止,或者它会判断网络链接断开了,就会在程序中返回一个错误的提示。 第三,为了防止信息包重复或顺序错误,TCP每传送一个信息包都会传送一个序号,接收方会检查这个序号,确保收到该信息包,并把全部信息包按顺序重新合并,同时,如果接收方看到一个已接收了的序号,则这个信息包就会被丢弃。
TCP通过下列方式来提供可靠性: •应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)TCP如何确定报文段的长度。•当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。在第21章我们将了解TCP协议中自适应的超时及重传策略。•当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒•TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。•既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。•既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。•TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。 这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似。Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对Unix的内核来说,它无法区分一个二进制文件与一个文本文件。

本文由 在线网速测试 整理编辑,转载请注明出处。