TCP和UDP协议总结

传输层

  1. 传输层的主要功能是什么?
    1. 分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务。
  2. 传输层如何区分不同应用程序的数据流?
    1. 因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应这个程序,而不需要知道这个服务程序是干什么的。因此,我们只需要能够抽象的表示出来这些应用程序和服务程序即可。我们使用端口号来抽象标识每个网络程序。
    2. 因此:在同一IP地址(同一个目标主机)上不同的端口号是两个不同的链接。IP地址和端口号用来唯一的确定网络上数据的目的地。
  3. 传输层有哪些协议?
    1. 传输层的两大协议:TCP(传输控制协议)UDP(用户数据包协议)
    2. TCP是一个可靠的面向链接的协议
      1. TCP好像打电话,双方要通话,首先,要确定对方不是开机(网络可以到达),然后要确定是不是没有信号,然后还需要对方接听(通信链接)。
    3. UDP是不可靠的或者说无连接的协议。
      1. UDP就好似发短信,只管发出去,至于对方是不是空号(网络不可到达)能不能收到(丢包)等并不关心。

什么是 TCP 协议?

传输控制协议TCP是一个面向链接的、可靠的通信协议。

  1. 在开始传输前,需要进行三次握手建立链接
  2. 可靠性:在传输过程中,通信双方的协议模块继续进行通信
  3. 通信结束后,通信双方都会使用改进的三次握手来关闭链接

TCP的连接过程

TCP如何保证可靠性?

  • 在传输过程中,通信双方的协议模块继续进行通信,从而确保了传输的可靠性。
  • 针对乱序: 在通过三次握手进行链接时,序列号被初始化。在传输过程中,TCP继续使用这个序列号来标记发送的每一个数据段,每传送一个数据段,序列号加一。接收方依据序列号重装收到的数据段。
  • 针对丢包 :在传输过程中,接收方收到一个数据段后,会用ACK应答码向发送端回复一个IP包进行应答,确认号ACK用来告诉发送端哪些数据包已经成功接收,发送方对未被应答的报文段提供重传。
  • 针对重复 :接收端收到数据段后,查看序列号,如果已经成功接收该数据包,则丢弃后面这个数据段。
  • 针对延时 :延时造成的第一个问题,就是数据包达到接收端时乱序。
    当延时严重时,接收端一直未收到数据段,则不会回复ACK,发送端认为丢包,重发。

什么是预期确认?

确认号ACK会告诉发送端哪些数据段已经成功接收,并且确认号会向发送端指出接收端希望收到的下一个序列号。即,确实号ACK为上个数据序列号+1,这种机制称为 预期确认 。

什么是肯定确认与重新传输?

为了提高效率,我们在发送端,将数据段保存在缓冲区中,直道发送端收到来自接收端的确认号。这种机制被称为“ 肯定确认与重新传输 ”。

哪些情况会重传?

当发送端在给定时间间隔内收不到那个数据段的应答时,发送端就会重传那个数据段。

  1. 网络延时/环路,数据段丢失
  2. 网络延时,数据段推迟到达
  3. 数据段成功到达,应答因为1.2不能达到。

TCP 中,序列号和应答号有哪些作用?

  • 依靠序列号重组数据段
  • 依靠数据包消除网络中的重复包
  • 依靠序列号和应答号进行差错重传,提高了TCP的可靠性

TCP 适用哪些环境?

  • 适合TCP协议的环境:
    当网络硬件失效或者负担太重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会导致 我们的通信不正常的时候 。如果让应用程序来担负差错控制的工作,无疑将给程序员带来许多复杂的工作,于是,我们使用独立的通信协议来保证通信的可靠性是非常必要的。

什么是粘包和拆包

TCP是面向字节流的协议,就是没有界限的一串数据,因此没有包的概念。缓冲区达到大小后,将里面的数据全部发送,我们将其称为一个数据包,而粘包和拆包就是对这个数据包做处理。

  • 粘包:在TCP中有缓冲区,如果一条消息没有达到缓冲区的大小,TCP可能会将2条组合一起发送,这种就是粘包。
  • 拆包:不论是服务端还是客户端,接受到一个消息包后,根据事先约定好的包头和包尾将这个数据包进行拆分,这种操作就是拆包。

为什么UDP没有粘包和拆包?

由于UDP有消息保护边界,所以不会发生粘包和拆包问题。因此粘包和拆包只发生在TCP协议。

场景

  1. 正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
  2. 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
  3. 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
  4. 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。

解决方案

  1. 发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
  2. 发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
  3. 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
  4. 通过自定义协议进行粘包和拆包的处理。

什么是 UDP 协议?

UDP为应用程序提供的是一种不可靠的、无连接的分组交付,因此,UDP报文可能会出现丢失、乱序、重复、延时等问题。

UDP 的开销很小,具体是指什么?

  • 因为UDP是无连接的。在传输数据之前,不需要进行复杂的三次握手来建立连接。
  • 在传输数据时,没有协议间通信流量(确认信号),也不需要浪费不必要的处理时间(接收确认信号再发一下)。
  • 传输结束后,也不用再用改进的三次握手来端口连接。

UDP 数据包、 TCP 数据包大小如何确认?

  • 无论TCP还是UDP数据包,都需要交给Internet层封装为IP包,而一个IP包,包头中的长度位为16位,所以IP包最大为2的16方,即 65535 (64KB还需要减去各种包头长度)。
  • TCP因为面向流,且可以凭借序列号对大文件进行分段和重组,因此, TCP 可以用来传输较大的文件 。而UDP,如果要传输大于64KB的数据, 则需要自己在应用层进行差错控制。
  • 为了提高传输效率和减少网络通信量(协议间的通信),TCP也会一次传输足够多的数据。
  • 因为MTU的存在,TCP包和UDP包不是越大越好。(在路由中分包,在接收端重组,加大路由与接收端负担,增大丢包概率。分组丢失,整个数据包重传。)

UDP 适用哪些环境?

  • 适合UDP的环境:
    1. 在 高效可靠的网络 环境中(不需要考虑网络不好导致的丢包、乱序、延时、重复等问题),因为UDP是无连接的服务,不用消耗不必要的网络资源(TCP中的协议间通信)和处理时间(预期确认需要的时间),从而效率要高的多。
    2. 在 轻权通信 中,当需要传输的数据量很小(可以装在一个IP数据包内)时。如果我们使用TCP协议,那么,先建立连接,一共需要发送3个IP数据包,然后数据传输,1个IP数据包,产生一个确认信号的IP包,然后关闭连接,需要传输5个IP数据包。使用TCP协议IP包的利用率为1/10。而使用UDP,只需要发送一个IP数据包。哪怕丢包(服务不成功),也可重新申请服务(重传)。
    3. 在 对实时性要求很强 的通信中:在诸如实时视频直播等对实时性要求很高的环境中,从而允许一定量的丢包的情况下(直播比赛,前面丢失的包,重传出来已经意义不大了),UDP更适合。(可以根据具体需要通过应用层协议提供可靠性,不用像TCP那么严格。)
    4. UDP 很适合这种客户机向服务器传送简单服务请求的环境 。此类应用层协议包括TFTP , SNMP , DNS ,DHCP等。

注:无论UDP还是TCP,传输的都是IP数据包。当网络环境不好导致丢包时,无论TCP还是UDP都会丢包,这是没有区别的。(如果考虑发送丢包,那么TCP效率更低),只是使用TCP,当连接建立成功后, TCP程序会进行可靠性控制。

扩展知识点

  1. TCPh和UDP的具体使用
posted @ 2023-06-14 13:23  Ysun_top  阅读(28)  评论(0编辑  收藏  举报