网络基本功:UDP/IP与TCP/IP的区别

来源:互联网 发布:人工智能大学专业 编辑:程序博客网 时间:2024/06/04 19:56

       以前就写过网络编程相关的程序,只要是网络编程一般都会涉及到数据的传递交互,很自然就会遇到套接字Socket接口的调用,比如聊天工具,就会涉及到UDP和TCP,那么问题来了,它们之间的区别是什么呢?
TCP与UDP的工作流程图如下:

TCP工作流程图                                                                                                  UDP工作流程图

       在网上的资料和看了部分TCP/IP详解这本书后,在这里小小的记录一下!加深下印象!

说到区别:可能我们都会随口说出:

        (1).TCP(Transmission control protocol)传输控制协议,是面向连接安全的;而UDP(User Datagram protocol)是不安全的。

         (2). 对通讯质量要求高的地方需要用TCP,如浏览器,QQ文件传输,如果对质量要求不高和消息快速到达则用UDP,如QQ语音,QQ视屏;

         (3). 由于UDP没有连接和流控方面的限制机制,所以其相对于TCP来说不容易收人攻击;儿tcp容易收人攻击,容易被人利用,如实现DOS,DDOS攻击,CC等,UDP有UDP Flood等,这些仅限一些资料的了解,其实我也不太清楚这些的攻击的具体玩法!

         (4). UDP传递的速度比TCP(网络状态相同的条件下),因为少了一系列的控制机制;

。。。。

因为上面都是一些传统的泛泛而谈:

下面我稍详细的看一下他们之间的差别(其实最主要还是体现在它的安全和可靠上面),下面没条的具体情况会另外阐述,这里大体总结:

1. 确认连接;

        确认连接,TCP和UDP就像是打电话和发短信,打电话就是必须等待对方接电话,并且确认是我们要找的那个人才开始交谈正事,否则无法进行。发短信就是我不用管对方能不能看,网络时候通畅,信息已经发出去了,对于结果是未知的!

确认连接还有TCP的三次挥手和四次握手,这在以后还得详细解释,这里直接跳过。

2 .消息重传:

       TCP是一种可靠的连接机制,但是TCP的报文是封装在IP协议中的,IP协议的责任就是将数据从原地址发送到目的地址,选择传送道路,也即路由功能。但它不保证消息传递的可靠性,流控制和包顺序等主机到主机的一些比较普通的服务,所以如何保证数据的可靠性呢?

这里利用了超时定时器和重传队列以及积累确认机制来实现丢失数据的重传功能,一保证数据的安全准确到达。

这里设计两个时间:重传超时时间RTO(Retransmission time out),往返时间:RTI(round-trip time)

问题一:如何维护重传时间RTO?

重传的间隔时间太长,性能下降;太短则导致大量的不必要的重传。(Jacobson 1998)和karn算法;

3. 流量控制(滑动窗口);

          TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。
滑动窗口的基本原理是:

         TCP使用窗口机制进行流量控制。当连接建立后,发送方和接收方都要分配一块自己的缓冲区来存储接收的数据,为了防止就收方已经没有缓冲区进行接收而发送方在在继续发送,出现网络拥塞和故障。所以用滑动窗口进行了流控。具体实现:接收端将已接受的数据和自己剩下的窗口大小通过确认信息发给发送端;发送方根据接收方剩余的大小空间来定量的发送合适的数据给接收方。它也是建立在“确认重传”的基础之上。用来防止接收方可用的数据缓冲区溢出。

          TCP滑动窗口是动态的,有点儿类似于这样一道数学题:一个水池,体积恒定为V,每小时进水量为V1,出水量为V2.当水池满了,也就不能再注入了,它类似于接收端;还有一个控制系统,类似于发送端,每次根据水池里的水量来控制着水流量,不让水池溢出也不让水池干涸,浪费资源,保持流动畅通。

4. 拥塞机制; 

        计算机网络中的带宽,交换节点中的缓存和处理机制,都是网络资源。在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。
        拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。流量控制是点对点通信量的局部控制机制,其参与者仅仅是发送方和接收方,它只考虑了接收端的就收能力,而没有考虑到网路的传输能力,而拥塞控制是一个全局性的过程,注重于整体,其考虑的是整个网络的传输能力,是一种全局控制机制,正因为流控制的这种局限性,从而导致了拥塞崩溃现象的发生。

发送方通过维持一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑接受方的接收能力,发送窗口可能小于拥塞窗口。

设计到的算法有:慢开始算法(试探法--指数增加),避免拥塞算法,快恢复,快重传,乘法减小,加法增大(线性)。

5. 数据顺序;

          如果发送端进行了两次发送数据,send1和send2,顺序的,但是send2的路由被选择了一条比send1更近的路由,这样会不会导致先收到send2呢?发生乱序呢?

         由于TCP数据是封装在IP协议里的额,IP协议是不保证数据传递的顺序,可靠,和流控制这些服务的。所以有可能会产生数据的错乱,如果数据出错,则可以通过CIMP报错告诉用户。
         TCP是流式数据传输,TCP通过窗口可以保证传输左右顺序,在接收到前面的数据之前不会对后面的数据发送Ack,所以TCP可以在接收端对数据进行重排,丢弃重复的数据,所以可以保证数据的准确与顺序性。如果数据量太大,(TCP数据报还要由下层的IP协议封装,由于IP数据报到达目的后可能顺序变乱,因此TCP报文顺序也可能变乱)因此到达目的后如果报文顺序混乱,但是TCP下层的IP既然会在发送方片,那么也可以在接收方重装,不可能将数据按IP的格式处理分片以后,发过去就不管了,因为应用程序不知道这个数据是经过分片的,所以IP一定会吧数据组装成原先一模一样的数据,这是IP对数据处理的原则,只有按规则才可以好好玩儿.IP可以在接收端是可以通过包号来进行重组的。因为TCP只对数据进行传输,不对数据进行修改。选择传送的路径路由,则是由IP来完成。传输的控制则由ICMP来完成,各负其责,协同作战。

          目前我觉得以上5点是TCP独有的在可靠性方面的表现,而UDP就缺少了这些控制机制。当然UDP也有自己的优点:比如传输速度快,受攻击的概率要小,他们在不同的场合都有自己独特的长处,不能简单的轮长短,好坏!具体情况具体分析!

          本人愚钝,领悟至此,颇有感慨,与己共勉,陋文浅显,见者海涵。探索阶段,若有不对,欢迎斧正!


资料参考:

《TCP/IP详解》第一卷

http://bbs.csdn.net/topics/20110240
http://bbs.csdn.net/topics/80321608

http://www.360doc.com/content/14/0325/09/1317564_363500997.shtml

http://my.oschina.net/xinxingegeya/blog/485650

http://blog.chinaunix.net/uid-20778955-id-539945.html  

http://blog.csdn.net/sicofield/article/details/9708383 

http://blog.csdn.net/great3779/article/details/6578060 

http://blog.sina.com.cn/s/blog_48ebca64010003t0.html 

3 0