TCp协议的功能机制有哪些
TCP协议的主要功能 :当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。 TCP协议(Transmission ControlProtocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,TCP协议就起到了这个作用。

可靠传输的TCP可靠传输机制
总结一下,TCP通过下列方式来提供可靠性:1)面向字节流和缓存机制:应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。2)超时重发和确认机制:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。3)检验和机制:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。4)字节编号机制:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。5)自动丢弃重复机制:既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。6)流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(byte stream service)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。只要自己的接收缓存没有塞满,TCP 接收方将有多少就收多少。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCⅡ字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

请说明传输层tcp协议采用了哪些机制来保证端到端结之间的可靠传输
补充:1、建立连接的时候三次握手,解除连接的时候四次挥手; 2、确认机制:超时重传,捎带确认,合并确认;3、CRC校验机制4、流量控制:滑动窗口机制 5、拥塞控制:慢开始,拥塞避免,快重传,快恢复
简单说包括三个核心: 1、连接和断开时三次握手2、确认机制(超时、捎带确认、合并确认等)3、CRC校验机制 详细的原理就不是几句话能说清了,欢迎追问。
1、确认机制 2、超时重传 3、顺序重组

可靠传输机制
TCP发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力服务。也就是说,TCP下面的网络所提供的是不可靠的传输。因此,TCP必须采用适当的措施才能使得两个传输层之间的通信变得可靠。理想的传输条件有以下特点:在这样的情况下,不采取任何措施就能实现可靠传输。然而实际的网络都不具备上述的两个条件。但是我们可以使用一些可靠传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告知发送方降低数据发送的速度——流量控制。这样本来不可靠的信道就能实现可靠的传输。可靠传输:即发送端发送的是什么,接收端接收到的就是什么。也就是在数据传输的过程中没有传输差错。数据传输过程中可能出现的问题:比特出差错、丢包。可靠传输的方法:停止-等待协议、滑动窗口协议。(1) 全双工通信的双方既是发送方也是接收方,但是为了讨论问题方便,仅考虑一方发送数据(发送方),一方接收数据(接收方)。(2) 数据传输的过程中既可能出现差错,又有可能出现丢包的现象。(3) 所有传输的数据单元称为分组。发送方每发送一分组就停止等待,只有等到了接收方发送来的确认后才可以发送下一个分组。(1)分组丢失或检测到分组出错发送方在传输过程中分组丢失,这时接收方没有接收到分组不会知道发送方发送了分组,就不会给发送方返回确认信息(分组出错,接收方会直接丢弃分组也不会返回确认信息),而发送方在等待接收方的确认信息以此来发送下一个分组。所以可靠传输协议这样规定:当发送方超过一段时间没有仍然没有收到的确认,就认为刚才的分组丢失了,因而重传前面的发送过的分组。这就是超时重传。超时重传要求在每次发送完一个分组时设置一个超时计时器,如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。(2)确认分组(ACK)丢失接收端接收了发送方传输的分组后,向发送方发送ACK,但是ACK在传输过程中丢失了,那么发送方就收不到确认信息,这时发送端超时计时器到期后就要重传分组,接收方仍会重复接收分组,并且丢弃重复的分组,并重传ACK。(3)ACK分组迟到下图的传输过程没有出现差错,接收方接收分组后向发送方发送ACK,但是确认信息迟到了,在超时计时器到期后发送方会重新发送分组,接收方仍然会重复接收分组,并且丢弃重复的分组,并重传ACK。当发送方收到ACK后会发送下一个分组,在后来发送方收到迟到的ACK时,发送方会收下并直接丢失。优缺点:停止等待协议优点是简单,但缺点是信道利用率太低。假定A发送分组需要的时间是TD。显然,TD等于分组的长度除以数据率。再假定分组正确到达B后,B处理分组的时间可以忽略不计,同时立即发回确认。假定B发送确认分组需要时间TA,如果A处理确认分组的时间也可以忽略不计,那么A在经过(TD+ RTT + TA)后就可以再发送下一个分组,这里的RTT是往返时间。信道利用率:发送方在一个发送周期内,有效地发送数据所需要的时间占整个发送周期的比率。因为仅仅是在时间TD内才用来传送有用数据(包括分组的首部),因此信道利用率U为:为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可以连续发送多个分组,不必每次发完一个分组就停下来等待对方的确认。这样信道上一直有数据在不断的传送,显然这样会提供信道利用率。在回退N步协议中,允许发送方发送多个分组而不需等待确认,但它也受限于流水线中未确认的分组数不能超过某个最大允许数N。发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。如上图所示,发送方收到了对第0分组的确认后,将发送窗口向前移动一个分组的位置。上图表示了GBN协议的序号范围示意图。其中序号被分割成了四个部分,各个部分的含义如图所示。(1)上层的调用。(2)收到一个ACK:GBN协议中,对序号为n的分组的确认是采用累积确认(cumulative acknowledgement)的方式。(3)超时事件:如果发生超时事件,发送方重传所有已发送但还未被确认过的分组。(1) 如果接收方正确收到n号分组,并且按序(即上次交付给上层的分组序号是n-1),则接收方位分组n发送一个ACK,并将该分组交付给上层。(2) 其他情况,接收方丢弃分组,并为最近按序接收到的分组重新发送ACK。即GBN协议中,接收方丢失所有失序的分组,接收方不缓存任何的失序分组,只需要维护一个下一个按序接收的分组序号:expectedseqnum。很显然,GBN协议对失序的分组选择直接丢失的行为优点是使得接收缓存简单,即接收方不缓存任何失序的分组,但是缺点也是非常明显的,由于一个分组出错可能需要重传原来已经正确传送的分组,这对资源无疑是一种浪费,其次这些重传的分组也许也会丢失或出错,从而导致更多的重传。最后,用一个例子总结下一GBN协议的工作流程(1) 发送端发送0、1、2、3号分组,此时发送窗口已满,不能在发送新的分组,在4个分组的传输的过程中,其中2号分组丢失。(2) 接收方返回对0号分组的确认,此时窗口向前滑动一个分组位置,并同时发送4号分组。此时,由于0号分组已被确认,计时器重新启动,开始为分组1开始计时....(3) 接收方在接收到发送方的0号分组后期望接下来收到1号分组,但是没有收到1号分组,但是却收到2号分组和3号分组,所以直接丢失,并向发送方返回ACK 0,同样对于之后收到的4号分组也是直接丢失并返回ACK 0,此时窗口已经满了,也无法发送新的分组。(4) 在计时器超时后,发送方重传所有已发送但是没有被确认的分组,即1号、2号、3号和4号分组,如果这次没有分组丢失,那么接收方会返回这4个分组的确认,发送方在收到确认后,将窗口向前移动4个分组位置。(1)GBN协议使用累积确认机制。(2)接收方只按顺序接收分组,不按序的分组直接丢失。(3)重传时需要重传全部已发送但是没有被确认的分组。(4)确认序列号最大的、按序到达的分组。选择重传协议是对GBN协议的缺点进行了改进,GNB超时重传会对那些已经正确传送的分组都重新传送,并且对失序到达的分组直接丢失。选择重选协议通过让发送方仅重传那些可能在接收方出错(即丢失或受损)的分组而避免了不必须要的重传。SR协议的改进措施:下图表示选择重选协议的发送窗口和接收窗口。发送窗口和同步窗口是不同步的。(1)上层的调用。(2)收到一个ACK。如下图所示,当收到2号分组的确认后,窗口向前滑动一直到最小序号的未确认的分组处,即5号分组处。(3)超时:定时器再次被用来发送丢失的分组。每个分组都有自己的逻辑定时器,因为超时发生后只能发送一个分组。(1) SR接收方将确认一个正确接收的分组(在窗口内)而不管其是否按序。失序的分组将被缓存直到所有丢失的分组(即序号更小的分组)都被收到为止,这是才可将一批分组按序交付给上层,然后向前移动滑动窗口。如果接收方收到一个在窗口左侧的分组(确切的来说,左边一个窗口大小范围的序号分组,即rev_base - N~rev_base - 1),在这种情况下,必须发送一个ACk,即使该分组是接收方以前已确认的分组。对于其他情况,则忽略分组即可。下面的图可以表示SR协议的工作过程,具体分析过程和GBN协议相似,这里就不细说了。(1)对窗口内的分组逐一确认,收一个确认一个。(2)只传出错的分组。(3)接收方有缓存机制,存放失序的分组。

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的三次握手,之后是数据传输。可以结合该图去更好的理解本文。

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/66999.html。