探析UDP服务器的实现

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

本文出自 “一部分” 博客,谢绝转载!

你可能感兴趣的:(网络,服务器,职场,UDP,休闲)