UDP迭代服务器示例和UDP流量控制的缺失
2017-07-15 11:53
127 查看
我们知道, 有tcp服务器, 也有udp服务器, 这是按照协议来区分的。 如果按照服务方式来分, 还可以分为迭代服务器和并发服务器。
所谓迭代服务器, 就是单个进程/线程在单个端口上顺序处理所有客户端的请求, 而并发服务器就不一样了, 可以通过fork进程来并发处理多个客户端的请求。
在本文中, 我们主要来说说UDP迭代服务器和UDP流量控制的缺失。
我们来看一个最简单的UDP服务器(迭代服务器):
假设有1000个客户端几乎同时发请求过来(高并发访问), 那么就会有这样一种可能: 1000个客户端请求到达后, udp服务器可能还没有处理完第一个请求, 那剩余的请求怎么办呢? 肯定不能直接丢弃啊。
是的, 操作系统协议栈会为这个udp socket所在的端口分配一个队列, 并发而来的客户端请求会被放到队列中, 并遵循FIFO的原则进行处理。
我们看到, 这种服务的方式是单个udp socket在8765端口上顺序处理客户端请求的, 这就是迭代服务器。
在极端情况下, 假设有1亿个客户端进行并发连接, 那么, 这个队列肯定是满了, 多余的请求会被直接丢弃, 而udp服务器没有能力对客户端说: 尼玛的, 你们请求太多了, 我处理不过来, 我压力好大, 你们行行好, 控制下请求的量吧。
udp服务器没这个能力, 这就是udp的流量控制缺失, 用人话来说, 就是udp没有流量控制机制。
先说这么多。
所谓迭代服务器, 就是单个进程/线程在单个端口上顺序处理所有客户端的请求, 而并发服务器就不一样了, 可以通过fork进程来并发处理多个客户端的请求。
在本文中, 我们主要来说说UDP迭代服务器和UDP流量控制的缺失。
我们来看一个最简单的UDP服务器(迭代服务器):
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { struct sockaddr_in srvAddr; bzero(&srvAddr,sizeof(srvAddr)); srvAddr.sin_family = AF_INET; srvAddr.sin_addr.s_addr = htonl(INADDR_ANY); srvAddr.sin_port = htons(8765); int srvAddrLen = sizeof(srvAddr); int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp bind(iSock, (struct sockaddr *)&srvAddr, sizeof(srvAddr)); while(1) { char szBuf[65536] = {0}; recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&srvAddr, (socklen_t*)&srvAddrLen); printf("msg from client [%s]\n", szBuf); } close(iSock); return 0; }如果一个客户端发数据过来, 显然, 在while(1)中, printf会打印对应的信息。 如果第二个客户端过来, 显然, 程序第二次进入while, 第二次打印对应的信息。假设, 有n个客户端连接过来, 那么就循环n次打印信息。 一切看似完美。
假设有1000个客户端几乎同时发请求过来(高并发访问), 那么就会有这样一种可能: 1000个客户端请求到达后, udp服务器可能还没有处理完第一个请求, 那剩余的请求怎么办呢? 肯定不能直接丢弃啊。
是的, 操作系统协议栈会为这个udp socket所在的端口分配一个队列, 并发而来的客户端请求会被放到队列中, 并遵循FIFO的原则进行处理。
我们看到, 这种服务的方式是单个udp socket在8765端口上顺序处理客户端请求的, 这就是迭代服务器。
在极端情况下, 假设有1亿个客户端进行并发连接, 那么, 这个队列肯定是满了, 多余的请求会被直接丢弃, 而udp服务器没有能力对客户端说: 尼玛的, 你们请求太多了, 我处理不过来, 我压力好大, 你们行行好, 控制下请求的量吧。
udp服务器没这个能力, 这就是udp的流量控制缺失, 用人话来说, 就是udp没有流量控制机制。
先说这么多。
相关文章推荐
- TCP的流量控制 TCP与UDP的区别
- Linux网络编程11——tcp、udp迭代服务器
- 【java面试系列之网络编程】TCP和UDP的区别、TCP协议的三次握手和四次挥手、TCP协议的通信状态、网络编程时的同步、异步、阻塞、非阻塞、进程间的通信方式、TCP的流量控制和拥塞控制
- Python实现获取nginx服务器ip及流量统计信息功能示例
- 使用Linux下的TC进行服务器流量控制实例
- [Linux]使用 linux 下的 TC 进行服务器流量控制
- 使用linux下的TC进行服务器流量控制
- UDP 打洞示例 包含 服务器 客户端
- TCP/UDP 详解 (可靠传输、流量控制、连接管理等核心章节的详解)
- 【转载】linux下使用 TC 对服务器进行流量控制
- Linux网络编程14——tcp、udp迭代服务器
- UDP 打洞示例 包含 服务器 客户端
- UDP服务器/客户端代码示例
- linux下使用 TC 对服务器进行流量控制
- 使用 linux 下的 TC 进行服务器流量控制
- Linux网络编程——tcp、udp迭代服务器
- UDP流量控制之分析
- C#滑动窗口算法实现UDP流量控制3
- C#滑动窗口算法实现UDP流量控制