探析UDP服务器的实现
2007-12-16 15:03
169 查看
[align=left]请各位高手多多指教喔!这只是我在看了一次《TCP/IP详解 卷 卷一》后写的,这其中可能有理解上的偏差。向Stevens先生致敬![/align]
探析UDP服务器的实现
UDP和TCP都有65535(216-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 –an 命令观察端点的状态时(如图4所示)在(state)列虽未标明为LISTENING,但该端点的实际功能是监听53号端口上的各个客户请求及处理。
一般启动运行一个UDP服务,只会创建一个与服务进程相对应的监听端点。但也可以创建多个服务进程和监听端点(使用Socket API时,需指定SO_REUSEADDR Socket选项)。应用程序创建监听端点时,可限制本地IP地址,远端IP地址,远端端口号。UDP服务器可创建三类地址绑定。
图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服务器的实现
UDP和TCP都有65535(216-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 –an 命令观察端点的状态时(如图4所示)在(state)列虽未标明为LISTENING,但该端点的实际功能是监听53号端口上的各个客户请求及处理。
类型 | 本地地址 | 远端地址 |
1 | localIP.lport | ForeignIP.fport |
2 | localIP.lport | *.* |
3 | *.lport | *.* |
类型 | 本地地址 | 远端地址 |
1 | localIP.lport | ForeignIP.fport |
2 | localIP.lport | *.* |
3 | *.lport | *.* |
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端口概图
本文出自 “一部分” 博客,谢绝转载!
相关文章推荐
- UNIX网络编程--实现并发UDP服务器
- UDP实现服务器与客户端双向通信
- 【网络】实现简单的TCP、UDP服务器、TCP多进程/多线程服务器
- C#网络编程系列文章(八)之UdpClient实现同步UDP服务器
- Nodejs实现的一个简单udp广播服务器、客户端
- Python实现udp协议的简单服务器和客户端通信
- C#网络编程系列文章(八)之UdpClient实现同步UDP服务器
- Java实现单个客户端与服务器UDP通信
- TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库
- C#网络编程系列文章(六)之Socket实现同步UDP服务器
- UDP简单实现并发服务器和客户端简单通信
- 第九章 TCP和UDP同时用复用一个端口实现一个回射服务器
- python socket实现简单的(TCP/UDP)服务器/客户端
- [李景山php] swoole之 UDP服务器实现
- 使用UDP实现一个时钟服务器
- python3实现UDP协议的服务器和客户端
- Udp 服务器 C#实现代码
- C#网络编程系列文章(七)之UdpClient实现异步UDP服务器
- golang实现udp接入服务器
- 【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