zoukankan      html  css  js  c++  java
  • TCP与UDP

    前言 

      TCP与UDP是传输层两个具有代表性的协议。TCP提供可靠的通信传输,UDP常被用于让广播和细节控制交给应用的通信传输。它们是通过接受数据中的目标端口号识别目标处理程序。

      TCP是面向连接的,可靠的流协议,为提供可靠性传输,实行“顺序控制”或“重发机制”,还具备“流控制”、“拥塞控制”。

      UDP是不具备可靠性的数据报协议。细微的处理它会交给上层应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。主要应用于那些对告诉传输和实时性要求较高的通信或广播通信。

    UDP

      UDP是User Datagram Protocol的缩写。不提供复杂的控制机制,利用IP提供面向无连接的通信服务,可以随时发送数据。并且它是将应用程序发来的数据在接收的那一刻,立即按照原样发送到网络上的一种机制。

      即使出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包到达顺序乱掉时也没有纠正功能。如果需要这些细节控制,那么久不得不交由采用UDP的应用程序去处理。

    TCP

      TCP充分地实现了对数据传输时的各种控制功能,可以进行丢包时的重发机制,还可以对次序乱掉的分包进行顺序控制。作为面向有连接的协议,只有确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。

    TCP实现可靠性传输的机制

    1、通过序列号与确认应答提高可靠性

      在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大,也有可能是数据对方已经收到,只是返回的确认应答在途中丢失,还有可能是一些其他原因导致确认应答延迟到达,进而重新发送数据。

    2、重发超时如何确定

      重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。在BSD的Windows系统中,超时都是以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍(偏差的最小值也是0.5秒,因此最小的重发时间至少是1秒)。不过由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。

      数据重发之后若还是收不到确认应答,则进行再次发送。此时,确认等待时间将会以2倍、4倍的指数函数增长。

    3、连接管理

      由于TCP是面向连接的通信传输,会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。在通信结束时会进行断开连接的处理(FIN包)。即常见的三次握手,四次挥手过程。

    4、TCP以段为单位发送数据

      在建立TCP连接的同时,也可以确定发送数据包的单位,成为“最大消息长度”(MSS),最好的情况,最大消息长度正好是IP中不会被分片处理的最大数据长度。TCP在传输大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。

      MSS是在三次握手的时候,在两端主机之间计算得出。两端的主机在发出建立连接请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小,然后会在两者之中选择一个较小的值投入使用。

    5、利用窗口控制提高速度

      TCP以1个段为单位,每发送一个段进行一次确认应答的处理,包的往返时间越长通信性能就越低。引入窗口的概念,指无需等待确认应答而可以继续发送数据的最大值。

      窗口控制中确认应答不再是以每个分段,而是以窗口进行确认,即发送了一个段以后不必要一直等待确认应答,而是继续发送,转发时间会被大幅度的缩短。

    6、窗口控制与重发控制

      (1)确认应答未能返回的情况下,数据已经到达对端,是不需要再次发送的,然而在没有窗口控制的时候,没有收到确认应答的数据都会被重发,有了窗口控制,某些确认应答即便丢失也无需重发。

      (2)某报文段丢失的情况下,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,会将其所对应的数据进行重发。

  • 相关阅读:
    VS2010如何以管理员权限启动? 转载
    ArcGIS属性编辑字符型字段值出现乱码问题
    点批量移动到线上(ArcGis版) 转载
    C#判断数据库中取出的字段值是否为空(NULL) .
    方框内打勾(钩)的符号(word和excel)
    C# 获取屏幕的大小
    神通数据库的备份和还原
    推荐系列文章:《DotText源码阅读》
    Lucene.Net 2.3.1开发介绍 —— 阅读索引(转载)
    Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)
  • 原文地址:https://www.cnblogs.com/xiaoxli/p/9603420.html
Copyright © 2011-2022 走看看