TCP和UDP概念及区别

一、TCP、UDP概念

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP(用户数据包协议)是同一层内另一个重要的传输协议。

在因特网协议族中,TCP所在层位于IP层之上、应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

UDP(User Datagram Protocol,用户数据报协议)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。 

TCP报文格式
UDP报文格式

二、TCP和UDP的优缺点

TCP优点:可靠、稳定。可靠体现在TCP在传输数据之前,会有三次握手来建立连接,而且在数据传输时,有确认、重传、滑动窗口、拥塞控制等机制,在数据传完后,还会断开连接用来节约系统资源。

TCP缺点:慢,效率低,占用系统资源高,易被攻击。TCP在传递数据之前,要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。由于TCP存在确认机制和三次握手机制,这些会导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP优点:快,比TCP稍安全。UDP没有TCP的握手、确认、滑动窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如UDP Flood攻击等。

UDP缺点:不可靠,不稳定。因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

三、TCP和UDP的应用场景

TCP:当对网络通讯质量有要求时,比如整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。在日常生活中,常见使用TCP协议的应用,比如浏览器使用HTTP,Outlook使用POP、SMTP,QQ文件传输等。

在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。 

我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

TCP为了确保可靠性做了哪些工作?
校验和:是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。
序列号:发送方将数据进行排序然后发送
确认应答:响应方完整接收到消息后返回给对方一个确认号(下一个数据的编号)
连接管理:三次握手和四次挥手
超时重传:当数据丢包,发送方在一定时间内没有收到确认号就将该内容重新发送
流量控制:根据接收方接受能力的大小决定发送多少数据。
拥塞控制:使用拥塞窗口,表示发送数据的大小。 
     拥塞窗口初始为1,每收到一个ACK,拥塞窗口加1。 
     这样,第一次发一个,收到一个确认后拥塞窗口变为2。 
     然后拥塞窗口依次变为8,16……呈指数增长。 
     当拥塞窗口大小超过阈值(阈值为窗口的最大值)时采用线性增长。且一旦产生超时重传,就将阈值减半。
TCP为了保障性能做了哪些工作?
滑动窗口:接收方还有多大的缓冲区可以用于接收数据
快速重传:当数据丢包,发送方收到接收方三次相同确认序号,就将该内容重新发送
延迟应答:接收到N个包或一定时间才给对方确认
捎带应答:将确认报文粘在下一个要发送的报文上

基于套接字的TCP协议编程。不同于UDP的是,客户端需和服务端建立连接,才能相互进行收发消息。使用线程处理多个用户的请求,使其收发数据。

UDP:当对网络通讯质量要求不高时,要求网络通讯速度能尽量快,这时就可以使用UDP。在日常生活中,常见使用UDP协议的应用,比如QQ语音、QQ视频、TFTP等。

UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。 

使用套接字基于UDP协议,服务端先bind一个ip和port,然后进行收消息并把消息返还给客户端。而客户端无需bind连接服务器,只需知道它的ip和port就可以给它发消息。​​​​​​​UDP没有发送缓冲区,上层交付数据会调用sendto函数直接交给内核,由内核将数据进行网络协议传输。 但有接收缓冲区,但不能保证报文的顺序性和一致性。如果缓冲区满了,再到达的数据就会被丢弃。

我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。 

这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

UDP应用场景:
  1.面向数据报方式
  2.网络数据大多为短消息 
  3.拥有大量Client
  4.对数据安全性无特殊要求
  5.网络负担非常重,但对响应速度要求高

四、TCP和UDP的区别(总结)

第一:TCP和UDP最大的区别就是:TCP是面向连接的,UDP是非面向连接的。通俗一点说就是:TCP管发管到,UDP管发不管到。因此,在安全性方面来说,TCP更具有优越性。

第二:TCP偏重的是点对点的通信,使用时服务器和客户端的区别显而易见,而UDP则可以使用组播实现一对多,通信时更像一个群聊系统,几乎没有客户端和服务器的区别,在时间和空间上具有更高的节约性。使用组播时,确定一个D类地址作为组的地址,将本机加入组中,向组内发送消息,从组中接收消息。

