请各位高手多多指教喔!这只是我在看了一次《TCP/IP详解 卷 卷一》后写的,这其中可能有理解上的偏差。向Stevens先生致敬!
 
                        
                          探析UDP服务器的实现
 
UDPTCP都有65535216-1)个端口。知名端口号为1-255之间,256-1023的端口号一般是由Unix系统占用,1024-5000是为客户端的临时端口号,大于5000的端口号是为其他服务器预留的。
使用各个不同的知名端口号的UDP服务器虽然提供不同的服务,但是其实现原理相似的。为了能详细说明UDP服务器的实现,本文只以53号知名端口号为例进行说明。
  当在DNS服务器上启动运行DNS服务后,便会在计算机系统上创建一个相应的DNS服务进程。DNS服务进程会在53UDP端口上进行监听所有客户请求。DNS服务进程属于TCP/IP模型中的应用层。一端主机应用层需与另一个计算机系统的应用层进行通信,首先会经过TCP/IP模型中的传输层进行通信,这个在传输层与应用层的DNS服务进程进行通信的就是端点。
  UDPTCP)服务器在创建服务进程时便会在传输层(UDP模块,TCP模块)中创建相对应的端点。UDP端点(TCP端点)可分为两类端点(如图1所示)。
 
 
 
 
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
                 1
监听型端点:在相应的端口上监听各个客户请求及处理。
接收数据端点:接收该端点能接收的UDP数据报(TCP数据报),然后传给相应的进程或线程(根据不同的操作系统而定)。
我们现在用netstat –an 命令观察端点的状态时(如图4所示)在(state)列虽未标明为LISTENING,但该端点的实际功能是监听53号端口上的各个客户请求及处理。
 
 
 
 
类型
本地地址
远端地址
1
localIP.lport
ForeignIP.fport
2
localIP.lport
*.*
3
*.lport
*.*
一般启动运行一个UDP服务,只会创建一个与服务进程相对应的监听端点。但也可以创建多个服务进程和监听端点(使用Socket API时,需指定SO_REUSEADDR Socket选项)。应用程序创建监听端点时,可限制本地IP地址,远端IP地址,远端端口号。UDP服务器可创建三类地址绑定。
 
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

类型

本地地址

远端地址

1

localIP.lport

ForeignIP.fport

2

localIP.lport

*.*

3

*.lport

*.*

 

 

 

           
 
 
                                     3
1类型:只限于一个客户进程。
2类型:限于到达一个本地接口的数据报。
3类型:接收发送到lport的所有数据报。
在一个端口号(53)上可根据三类地址绑定创建多个监点端点。由于存在多个监听端点。到达服务器的数据报会根据监点优先级进行匹配。匹配到合适的端点就会把数据送到相应端点。端点优先级顺序如图3,从上到下依次降低。以上是监听端点创建时一些原则与方法,下面将讨论接收数据端点创建时的原则与方法。
     来自客户的UDP数据报。IP首部包含源端和目的端IP地址,UDP首部包含源端和目的端口的UDP端口号。UDP数据报通过匹配的监听端点被应用程序接收时,操作系统就必须告诉它UDP数据报中的源IP地址和源端口号。这是UDP器对多个客户进行处理,给每个客户发回相应的回答的基础。接收UDP数据报的监听端点的相应服务进程(一般情况下,一个UDP服务器只会创建3类型地址的监听端点)会调用一个新的进程或线程(根据不同的操作系统而定)来处理这个客户请求。在传输层(UDP模块)会根据从操作系统得到的UDP数据报的源湍口号和源IP地址。创建1类型地址的接收数据端点(如图4所示)。

 

Proto  Local Address          Foreign Address        State
    UDP    0.0.0.0:53            *:*
    UDP    192.168.0.1:53        192.168.0.2:1201
    UDP    192.168.0.1:53        192.168.0.2:1202
    UDP    192.168.0.1:53        192.168.0.2:1203
                      4
由于操作系具有并发性不具有并行性,不可能同时的处理每个进程,每个端点又是由进程或线程进行处理。这样可导致监听端点上不同客户的差不多同时到达的请求将由UDP自动排队。是队列就有大小限制。这样会导致UDP接收队列溢出,对超出数据报进行丢弃处理。不会发送任何信息给客户端。在接收数据端点上也存在相同的问题。这一点可表现出UDP协议的不可靠性。

 

 
                        5      UDP端口概图