IOCP构架之所以公认高效,核心就在于异步IO。在网上纷纷为之膜拜之余,很少看到对稳定性或性能优化的观点。仔细想想,任何技术都有有利的一面,自然也有有弊的一面,这才符合辩证法思想。
我把自己在编写IOCP构架时重点处理的几个地方交代一下,如果你想认真写好一个稳定的IOCP服务端,建议重新规划以下几个细节。
1)不要修改套接字默认的收发缓冲区大小,即8192字节=8K=2分页。
2)总所周知,x86页面置换最少需要1分页,所以不管IOCP的重叠IO涉及多少字节,OS至少需要加锁/解锁1分页,在使用异步WSARecv/WSASend时,只要重叠缓冲区WSABuf的长度大于0,那么在投递异步操作时,系统至少会锁定1分页的非页面内存,而系统的非页面缓冲池是有大小限制的,如果你的IOCP消耗了太多非分页内存。轻则同服务器其他网络进程无法使用网络,重则可能会导致系统蓝屏或其他崩溃。而对于你的IOCP服务端通讯,常见的现象是客户端无法与服务端进行连接,或者收发包时出现
10055。
3)正是由于情况2的出现可能性,所以在投递WSARecv/WSASend时,绝对不要贪图简单,直接进行投递,正确的做法应该为每个套接字建立至少2个缓冲队列,一收一发。
4)对于同一个客户端套接字,在同一时间最好只有一个WSARecv/WSASend,如果你想提高IOCP网络吞吐量,可能会在同一个套接字上同时投递多个WSARecv/WSASend,那么你将会面临下面几个情况必须处理:
a)IO线程之间的WSARecv/WSASend操作频繁加锁/解锁,因为你无法保证线程1在GQCS时,线程2不会对相同套接字GQCS。
b)收发出现乱序,仔细想一下,正是因为你对同一套接字同时投递多个WSARecv/WSASend导致的,有你忙的了。
c)短时间内大量WSARecv/WSASend异步操作消耗太多非分页内存,也许在你下次投递收发操作时,OS会毫不留情给你一个10055错误。
5)现在你应该明白服务端的稳定是一个前提,需要比高吞吐量更要优先考虑,那么对于情况4建议的缓冲队列,绝对应该是你首先需要考虑的。
6)合理限制客户端套接字的流量(包速),即你需要规划完整合理的Qos,否则一旦恶意连接试图以大流量正常业务包攻击你的IOCP时,你会发现你的IOCP构架是多么脆弱。
7)为了减少情况6的出现,建议你在客户端/服务端通讯时增加压缩(加密)/解压缩(解密)功能,最好加入时间戳或GUID校验,避免出现同样的业务收发相同的包,最终导致攻击者只需要截取一个正常业务包,就能干出情况6的事情。
也许你会觉得如此实现太影响IOCP吞吐量,确实如此,收/发缓冲队列、Qos、加密解密都会降低IO吞吐量。希望你在决定之前,先衡量一下你未来的IOCP服务端菊花是否够紧,否则有一天你会高呼:OMG,是谁又把我那可怜而又脆弱的IOCP爆菊了?
分享到:
相关推荐
在这个"VC的IOCP开发,iocp类,demo"中,我们将深入探讨IOCP的基本原理、如何在VC++环境中实现一个基于IOCP的服务器,并通过提供的"IOCPDemo"来理解其实现细节。 一、IOCP基础知识 IOCP是Windows系统内核提供的一个...
“WarServer”很可能是这个压缩包中的主程序或核心组件,它包含了IOCP服务器的实现细节。通过分析和学习这个项目的源代码,开发者可以了解如何在实际工程中设计和构建一个高效的IOCP服务器,包括连接管理、内存池...
IOCP(I/O Completion Port,I/O 完成端口)是 Windows 操作系统提供的一种高效、可扩展的异步I/O模型,尤其适用于高并发的网络服务器开发。本文将详细探讨IOCP的工作原理、使用场景以及如何在服务器端实现。 ### ...
库的封装使得这些操作无需关心底层的IOCP实现细节,从而提高开发效率。 总结来说,"windows iocp网络通讯库封装"是一个利用Windows IOCP技术构建的C++网络通信库,它通过`ITcpClient`和`ITcpServer`接口为开发者...
而异步I/O模型虽然解决了阻塞问题,但回调函数的执行线程不可控,可能影响性能。IOCP则结合了两者的优点,它将I/O操作与处理结果的线程分离,使得处理线程可以复用,提高了系统效率。 NT6线程池是Windows Vista(即...
同时,对于网络库的封装,应考虑易用性、可扩展性和错误处理机制,确保开发者能方便地集成到自己的项目中。 总之,IOCP是Windows平台下实现高并发、高性能网络服务的关键技术之一。理解和熟练掌握IOCP的原理及使用...
**IO Completion Ports (IOCP) 是Windows操作系统中用于高并发网络编程的一种机制。它通过将I/O操作异步化,显著提高了系统处理大量并发连接的能力。以下是对IOCP的详细解释:** IOCP,全称Input/Output Completion...
IOCP(Input/Output Completion Port,输入/输出完成端口)是Windows操作系统提供的一种高度优化的I/O模型,尤其适用于高并发的网络编程场景。它允许应用程序通过一个或多个线程处理大量的I/O请求,提高了系统资源的...
- **可扩展性**:随着并发请求的增加,只需要添加更多的线程到线程池即可。 在实际应用中,IOCP常用于构建高性能的网络服务器,如游戏服务器、流媒体服务器等,需要处理大量并发连接的场景。 在"IOCP.txt"这个文件...
同时,"一些复杂的处理都以接口的形式给出"表明复杂的功能被抽象为接口,这样可以增强代码的可扩展性和模块化,使得不同的功能可以通过实现这些接口来添加或替换,而不影响核心的IOCP处理逻辑。 基于标签"IOCP 高...
4. **可扩展性**: 随着并发请求的增加,可以通过增加线程池中的线程数量来扩展处理能力。 **三、IOCP的应用场景** 1. **网络服务器**: 如HTTP服务器、FTP服务器等,它们需要处理大量的并发连接和数据传输。 2. **...
总结,IOCP.NET是一个强大的网络库,它利用IOCP机制实现了高效、可扩展的网络服务。对于需要构建高性能网络应用程序的.NET开发者来说,IOCP.NET无疑是一个值得考虑的优秀选择。通过理解和掌握IOCP.NET,开发者可以...
3. IOCP:是实现高并发服务器的最佳选择,能够提供高吞吐量和良好的可扩展性。 三、IOCP的关键概念 1. 服务吞吐量:IOCP的异步特性使得服务器能够在等待I/O操作完成时处理其他请求,从而提高了吞吐量。例如,当...
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据的顺序和可靠性,但具有较低的延迟和较高的传输速度。UDP常用于实时数据传输,如在线游戏、视频会议和流媒体服务等。 接下来...
《深入解析IOCP服务器模块——基于易语言的实现》 IOCP(I/O完成端口,Input/Output Completion Port)是Windows操作系统提供的一种高效的异步I/O模型,它被广泛应用于高并发、高性能的网络服务器中。IOCP服务器...
{**************************************************** IOCP Socket Server 主要参考自CodeProject下载源码, 特别感谢张无忌的帮助 这个版本还很粗糙,很多地方没有处理好,最近 比较忙,没有精力和时间来完善它...
标签 "iocp 8.10" 提示我们这是一个关于IOCP的深入话题,可能涉及到更复杂的技术细节或者优化策略。由于没有具体的章节内容,我们将基于通常在IOCP学习中遇到的主题来展开讨论。 在IOCP中,关键概念包括: 1. **...
这些代码可以作为理解IOCP工作原理和实现细节的重要参考。 在`Source`目录中,可能包含的是IOCP相关的源代码库,包括但不限于以下几个关键部分: 1. **创建和初始化IOCP**:使用`CreateIoCompletionPort`函数创建...
但理解和实现IOCP编程并不简单,需要深入理解Windows内核I/O机制以及线程池的运作原理。开发者必须谨慎地设计线程池大小、工作队列策略等,以确保系统在各种负载情况下都能保持稳定和高效。 总之,IOCP是Windows...