UDP和TCP扫盲

·  阅读 315

UDP协议

优点

  • 无需建立连接。
  • 无状态连接。TCP需要维护连接状态。
  • 分组首部开销小。TCP首部20字节,UDP首部8字节。
  • UDP没有拥塞控制,适合实时应用。允许数据丢失,但是时延小。

最小传输单位

  • 报文。一次交付一个完整的报文,不可分割。

UDP首部格式

  • 源端口
  • 目的端口
  • 长度
  • 校验和

TCP协议

特点

  • 面向连接的传输层协议

  • 每条TCP协议只能是点对点的。(不能广播,多播)

  • TCP提供可靠的交付服务,保证传送数据无差错、不丢失、不重复且有序。(可靠有序,不丢不重)

  • TCP提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存来临时存放双向通信的数据。

    • 发送缓存存放:①发送应用程序传给发送方TCP准备发送的数据。②TCP已发送但尚未收到确认的数据。
    • 接收缓存存放:①按需到达的但尚未被接收应用程序读取的数据。②不按序到达的数据。
  • TCP是面向字节流的。虽然应用程序和TCP的交互是一次一个数据块(大小不等),但是TCP把应用程序交付下来的数据仅仅看成是一连串无结构的字符流。

传送数据单元

报文段。

一个TCP报文段分为:①TCP首部;②TCP数据。

TCP首部字段

image-20210722102553784

  1. 源端口和目的端口字段。各2字节。端口是传输层和应用层的服务接口。传输层的复用和分用功能都要通过端口实现。

  2. 序号字段。4字节。TCP是面向字节流的,TCP连接中传送的数据流中每一个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。

  3. 确认号字段。4字节。期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号=N,则表明到需要N-1为止的所有数据都已经正确收到。

  4. 数据偏移(即首部长度)。占4位。

  5. 保留字段。占6位。保留为今后使用。

  6. 紧急位URGURG=1时,紧急指针字段有效。告诉系统此报文段中有紧急数据,应尽快传送。URG需要和紧急指针配套使用,数据从第一个字节到紧急指针所指的字节,就是紧急数据。

  7. 确认位ACK。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在建立连接之后,所有传送的报文段都必须把ACK置1

  8. 推送位PSH。收到PSH=1的报文段,TCP就应该尽快地交付接收应用进程。而不是等到整个缓存都填满了再向上交付。

  9. 复位位RST。当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或者其他原因),必须释放连接,然后再重新建立运输连接。

  10. 同步位SYNSYN=1表示这是一个连接请求报文或者连接接收报文

    SYN=1, ACK=0时,表明这是一个连接请求报文。若对方同意建立连接,则在响应报文中使用SYN=1, ACK=1

  11. 终止位FIN。用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。

  12. 窗口字段。占2字节。之处现在允许对方发送的数据量,单位为字节。

  13. 检验和。占2字节。检验范围包括首部和数据这两部分。

  14. 紧急指针字段。占16位。指出本报文段中紧急数据共有多少个字节。

  15. 选项字段。长度可变。TCP最初只规定了一种选项,即最大报文段长度MSS。MSS是TCP报文段中的数据字段的最大长度

  16. 填充字段。为了使整个首部长度是4字节的整数倍。

TCP连接管理

TCP是面向连接的协议,因此每一个TCP连接都有三个阶段:建立连接、数据传送和连接释放。TCP连接的管理就是要使运输连接的建立和释放都能正常进行。

TCP连接建立过程中要解决以下三个问题:

  1. 要使每一方都能够明确知道对方的存在;
  2. 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项以及服务质量等);
  3. 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

TCP把连接作为最基本的抽象,每一条TCP有两个端点,TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议接口。TCP连接的端口叫做套接字(socket)或插口。端口拼接到IP地址即构成了套接字。

每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。

TCP连接的建立采用客户/服务器方式。

  • 客户机(Client):主动发起连接的应用进程;
  • 服务器(Server):被动等待连接建立的应用进程。

TCP连接建立——三次握手

连接建立步骤如下:

image-20210722111737989

  1. 客户机的TCP首先向服务器的TCP发送一个连接请求报文段。

    这个特殊的报文段中不包含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号seq=x(连接请求报文中不携带数据,但要消耗掉一个序号)。

  2. 服务器的TCP收到连接请求报文段之后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量

    在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号seq=y(确认报文不携带数据,但也要消耗掉一个序号)。确认报文段同样不包含应用层数据。

  3. 当客户机收到确认报文段之后,还要向服务器给出确认,并且也要给该连接分配缓存和变量

    这个确认报文段的ACK标志位被置为1,序号字段seq=x+1,确认号字段ack=y+1。该报文段可以携带数据,如果不携带数据,则不消耗序号。

