理解UDP

UDP套接字的特点

UDP提供的是不可靠的数据传输服务

UDP的 可靠性 不如TCP,但UDP在 结构 上会更加简洁,他不会发送类似ACK那样的应答消息,也不会像SEQ那样给数据包分配序号

UDP的性能通常会比TCP更好

为了提供可靠的数据传输服务,TCP在不可靠的IP层进行流控制,而UDP就缺少这种流控制机制

这里的 流控制机制,我的理解是 字节流数据的传输控制

包括 按序传递(序列号标识字节位置)重传机制确认应答机制流量控制滑动窗口拥塞控制 等等一些列对 传输的字节流进行控制的机制

UDP内部工作原理

1

UDP的高效使用

TCP比UDP慢通常是因为:

  1. 收发数据前后进行的连接设置及清除过程

  2. 收发过程中为保证可靠性而添加的流控制

实现基于UDP的服务端和客户端

UDP的服务端和客户端没有连接过程

UDP不需要像TCP那样在 连接状态 下交换数据(即listen和accept)

UDP只需要 创建套接字进行数据交换

UDP服务端和客户端都只需一个套接字

TCP中,套接字之间应该是一对一的关系

而在UDP中,一个套接字就可以和任意主机进行数据传输

1

基于UDP的数据IO函数

1

1

1

UDP套接字的地址分配

  1. 使用 bind():不区分UDP和TCP

  2. 首次 调用 sendto()自动分配IP和端口号,并且一直保留知道程序结束

UDP的数据传输特性和调用connect函数

UDP存在数据边界,数据传输过程中调用IO函数的次数非常重要

已连接UDP套接字和未连接UDP套接字

1

每次调用 sendto() 函数都会重复上述过程,每次都会变更目标地址,所以可以重复利用同一UDP套接字向不同目标传输数据。但这也会带来大量的开销,尤其是对一个固定对象的收发

未注册目标地址信息的套接字称为未连接套接字,注册了的称为已连接套接字

UDP套接字默认属于未连接套接字

创建已连接UDP套接字

调用connect函数即可

1

这并不会和对方 建立连接,这只想向 UDP套接字注册目标IP和端口信息

注册完地址信息后,每次调用 sendto() 时只需传输数据,因为已经指定了收发对象,并且除了sendto/recvfrom,还可以使用read/write

注意点

  1. 使用 connect() 函数进行UDP连接时,它只是指定了一个远程目标的IP地址和端口,简化了后续的发送操作 (sendto() 不指定发送地址时,默认使用注册的地址)

  2. 如果你在已经调用connect()后,使用sendto()并指定一个不同的目标地址,数据会被发送到sendto()中指定的目标地址,而不是connect()时绑定的地址

  3. 多次调用 connect(),每次会覆盖之前的连接信息,即 只能有一个目标地址被绑定到套接字

 posted on 2025-06-17 16:34  Dylaris  阅读(59)  评论(0)    收藏  举报