理解UDP
UDP套接字的特点
UDP提供的是不可靠的数据传输服务
UDP的 可靠性 不如TCP,但UDP在 结构 上会更加简洁,他不会发送类似ACK那样的应答消息,也不会像SEQ那样给数据包分配序号
UDP的性能通常会比TCP更好
为了提供可靠的数据传输服务,TCP在不可靠的IP层进行流控制,而UDP就缺少这种流控制机制
这里的 流控制机制,我的理解是 字节流数据的传输控制
包括 按序传递(序列号标识字节位置)、重传机制、确认应答机制、流量控制、滑动窗口、拥塞控制 等等一些列对 传输的字节流进行控制的机制
UDP内部工作原理

UDP的高效使用
TCP比UDP慢通常是因为:
-
收发数据前后进行的连接设置及清除过程
-
收发过程中为保证可靠性而添加的流控制
实现基于UDP的服务端和客户端
UDP的服务端和客户端没有连接过程
UDP不需要像TCP那样在 连接状态 下交换数据(即listen和accept)
UDP只需要 创建套接字 和 进行数据交换
UDP服务端和客户端都只需一个套接字
TCP中,套接字之间应该是一对一的关系
而在UDP中,一个套接字就可以和任意主机进行数据传输

基于UDP的数据IO函数



UDP套接字的地址分配
-
使用
bind():不区分UDP和TCP -
首次 调用
sendto()时 自动分配IP和端口号,并且一直保留知道程序结束
UDP的数据传输特性和调用connect函数
UDP存在数据边界,数据传输过程中调用IO函数的次数非常重要
已连接UDP套接字和未连接UDP套接字

每次调用 sendto() 函数都会重复上述过程,每次都会变更目标地址,所以可以重复利用同一UDP套接字向不同目标传输数据。但这也会带来大量的开销,尤其是对一个固定对象的收发
未注册目标地址信息的套接字称为未连接套接字,注册了的称为已连接套接字
UDP套接字默认属于未连接套接字
创建已连接UDP套接字
调用connect函数即可

这并不会和对方 建立连接,这只想向 UDP套接字注册目标IP和端口信息
注册完地址信息后,每次调用 sendto() 时只需传输数据,因为已经指定了收发对象,并且除了sendto/recvfrom,还可以使用read/write
注意点
-
使用 connect() 函数进行UDP连接时,它只是指定了一个远程目标的IP地址和端口,简化了后续的发送操作 (sendto() 不指定发送地址时,默认使用注册的地址)
-
如果你在已经调用connect()后,使用sendto()并指定一个不同的目标地址,数据会被发送到sendto()中指定的目标地址,而不是connect()时绑定的地址
-
多次调用 connect(),每次会覆盖之前的连接信息,即 只能有一个目标地址被绑定到套接字
posted on
浙公网安备 33010602011771号