在成功进行了上述三步之后,TCP连接就建立了,接下来就可以传送应用层数据了。

TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。

注意:服务器端资源是在第二次握手时分配的,而客户端资源是在完成第三次握手时分配的。因此服务器易于收到SYN洪泛攻击。(解决方法:SYN cookie)

TCP连接释放——四次挥手

参与TCP连接的两个进程中任何一个都能终止连接。过程如下:

image-20210722112915667

  1. 客户端打算关闭连接,向其TCP发送一个连接释放报文段,并停止再发送数据,主动关闭TCP连接。

    该报文段FIN标志位被置为1,seq=u,它等于前面已传送过的数据的最后一个字节的序号加1(FIN报文段即使不携带数据,也要消耗掉一个序号)。

    TCP是全双工的,即可以想象成是一条TCP连接上有两条数据通路。当发送FIN报文段时,发送FIN的一端就不能再发送数据,也就是关闭了其中一条数据通路,但对方还可以发送数据。

  2. 服务器接收到连接释放报文段后即发出确认。确认号ack=u+1

    这个确认报文段序号seq=v,它等于前面已经传送过的数据的最后一个字节序号加1。

    此时,客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。

    如果服务器发送数据,客户机仍要接收,即服务器到客户机方向的连接并未关闭。

  3. 若服务器已经没有要向客户机发送的数据,就通知TCP释放连接。

    此时服务器发出FIN=1的连接释放报文段。seq=wack=u+1

  4. 客户机收到连接释放报文段后,必须发出确认。

    在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1

    此时TCP连接还有没释放掉,必须经过时间等待计时器设置的时间2MSL之后,才能进入连接关闭状态。

TCP连接建立和释放简单小结

  • 连接建立,分三步:

    • SYN=1, seq=x;
    • SYN=1, ACK=1, seq=y, ack=x+1;
    • ACK=1, seq=x+1, ack=y+1。
  • 连接释放,分四步:

    • FIN=1, seq=u;
    • ACK=1, seq=v, ack=u+1;
    • FIN=1, ACK=1, seq=w, ack=u+1;
    • ACK=1, seq=u+1, ack=w+1。

TCP可靠传输

TCP提供的可靠数据传输服务目的:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。

TCP使用了校验、序号、确认和重传等机制来达到这个目的。

序号

TCP首部的序号字段用来保证数据能够有序地提交给应用层。

TCP把数据看成一个无结构但是有序的字节流,序号是建立在传送的字节流上,而不是建立在报文段上

TCP连接中,传送的数据流中的每一个字节都会编上一个序号。序号字段的值则是本报文段所发送数据的第一个字节的序号。

确认

TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。(这样断句,容易理解:期望收到/对方的/下一个报文段的数据的/第一个字节的序号)。发送方缓存区会继续存储那些已经发送但是未收到确认的报文段,以便在需要的时候重传。

TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。

比如接收方B收到了A发送的编号为0到2以及编号为6到7的报文段,但是并未收到编号3到5的报文段,此时B仍然在等待编号3到5的报文段,那么下一个B到A的报文段的确认号字段就是3。

重传

有两种事件会导致TCP对报文段进行重传:超时和冗余ACK

  1. 超时

    TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期,但是还没有收到确认,就重传这一段报文。

  2. 冗余ACK(冗余确认)

    超时重传存在的一个问题就是:超时周期往往太长。幸运的是,发送方通常可以在超时事件发生之前通过注意冗余ACK来较好地检测丢包情况。

    冗余ACK:再次确认某个报文段的ACK,而发送端之前已经收到过该报文段的确认。

    TCP规定,每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。

    TCP规定,当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。此时可以立即重传丢失的报文段。这种技术通常称为快速重传

TCP流量控制

TCP提供了流量控制服务以消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率和接收方的读取速率)。

TCP提供一种基于滑动窗口协议的流量控制机制。

实现方式:

  • 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口rwnd,即调整TCP报文段首部的“窗口”字段值,来限制发送端向网络注入报文的速率。
  • 同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口之,称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。
  • 例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文。这时,B就可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。rwnd即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,这样可以将未确认的数据量控制在rwnd大小之内,保证了A不会使B的接收缓存溢出。A的发送窗口的实际大小是取rwnd和cwnd中的最小值

TCP拥塞控制

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

