UDP套接口相关

绑定某个UDP端口和通配地址的一个套接口能够在任何接口上接收单播,广播和多播数据报,因此需要确定某个外来UDP数据报的宿地址及其接收扣(也就是到达接口)。

TCP是一个字节流协议,并使用滑动窗口机制,因此没有诸如记录边界亦或发送者数据发送能力淹没接收者数据接收能力之类的事。然而对于UDP而言,每个输入操作对应一个UDP数据报(一个记录),因此当收取的数据报大于应用进程的输入缓冲区时就有如何处理的问题。

如果系统不支持IP_RECVDSTADDR套接口选项,那么确定外来UDP数据报之宿IP地址的方法之一是捆绑所有接口地址并使用select

在源自BSD的系统上,当到达的一个UDP数据报超过应用进程提供的缓冲区容量时,recvmsg在其msghdr结构的msg_flags成员上设置MSG_TRUNC标志。所有支持msghdr结构及其msg_flags成员的源自Berkeley的实现都提供这种通知。

不幸的是并非所有实现都以这种方式处理超过预期长度的UDP数据报。这里存在以下3个可能的情形:

1                      丢弃超出部分的字节并向应用进程返回MSG_TRUNC标志。本处理方式要求应用进程调用recvmsg以接收这个标志。

2                      丢弃超出部分的字节但不告知应用进程这个事实。

3                      保留超出部分的字节并在同一套接口上后续的读操作中返回它们。

因为不同的实现在处理超过应用进程缓冲区大小的数据报时存在差异,检测本问题的一个有效方法是:总是分配比应用进程预期接收的最大数据报还多一个字节的应用进程缓冲区,如果收到长度等于该缓冲区的数据报,那么认定它是一个过长数据报。

 

 

UDP的优势:

UPD支持广播和多播,如果应用程序使用广播或多播,就必须使用UDP

UDP没有连接建立和拆除。

UDP相比TCP的劣势:

       没有正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序。

       窗口式流量控制。

       慢启动和拥塞避免。

 

总结:

对于广播或多播应用程序必须使用UDP,任何形式的错误控制都必须加到客户和服务器程序中,不过应用系统往往是在少许一定量的错误可以接受的前提下(例如音频和视频的分组丢失)使用广播和多播。

对于简单的请求-应答应用程序可以使用UDP,不过错误检测功能必须加到应用程序内部。错误检测至少涉及确认,超时和重传。流量控制对于合理大小的请求和应答往往不成问题。

对于海量数据传输(例如文件传输)不应该使用UDP

 

如果想要让请求-应答应用程序使用UDP,那么必须在客户程序中增加以下2个特性:
       1    超时和重传:用于处理丢失的数据报

2               序列号:供客户验证一个应答是否匹配相应的请求

增加序列号比较简单:客户为每个请求冠以一个序列号,服务器必须在返回给客户的应答中反馈这个序列号。这样客户就可以验证某个给定的应答是否匹配早先发出的请求。

处理超时和重传的一个老式方法是先发送一个请求并等待N秒钟。如果期间没有收到应答,那就重新发送同一请求并在等待N秒钟。如此发送一定次数后放弃发送。

 

大多数UDP服务器是迭代运行的:服务器等待一个客户请求,读入这个请求,处理这个请求,送回其应答,接着等待下一个客户请求。然而当客户请求的处理需耗用过长时间时,我们期望UDP服务器程序具有某种形式的并发性。

“过长时间”的定义是另一个客户因服务器正在服务当前客户而被迫等待的被认为是过长的时间。对于UDP,我们必须应对两种不同类型的服务器:

1               第一种UDP服务器比较简单:读入一个客户请求并发送一个应答后,与这个客户就不再相关了。这种情况下,读入客户请求的服务器可以fork一个子进程并让子进程去处理该请求。该“请求”(即请求数据报的内容以及含有客户协议地址的套接口地址结构)通过由fork复制的内存映像传递给子进程。子进程然后把它的应答直接发送给客户。

2               第二种UDP服务器与客户交换多个数据报。问题是客户知道的服务器端口只有服务器的众所周知端口的一个。一个客户发送其请求的第一个数据报到达这个端口,但是服务器如何区分这是来自该客户同一个请求的后续数据报还是来自其他客户别的请求的数据报呢?这个问题典型的解决办法是让服务器为每个客户创建一个新的套接口,在其上bind一个临时端口,然后使用该套接口发送对于该客户的所有应答。这个办法要求客户查看服务器第一个应答的源端口号,并把请求的后续数据发送到该端口。

 

第二种类型的例子是TFTP

 

IPV6分组信息

IPv6允许应用进程为每个外出数据报指定最多5条信息:

1               IPv6地址

2               外出接口索引

3               外出跳限

4               下一步跳限

5               外出流通类别

这些信息作为辅助数据使用sendmsg发送。它们还有对应的套接口粘附选项,用于对所发送的每个分组隐式指定这些信息,IPv6还允许为每个接收分组返回4条类似的信息,它们同样作为辅助数据由recvmsg返回:

1           宿IPv6地址

2           到达接口索引

3           到达跳限

4           达到流通类别

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值