`
猪圈羊圈
  • 浏览: 38207 次
  • 性别: Icon_minigender_1
  • 来自: 四川
社区版块
存档分类
最新评论

TCP与UDP的区别

阅读更多
UDP协议与TCP协议的比较
两者位于网络七层协议(OSI)的第四层传输层。
UDP协议是无面向连接的、不可靠的、无序的、无流量控制的传输层协议,UDP发送的每个数据报是记录型的数据报,所谓的记录型数据报就是接收进程可以识别接收到的数据报的记录边界。TCP协议是面向连接的、可靠的、有序的、拥有流量控制的传输层协议,它是字节流的协议,无记录边界。
1.记录与字节流
UDP协议:发送进程在发送每个数据报的时候并不等待多个数据报集中在一起以一个较大数据报发送出去,而是立即发送出去,它是记录型的协议。并且接收进程每次通过read或recv……获得的数据报必定是发送进程所发送的那个数据报不可能是多个数据报,接收进程可以识别到发送进程所发送的每个数据报的记录边界。
TCP协议:发送进程在发送每个数据报的时候在内核处理过程中有可能并不立即发送出去,而是会将多个数据报集中在一起以一个较大的数据报来发送,它是字节流的协议。而接收进程每次通过read来读取发送进程发送过来的数据报并不一定是发送进程原先发送数据报,接收进程无法识别每个数据报的记录边界,所以TCP协议就是字节流的、无记录边界的协议。
例如:QQ聊天所用到的协议就应该是有记录边界的,聊天过程中是以“消息”为单位,消息可以看成一个记录,所以QQ聊天协议采取UDP协议而不是TCP协议。
2.有序与无序
UDP协议:发送进程所发送的每个数据报并不按照原先发送的顺序到达接收进程,有可能早发送的数据报较后到达接收进程。因为数据报在经过中间路径的传送时会因为各个数据报传送的路径不同或者其它原因而造成这些数据报到达的顺序不同,UDP协议是无序的传输协议。所以为了使基于UDP协议的应用程序有序,必须在应用程序中设置序号、确认机制来使其有序。
TCP协议:有序协议,有超时、序号、重传、确认机制。
例如:FTP协议是用于传送文件的协议,为了确保在传送文件内容的时候,传送的每个数据报协议有序接收,所以FTP协议是基于TCP协议。
那为什么TFTP协议是基于UDP协议?因为为了保证有序,TFTP协议中引入了确认、序号字段。
这里还有一个问题,FTP协议中的控制连接传送的内容好像都是基于消息形式,客户端在控制连接上发出一个请求消息,服务器端返回一个请求结果消息,感觉应该FTP控制连接采取UDP协议,为什么采取TCP协议?因为控制连接上是交互式的消息传送,客户端在发送一个请求之后,在服务器端的响应消息未到达之前,客户端是不会发送第二个请求消息,所以不用担心这两个请求消息会叠加在一起。也就是对于交互式的消息传递也可以采用TCP协议。
3.流量控制
UDP协议:没有流量控制机制,如果发送进程发送数据报塞满了接收进程的接收缓冲区,就会丢弃数据报。出现这种情况,UDP协议不会通知发送进程减缓数据的发送速率。
TCP协议:拥有流量控制。
4.客户端通信过程比较
4.1 客户端的连接过程比较
UDP协议在创建插口之后,可以同多个服务器端建立通信,而TCP协议只能与一个服务器端建立通信,TCP不允许目的地址是广播或多播地址,UDP允许。UDP协议客户端同服务器端的通信关系可以是一对多的关系,而TCP协议只能是一对一的关系。
当然UDP协议也可以像TCP协议一样,通过connect来指定对方的ip地址、端口(对应下图1中的③操作),connect是插口连接操作,connect操作之后代表对应的插口已连接,与TCP协议不同,UDP的connect实现不包含三向握手。不管是UDP协议还是TCP协议,connect实现的共同部分都包括:若所指定插口的本地地址、端口未指定,那么connect的时候由内核为其指定本地地址、本地端口,内核根据插口中的目的地址来判断外出接口,然后指定该外出接口的IP地址为插口的本地地址。UDP协议通过connect操作之后同服务器端的通信关系成为一对一关系,不再是一对多的关系,而且这时也不能指定目的地址为广播或多播地址,因为connect函数不允许目的地址为广播或多播地址。UDP协议经过connect之后,在通过sendto来发送数据报时不需要指定目的地址、端口,如果指定了目的地址、端口,那么会返回错误。通过UDP协议可以给同一个插口指定多次connect操作,而TCP协议不可以,TCP只能指定一次connect操作。UDP协议指定第二次connect操作之后会先断口第一次的连接,然后建立第二次的连接。
客户端在建立同服务器端的连接过程中,第一步都会通过socket建立连接套接字,然后通过bind来绑定本地地址、本地端口,当然绑定操作可以不用指定,UDP协议:若未指定绑定操作,那么可以通过下面connect操作来由内核负责插口的绑定操作,若connect又未指定,那么绑定操作只好通过插口的写操作(sendto、sendmsg)来指定目的地址、端口,这时插口本地地址不会指定,为通配地址,而本地端口由内核指定,第一次sendto操作之后,插口的本地端口经过内核指定之后就不会更改。
TCP协议:若未指定绑定操作,可以通过下面connect操作来由内核负责插口的绑定操作。内核会根据插口中的目的地址来判断外出接口,然后指定该外出接口的IP地址为插口的本地地址。Connect操作对于TCP协议的客户端是必不可少的,必须指定。
(不管是UDP协议还是TCP协议,所对应插口经过connect操作之后就是已连接的插口,未经过connect就代表未连接的插口。)
通过bind来绑定本地地址、本地端口的时候,不管是已连接的还是未连接的插口,如果存在某一个插口的本地端口同用户所要绑定的本地端口相同,都会返回EADDRINUSE(Address already in use)错误。如果要绑定同已存在插口的本地端口相同的端口,必须先设置插口选项SO_REUSEADDR,然后再绑定。在linux系统中如果绑定的本地地址不同而本地端口相同可以不用设置插口选项SO_REUSEADDR,而对于其它的类UNIX系统根据《unix网络编程》中所描述的都要预先设置SO_REUSEADDR插口选项。
对于TCP协议绝不允许绑定的本地地址、端口同已存在的插口(不管是已连接的还是未连接的插口)相同。对于UDP协议通过设置插口选项SO_REUSEPORT,允许绑定相同的本地地址、本地端口。在linux系统中,没有SO_REUSEPORT这个选项,所以在linux系统中UDP协议同TCP协议一样都不允许存在两个插口有相同的本地地址、本地端口。
TCP协议同UDP协议还有一个很大的不同点:例如有一台多宿主机,它所拥有的IP地址有A、B、C,现在创建4个相同的TCP监听端口port,对应的四个插口地址结构(*,port)、(A,port)、(B,port)、(C,port),现在有客户端要同(A,port)建立连接,那么只会同(A,port)插口建立连接,而不会同拥有通配地址*的插口建立连接。而如果是创建4个相同的UDP监听端口port,对应的四个插口地址结构(*,port)、(A,port)、(B,port)、(C,port),那么有客户端要同(A,port)建立通信,那么发送到(A,port)的数据报也会拷贝一份到(*,port)插口。原因:TCP协议之间的通信是一对一的关系,而UDP可以是一对多的关系。
步骤 UDP协议 TCP协议
① socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
② bind捆绑本地地址、本地端口(可忽略,在下面connect中或第一次sendto由内核来指定) bind捆绑本地地址、本地端口(可忽略,在下面的connect操作中由内核来指定本地地址、端口)
③ connect指定对方地址、端口,建立连接(可忽略由sendto指定对方地址、端口) connect指定对方地址、端口,建立连接
④ 读或写操作 读或写操作
图 1:客户端连接过程
4.2 服务器端的连接过程比较
对于UDP协议客户端与服务器端没有什么本质的区别,每个UDP协议的客户端也是服务器端。而TCP协议就不同了,TCP协议必须通过listen来申请监听,然后通过accept来接收一个客户端的连接,当接收客户端的连接会再创建一个单独的插口用来同客户端之间进行数据通信,也就是说服务器端由一个单独的监听插口负责监听客户端的连接请求,当接收到一个来自客户端的连接请求之后,服务器会另外创建一个插口负责同客户端之间进行连接通信。
服务端在通过bind来绑定本地地址、本地端口的时候应注意的情况,同客户端是相同的。
步骤 UDP协议 TCP协议
① socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
② bind捆绑本地地址、本地端口(可忽略,在下面connect中或第一次sendto由内核来指定) bind捆绑本地地址、本地端口(可忽略,在下面listen操作中由内核来指定本地地址、本地端口)
③ connect指定对方地址、端口,建立连接(可忽略由sendto指定对方地址、端口) listen监听客户端的连接
④ 读或写操作 accept接受客户端的连接
⑤ 读或写操作

分享到:
评论

相关推荐

    TCP与UDP区别(socket编程)

    TCP 与 UDP 区别(socket 编程) TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是 TCP/IP 协议中的两个传输层协议,它们使用 IP 路由功能把数据包发送到...

    TCP_UDP_PerformanceTest 测试工具

    《TCP与UDP性能测试工具详解》 在计算机网络通信领域,TCP(传输控制协议)与UDP(用户数据报协议)是两种广泛使用的传输层协议。TCP以其可靠性和顺序传输著称,而UDP则以高效和低延迟为特点。TCP_UDP_...

    TCP&UDP测试工具_tcp&udp_TCP/UDP测试工具_TCP工具_

    在IT行业中,网络通信是至关重要的部分,而TCP(传输控制协议)与UDP(用户数据报协议)作为两种主要的传输层协议,扮演着不同角色。TCP提供的是面向连接、可靠的、基于字节流的传输服务,而UDP则是无连接、不可靠的...

    tcpudp 2.1.1 TCP/UDP 调试软件

    "tcpudp 2.1.1 TCP/UDP 调试软件"是一款专门用于分析和调试TCP与UDP协议的工具,对于初学者来说,它可以帮助理解这两种协议的工作原理,以及如何在实际应用中使用它们。该软件可能包含了如下的功能特性: 1. 数据包...

    TCP/UDP编程总结

    通过阅读TCP UDP笔记.doc,深入理解TCP连接与断开过程.pdf中的细节,以及TCP与UDP编程步骤.pdf的实践指导,初学者可以逐步构建起完整的TCP/UDP编程能力。在实际项目中,灵活运用这些知识,可以有效地处理各种网络...

    TCP与UDP区别

    主要讲述TCP协议与UDP协议的区别及应用范畴!!!

    tcp,udp测试工具

    2. UDP数据发送与接收:测试工具可以模拟UDP数据包的发送和接收,分析数据包的到达情况,检测丢包、乱序问题,同时也可以计算传输速率。 3. 压力测试:通过发送大量数据包来评估TCP或UDP在高负载下的表现,检测网络...

    TCP与UDP的区别 用途 例子

    理解TCP与UDP的区别及其用途,对于网络编程和系统设计至关重要。 首先,TCP是一种面向连接的协议,它在数据传输前会建立一个可靠的连接。这个过程包括三次握手,确保通信双方都准备好进行数据交换。TCP提供顺序传输...

    TCP-UDP服务管理 3.01

    TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是网络通信中的两种主要传输协议,它们在互联网协议栈中位于应用层和传输层之间,为上层应用提供数据传输服务。理解TCP和UDP的区别以及如何...

    TCP/UDP网络调试工具

    在IT行业中,网络通信是软件开发中的重要环节,TCP(传输控制协议)和UDP(用户数据报协议)作为两种主流的传输层协议,被广泛应用于各种网络应用中。本篇将详细阐述TCP/UDP网络调试工具及其在开发过程中的作用。 ...

    TCP/UDP socket 调试工具

    SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。她可以帮助网络编程人员、网络维护人员检查所开发的网络应用软硬件的通信状况。 ★ 全面集成 ...

    TCP_UDP_PerformanceTest.exe

    《TCP与UDP性能测试工具详解》 在计算机网络通信领域,TCP(传输控制协议)与UDP(用户数据报协议)是两种重要的传输层协议。TCP以其可靠性和有序性著称,而UDP则以其高效和实时性受到青睐。针对这两种协议的性能...

    TCP&UDP测试工具使用教程

    在IT领域,网络通信是至关重要的部分,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP提供可靠的数据传输服务,而UDP则以更低的延迟和更高的效率进行无连接的数据传输。对于网络编程人员和...

    TCP&UDP;调试工具(ZLG)

    TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是网络通信中的两种主要传输协议,它们在互联网协议族(Internet Protocol Suite)中扮演着至关重要的角色。周立功开发的“TCP&UDP调试工具”...

    小飞机-TCP-UDP测试工具.zip

    《小飞机:网络通信的TCP与UDP测试利器》 在信息技术高速发展的今天,网络通信扮演着至关重要的角色。为了确保网络应用的稳定性和效率,测试工具的使用变得越来越普遍。"小飞机-TCP-UDP测试工具"就是这样一个专门...

    TCP-UDP数据包自动发送工具V3.01版本

    在信息技术领域,网络通信是核心部分之一,TCP(传输控制协议)与UDP(用户数据报协议)作为两种主要的传输层协议,为数据的可靠传输提供了基础。TCP-UDP数据包自动发送工具V3.01版本,作为一个实用工具,为程序员和...

    TCP和UDP socket调试工具V2.2

    《TCP与UDP Socket调试工具V2.2详解》 在计算机网络编程中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常见的传输层协议,它们在数据传输方面各自有着独特的特性和应用场景。本文...

    STM32开发工具 TCP&UDP测试工具

    STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试工具STM32开发工具 TCP&UDP测试...

    TCP&UDP测试工具

    TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是互联网中最基础的两种传输层协议,它们在计算机网络通信中扮演着至关重要的角色。本篇文章将详细介绍这两种协议,并结合一款名为"TCP&UDP...

Global site tag (gtag.js) - Google Analytics