• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

你该知道的TCP传输控制协议

武飞扬头像
FrankWan
帮助1

Tcp是传输层的一个协议,用于进行网络间数据的传输。用于将应用程序交付的数据交给网络层。或将网络层的数据交付给应用程序。

学新通

Tcp协议的特点:

特点 描述
面向连接的运输层协议 tcp的面向连接是虚连接,逻辑连接,不是真正的物理连接。为什么要连接,面向连接的好处是维护了后继分组的状态信息,知道谁到达了,谁丢包了
端到端的连接 1. 传输层是为应用程序提供了端到端的逻辑通信,端口对端口。2. 端到端和点到点的区别:点到点是数据链路层的说法,因为数据链路层是负责两个连接点之间的通信,通过mac地址把数据帧发到相邻的下一个节点。端到端是传输层的说法,只负责把上层交付的数据传输到接收端,其中跨过多少节点不去关心,只关心发送端-接收端。
提供可靠交付 如何实现?请见下文
提供全双工通信 什么是全双工,即通信双方既能发送数据也能接受数据,且这个过程互不干扰,可同时进行,半双工就是通信双方只能用一方发送数据,另一发接受数据。
面向字节流 传输数据的内容是字节流。
1. Tcp数据包中的确认号和序列号都是四字节32位,即可以表达的范围为[0-2^32-1]。可对4GB(4千兆)字节数据进行编号。
2. 序列号表示发送的这个tcp数据包第一个字节的序号。
3. 确认号表示接收方期望下一个数据包的序列号。即确认号-1的字节数据已经正确接收了。
学新通

采用三次握手和四次挥手理解序列号和确认号的作用。

三次握手与四次挥手过程:

学新通

三次握手过程

  1. 客户端将数据包中的SYN标志位置为1(表示这是一个请求连接的数据包),生成一个随机序列seq=x,发送给服务器。
  2. 服务器产生一个数据包,将SYN标志位置为1,ACK标志位置为1(标志位为1确认号才生效),ack=x 1(表示已经成功接收了序列号为x的数据包),生成随机序列号seq=y,发送给客户端。
  3. 客户端发送确认号ack=y 1,表示已经成功接收数据包,服务端接收到后进行传输通信。

四次挥手过程:

  1. 客户端将数据包中FIN标志位置为1(表示这是一个断开连接的数据包),生成随机序列seq=x 2,发送给服务器,转2。
  2. 服务器收到这个数据包以后,返回一个确认数据包(ack=x 3),但是服务器可能还没有将数据传输完毕,所以客户端进行等待,服务器处于一个close_wait状态,转3。
  3. 等待服务器发送完数据以后向客户端发送FIN数据包,生成随机序列号seq=y 1,转4。
  4. 客户端收到消息以后返回确认数据包,客户端等待2MSL时间后,关闭客户端。

那为什么要进行三次握手?

  1. 我们要保证通信连接是全双工的。那么双方的通信信道都必须正常,才可以传输信息,但是如何确认双方信道正常,最少通信次数为三次,才可以确认双方通信信道都正常。

  2. 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

原因二的具体场景:

  client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接,但是此时客户端并没有数据进行传输,那么服务器端会一直为客户端的这次连接分配资源并且维持连接。

Tcp四次挥手的时候,客户端发送最后一个确认包以后为什么要使TIME_WAIT = 2MSL(最大报文生存时间)时间?

1)为实现TCP全双工连接的可靠释放。
2)为使旧的数据包在网络因过期而消失。 可靠释放的原因是因为在最后一次ack包发送之后可能会发生丢包,丢包之后服务器会进行超时重传,重传FIN包,如果客户端是close状态,会产生RST复位异常包,让服务器误以为发生了重大问题。

原因二解释:

  在通信的连接中,连接依赖于四元组(源ip,目的ip,源port,目标port),如果第一次连接建立,发送的某些数据包在网络中滞留了,没有到达服务端,这次连接断开后很快有使用相同的四元组进行了一次连接,而这次原本滞留在网络中的数据包到达了服务端(服务端不回去鉴别这些数据包是上次连接产生的还是这次),那么就会产生上次连接的数据包影响新的连接的问题。所以需要在最后一个确认包发送以后,等待着这次连接的所有数据包失效才能真正的断开连接。

  但是为什么是2MSL而不是MSL?因为TIME_WAIT是在客户端发送ack包之后开始计时的,且如果丢包,接收到服务端的FIN数据包之后重新计时。但是MSL是单方向上的数据包消失时间,如果发生重传,那么服务端到客户端方向的数据包就比一定可以消失,所以需要客户端等待2MSL时间,等待两个方向上的数据包都失效。

什么是可靠传输?可靠传输的要求是?

  能够正确的传输数据,保证数据的正确性、无差错、不丢失、不重复、并且按序到达。

如何保证可靠传输?什么协议可以作为支持?

   Tcp数据包头部中的校验和可以保证数据的无差错,一旦数据出现差错,就丢弃掉这个数据包,发送方会重新发送这个数据包。

   ARQ协议。自动重传请求协议,是一种错误纠正协议。通过正面确认超时重传的方式去保证可靠传输。在不可靠的传输网络上实现可靠的传输。

停止等待ARQ协议

发送一个分组,必须等到接收方的确认之后才继续发送下一个分组,否则重传该分组。

学新通
学新通

优点:

  • 保证了数据不丢失,确认接收方接收到分组。
  • 保证数据不重复,接收到序列号相同的重复数据之后,不交付,丢弃数据。