当出现拥塞时,断点并不能了解到拥塞发生的细节,对于通信连接的断点来说,拥塞往往表现为通信时延的增加。

拥塞控制和流量控制有相似的地方,都是通过控制发送方发送数据的速率来达到效果。

拥塞控制与流量控制的区别

拥塞控制是让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。

相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

拥塞控制需要的窗口

发送方在确定发送报文段的速率时,既要考虑接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求维护以下两个窗口:

  • 接收窗口rwnd接收方根据目前接收缓存大小所许诺的最新窗口值,反映了接收方的容量。由接收方根据其放在TCP报文首部的窗口字段通知发送方。
  • 拥塞窗口cwnd发送方根据自己估算的网络拥塞程度而设置的窗口值,反映了网络的当前容量。只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就应减小一些,以减少注入网络中的分组数。

发送窗口的上限值应取接收窗口rwnd和拥塞窗口cwnd中较小的一个,即:

  • 发送窗口的上限值 = Min[rwnd, cwnd]

注意:接收方总是有足够大的缓存空间,因而发送窗口大小由网络的拥塞程度来决定,也就是说,可以将发送窗口等同于拥塞窗口。

拥塞控制四种算法

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复
慢开始和避免拥塞
  1. 慢开始算法

    在TCP刚刚连接好,开始发送新的TCP报文段的时候,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。而在每收到一个对新的报文段的确认后,将xwnd加1,即增大一个MSS。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。

    例如A向B发送数据,当发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,当经过一个RTT后(也称为一个传输轮次),A收到B对刚才两个报文的确认,于是就把拥塞窗口调整为4,下一次发送时就可以一次发送4个报文段。

    使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍,即cwnd的大小呈指数形式增长,这样慢开始一直把拥塞窗口cwnd增大到一个规定的慢开始门限ssthresh(阈值),然后改用拥塞避免算法。

  2. 拥塞避免算法

    拥塞避免算法的做法是:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长(即加法增大)而当出现一次超时(网络拥塞)时,则令慢开始门限ssthresh等于当前cwnd的一半(即乘法减小)。

  • 根据cwnd的大小执行不同的算法,可归纳如下

    • cwnd < ssthresh时,使用慢开始算法;
    • cwnd > ssthresh时,停止使用慢开始算法,改用拥塞避免算法;
    • cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法(通常做法)。
  • 网络拥塞的处理

    • 当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方cwnd值的一半,但不能小于2,然后把用拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

    • 拥塞避免并非完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

      image-20210722164457116

      注意:在慢开始(指数级增长)阶段,若2*cwnd > ssthresh,则下一个RTT的cwnd应等于ssthresh,而不是2*cwnd,即cwnd不能越过ssthresh值。如上图中,第16个轮次时,cwnd=8,第17个轮次时,cwnd=12而不是16。

  • 在慢开始和拥塞避免算法中,使用了乘法减小加法增大方法。乘法减小是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即很可能出现了网络拥塞),就把慢开始门限ssthresh设置为当前的拥塞窗口值的一半。当网络频繁出现拥塞时,ssthresh值就下降的很快,以大大减少注入到网络中的分组数。而加法增大,是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个RTT),就把拥塞窗口cwnd增加一个MSS大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。

快重传和快恢复
  1. 快重传

    在上一节TCP可靠传输机制中,快速重传技术使用了冗余ACK来检测丢包的发生,同样冗余ACK用于网络拥塞的检测(丢了包,当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早的重传丢失的报文段。

    当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的 报文段,而不必等待那个报文段设置的重传计时器超时。

  2. 快恢复

    快恢复算法原理:当发送端接收到连续三个冗余ack(即重复确认)时就执行乘法减小算法,把慢开始门限ssthresh设置为出现拥塞时发送方cwnd的一半。与慢开始(慢开始算法将拥塞窗口cwnd设置为1)不同之处是它把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(加法增大),使拥塞窗口缓慢的线性增大。

    由于跳过了cwnd从1起始的慢开始过程,所以被称为快恢复。

    image-20210722173838400

流量控制&拥塞控制小结

在流量控制中,发送方发送数据的量由接收方决定,而在拥塞控制中,由发送方自己通过检测网络状况而决定。实际上,慢开始、拥塞避免算法、快重传和快恢复几种算法应该是同时应用在拥塞控制机制之中的,当发送方检测到超时的时候就采用慢开始和避免拥塞,当发送送接收到冗余ACK的时候就采用快重传和快恢复。

发送方窗口的实际大小由流量控制和拥塞控制共同决定。

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改