TCP与UDP的区别

今天去阿里面试,面试官问了几个问题:

(1)C和C++的区别、以及内存管理上的区别?

(2)TCP、UDP协议的区别?

(3)C++中的集合,map与set的区别?

(4)C++中静态变量放在哪个内存区?

第一个题至今不知道有什么区别,map是key和value对应,set只有键没有值。C++中静态变量应该是放在全局数据区。

TCP与UDP都属于传输层协议,TCP是面向连接的协议,发送数据之前需要与接收端进行3次会话,建立有效的连接,

UDP协议时用户数据报协议,是面向非连接的,适用于少量数据传输对可靠性要求不高的场景,比如QQ。

在网上找了一些答案,记下来以便自己复习。

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

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

1。TCP传输存在一定的延时,大概是1600MS(移动提供),UDP响应速度稍微快一些。
 2。TCP包头结构
  源端口16位
  目标端口 16位
  序列号 32位
  回应序号 32位
  TCP头长度 4位
  reserved 6位
  控制代码6位
  窗口大小16位
  偏移量16位
  校验和16位
  选项 32位(可选) 
  这样我们得出了TCP包头的最小大小.就是20字节.

  UDP包头结构
  源端口16位
  目的端口16位
  长度 16位
  校验和 16位
  UDP的包小很多.确实如此.因为UDP是非可靠连接.设计初衷就是尽可能快的将数据包发送出去.所以UDP协议显得非常精简.

### 3.1 协议特性连接方式 TCP 是一种面向连接的协议,通信双方在传输数据前必须通过三次握手建立连接,确保数据传输的可靠性和有序性。这种机制使得 TCP 适用于对数据完整性和准确性要求较高的场景,例如网页访问、文件传输和电子邮件服务[^4]。 UDP 是一种无连接的协议,数据发送方直接将数据报发送给接收方,而无需预先建立连接。这种方式减少了通信延迟,但牺牲了可靠性。UDP 的设计轻量高效,首部仅需 8 字节,适合实时性要求高的应用,例如视频会议、在线游戏和实时音视频传输[^2]。 ### 3.2 数据传输可靠性 TCP 采用面向字节流的方式传输数据,发送端将数据分解为多个小的数据报文,并确保接收端按顺序接收。TCP 通过确认机制、重传机制和流量控制来保证数据的完整性和顺序性,避免数据丢失或损坏[^3]。 UDP 采用基于数据报的方式传输数据,发送端将整个数据报直接发送出去,接收端按数据报接收。UDP 不保证数据的可靠性和顺序性,因此在传输过程中可能会出现数据包丢失或乱序的情况。然而,这种机制减少了传输延迟,提高了传输效率[^3]。 ### 3.3 通信模式网络支持 TCP 支持点对点通信,即一对一的通信模式。这种模式适用于需要稳定连接和数据完整性的场景,例如网页浏览和文件下载[^3]。 UDP 支持一对一、一对多和多对多的通信模式,能够支持广播和多播等复杂网络通信场景。这种灵活性使得 UDP 成为实时通信和多播传输的理想选择,例如实时音视频传输和网络直播[^2]。 ### 3.4 流量控制拥塞控制 TCP 具备拥塞控制机制,能够根据网络状况动态调整数据传输速率,避免网络拥塞。这种机制确保了 TCP 在高负载网络环境下的稳定性,但可能会影响传输效率[^3]。 UDP 没有拥塞控制机制,数据传输速率不受网络状况的影响。这种设计使得 UDP 在实时性要求高的场景中表现更佳,但也可能导致网络拥塞。 ### 3.5 报文头部传输效率 TCP 的报文头部长度为 20-60 字节,包含多个字段用于控制数据传输和连接管理。这种设计增加了协议的复杂性,但也提高了数据传输的可靠性[^3]。 UDP 的报文头部长度仅为 8 字节,结构简单,减少了传输开销。这种设计使得 UDP 在传输效率方面优于 TCP,但缺乏可靠性保障。 ### 3.6 应用场景性能需求 TCP 适用于对数据完整性和准确性要求较高的场景,例如网页访问、文件传输和电子邮件服务。这些场景需要确保数据的完整性和顺序性,因此 TCP 是更合适的选择。 UDP 适用于对实时性要求较高的场景,例如视频会议、在线游戏和实时音视频传输。这些场景允许一定程度的数据丢失,但要求低延迟和高传输效率,因此 UDP 是更合适的选择。 ### 代码示例:TCP UDP 通信的简单实现 以下代码展示了如何使用 Python 实现 TCPUDP 通信的基本功能。 #### TCP 通信示例 ```python import socket # 创建 TCP 服务器 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 12345)) server_socket.listen(1) print("TCP Server is listening...") # 接受客户端连接 client_socket, addr = server_socket.accept() print(f"Connected by {addr}") # 接收数据 data = client_socket.recv(1024) print(f"Received: {data.decode()}") # 发送响应 client_socket.sendall(b"Hello from TCP Server") # 关闭连接 client_socket.close() server_socket.close() ``` ```python import socket # 创建 TCP 客户端 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 12345)) # 发送数据 client_socket.sendall(b"Hello from TCP Client") # 接收响应 response = client_socket.recv(1024) print(f"Received: {response.decode()}") # 关闭连接 client_socket.close() ``` #### UDP 通信示例 ```python import socket # 创建 UDP 服务器 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('localhost', 12345)) print("UDP Server is listening...") # 接收数据 data, addr = server_socket.recvfrom(1024) print(f"Received: {data.decode()} from {addr}") # 发送响应 server_socket.sendto(b"Hello from UDP Server", addr) # 关闭连接 server_socket.close() ``` ```python import socket # 创建 UDP 客户端 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 发送数据 client_socket.sendto(b"Hello from UDP Client", ('localhost', 12345)) # 接收响应 response, addr = client_socket.recvfrom(1024) print(f"Received: {response.decode()}") # 关闭连接 client_socket.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值