第三:在具体编写的代码结构上,TCP是通过创建Socket对象进行连接,从连接对象上得到输入输出流,在流中读写从而通信。而UDP则是在本机创建DatagramSocket对象,将数据包装成DatagramPacket包来发送,其中包里有要发送到的地址。

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保   证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少; 
3.UDP程序结构较简单 
4.流模式(TCP)与数据报模式(UDP); 
5.TCP保证数据正确性,UDP可能丢包 
6.TCP保证数据顺序,UDP不保证 

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
UDP补充

UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
TCP补充

TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

TCP通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP对系统资源要求较多,UDP对系统资源要求较少。

UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。

(1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。

(2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。

采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。

1.TCP提供的是面向连接的、可靠的数据流传输; UDP提供的是非面向连接的、不可靠的数据流传输。

2.TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失,不重复,按序到达; UDP尽最大努力交付,即不保证可靠交付。

3.TCP面向字节流; UDP面向报文。

4.TCP连接只能是点到点的; UDP支持一对一、一对多、多对一和多对多的交互通信。

5.TCP首部开销20字节; UDP的首部开销小,只有8个字节。

6.TCP的逻辑通信信道是可靠信道; UDP的逻辑通信信道是不可靠信道。

### TCPUDP的主要区别 #### 一、基本概念 TCP(Transmission Control Protocol,传输控制协议)UDP(User Datagram Protocol,用户数据报协议)都是位于OSI模型中的传输层协议。两者的核心差异在于其设计目的服务质量的不同。 - **TCP** 是一种面向连接的协议,提供了高可靠性的数据传输服务[^1]。 - **UDP** 则是一种无连接的协议,专注于快速的数据传递而不保证可靠性[^4]。 --- #### 二、主要特点比较 | 特性 | TCP | UDP | |----------------|-----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | **连接方式** | 面向连接,在正式通信前需完成三次握手建立连接 | 无连接,无需事先建立连接即可直接发送数据 | | **可靠性** | 提供可靠的数据传输,具备确认、重传机制以保障数据完整性 | 不提供可靠性保障,可能出现丢包、乱序等问题 | | **有序性** | 数据按顺序传输,接收方会重组数据包确保最终结果一致 | 不保证数据包的顺序,可能导致乱序到达 | | **性能开销** | 较高的性能开销,因为需要维护连接状态并执行复杂的错误检测逻辑 | 性能开销较低,适合对速度敏感的应用场景 | --- #### 三、典型应用场景分析 ##### 1. **TCP 的典型应用场景** 由于 TCP 协议具有高度的可靠性,适用于那些无法容忍数据丢失或错序的情况。以下是常见的 TCP 应用场景: - 文件传输:FTP HTTP 等文件下载协议依赖于 TCP 来确保完整的数据交付[^2]。 - 邮件服务:SMTP、POP3 IMAP 使用 TCP 建立稳定通道以便安全地交换邮件信息。 - 聊天工具:即时消息应用程序如 QQ 或微信利用 TCP 维护长时间稳定的对话链路。 ##### 2. **UDP 的典型应用场景** 相比之下,UDP 更加注重效率而非准确性,因此它更适合以下几种情况: - 实时音视频流:在线直播平台或者 VoIP 技术采用 UDP 处理音频视频帧,即使偶尔发生轻微失真也能够接受[^3]。 - 游戏网络同步:多人游戏引擎倾向于使用 UDP 减少延迟影响玩家操作响应时间。 - DNS 查询:域名解析过程中频繁使用的短小请求非常适合通过 UDP 完成高效交互[^5]。 --- ### 示例代码展示两种协议创建套接字的方式 下面是 Python 中分别基于 `socket` 模块实现简单的 TCP UDP 客户端的例子: ```python import socket # 创建一个基于 TCP 的客户端 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.connect(("example.com", 80)) message = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" tcp_socket.sendall(message.encode()) data = tcp_socket.recv(1024) print(data.decode()) tcp_socket.close() # 创建一个基于 UDP 的客户端 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) message = b"Hello Server!" udp_socket.sendto(message, ("localhost", 9999)) response, addr = udp_socket.recvfrom(1024) print(response.decode()) udp_socket.close() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值