缺点:传输效率太低,信道利用率低,一次只有一个分组在传输。

连续ARQ协议-流水线模式

   发送方连续发送一组分组数据,再等待这些数据的ACK。不必每发送完一个分组就停下来确认。发送方连续发送一组分组数据,再等待这些数据的ACK。不必每发送完一个分组就停下来确认。

优点:提高了传输效率和信道利用率。

缺点: 发生Go-back-N,通信线路不好的情况下,会带来负面影响。即中间一旦发生丢包,会默认后边的数据都丢失,将后边的数据全部重传,浪费带宽。

Tcp如何实现可靠传输的?

   以字节为单位的滑动窗口协议,基于连续ARQ协议的流水线模式,设置缓存,采用选择重传的方式。

学新通
学新通
学新通
学新通

  滑动窗口协议维持发送方数据的缓存,一次发送一组数据包,等待数据的确认包,如果收到按序到达的数据确认包,那么发送方窗口后沿(不再缓存该数据)和前沿(准备发送新的数据)向前滑动,发送接下来的数据,接收方交付按序到达的数据给应用程序后,接收窗口后沿和前沿向前移动,准备接收新的数据。如果发生数据不按序到达,不随意丢弃数据,将数据缓存在接受窗口中,等待期待数据。如果期待数据没有到达就只重传期待数据。

为什么要进行流量控制?

  滑动窗口协议保证了数据不会再丢包的情况下,发生GO-BACK-N重传的情况,但是如果在接收方的缓存不够时,发送窗口发送数据接收方来不及接收时,就会发生丢包,超时重传。

学新通

  流量控制是发送方通过设置确认包中的rwnd(接收窗口大小)去限制发送方发送窗口的大小的。

流量控制是对于端对端而言的。

为什么要进行拥塞控制?

什么是拥塞?

  在某段时间内,若对网络中某一资源(带宽、交换机节点中的缓存和处理机等)的需求超出了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。总的来说就是网络资源供不应求的时候,性能就会变差。

什么是拥塞控制?

  拥塞控制就是防止过多的数据注入到网络中,这样可以是网络中的路由或者链路不至于过载。 网络状况不好的情况下会发生丢包,而丢包会引起超时重传,不控制发送到网络中的速率,网络最终会趋于瘫痪状态,所以我们需要在网络发生拥塞的时候,及时进行拥塞控制,防止网络状态趋于更差的状态。

拥塞控制算法:

  慢开始,拥塞避免,快重传,快恢复,这四种算法是整个网络在运行过程中,随时动态调整的,在某些触发点随时变更算法,一起进行网络的拥塞控制。

拥塞窗口cwnd,发送方的发送窗口大小。
ssthresh慢开始门限值。 

1. cwnd < ssthresh, 继续使用慢开始算法; 
2. cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法; 
3. cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
拥塞控制算法 详细过程 图解
慢开始 过程:初始拥塞窗口cwnd设置为1,用于试探网络。收到一个ack确认,拥塞窗口 1。经过一个轮次(RTT),整个窗口相当于扩增一倍。 cwnd最终会达到一个ssthresh慢开始门限值。拥塞窗口大小呈指数增加的过程。每一轮翻倍,但是翻倍是针对于最终呈现的结果来说的,实际上每一个ack收到之后都会增加一个大小。使用慢开始算法是为了让新接入网络的主机,不要一开始就发送大量的数据,而是先发送一个分组试探一下网络的状况,慢慢增加窗口的大小。
学新通
拥塞避免 每经过一个传输轮次,发送方的cwnd 1,让拥塞窗口缓慢的增大,按照线性规律增长。使网络比较不容易出现拥塞。拥塞窗口呈线性增加的过程。每一轮拥塞窗口增大一个。在使用拥塞避免算法的过程中,如果发生丢包情况,就意味着网络发生了拥塞。 做法:ssthresh = cwnd/2; cwnd = 1. 回到慢开始阶段。 缺点:过大的降低了发送窗口尺寸,降低TCP连接的吞吐量。
学新通
快重传 快恢复 快重传场景:发送一组数据时,收到3个重复ack,即对于某一个数据包的期望,发送方即认为这个期望收到的包丢失了,不用等待超时去重传这个数据包,而是立即重传这个数据包。目的:为了可以让发送方尽早知道发生了个别报文的丢失,进行重传,不必等到RTO(超时)立即进行重传。在快重传执行重传之后,执行“乘法减少”算法,门限值减半 ssthresh = cwnd/2; cwnd = ssthresh. 继续执行拥塞避免算法。好处:快重传发生的时候,发送方认为可以收到这3个ack即证明网络不是那么的差,所以只降低慢开始门限值,并不将拥塞窗口降为1,接着启动拥塞避免算法,这样让网络发生巨大的动荡。
学新通

背景:一个主机突然接入网络环境中,假设门限值初始值ssthresh=16

拥塞控制过程

学新通

不仅仅在拥塞避免算法过程中会发生超时和3个重复ack,在慢开始算法的过程中也会发生

拥塞控制流程图

学新通

拥塞控制算法目的与区别

  •   慢开始和拥塞控制算法常常作为一个整体使用,主要目的是为了减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。

  •   快重传和快恢复算法则是为了减少丢包最后引起超时,导致误以为发生了拥塞,启动慢开始。提高了网络的吞吐量。

参考文献

  • 《计算机网络(第7版)》 -- 谢希仁

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhbfhcfk
系列文章
更多 icon
同类精品
更多 icon
继续加载