百科问答小站 logo
百科问答小站 font logo



网络上有若干客户端向一台机器的某个端口一直不停发送UDP包 这台机器打开端口和不打开端口的区别在哪? 第1页

  

user avatar   guo-zhong-ming-26 网友的相关建议: 
      

服务器如果不监听某个udp端口,那么,网卡还是会收到相关的数据包, 还是会产生中断,还是会从网卡拷贝数据到系统态,只是系统态读数据分析出无处转发,然后当做错误包丢弃了。

如果服务器监听了某个udp端口,那么这个数据包将会被转发到监听socket handle的接收缓冲区中,如果缓冲区未满push back 新数据包,然后epoll通知用户态代码需要读缓冲区,用户态代码获得cpu控制权,从读缓冲区read, 从系统态拷贝到用户态,整个开销要大上许多。

Udp网络编程主要的难点是不容易发挥多cpu的优势,一般是单线程收发,然后把收到的数据通过队列方式传递给多个线程处理,然后再从多个线程队列返回处理结果,单线程写入。

另外一个难点是需要考虑丢包,即使是本机一个线程发,一个线程收,也有丢包,因此需要定时重发和超时处理。

第三个难点是发端一般用头2个字节标识发包id,例如dns包,那么就需要一个id管理代码,最大支持65536个正在等待中的查询,如果上级dns server的处理缓慢,那么就有可能耗尽可用id,当年一起全国网络事故涉及到了暴风影音客户端每x秒查询一次dns,加上一次dos攻击处理过程中的连锁反应,导致全国多省dns id资源耗尽,难以提供服务查询,网络大面积访问困难。暴风影音和某dns pod均被有关部门约谈,dos攻击者被抓捕。当然现在dns server这块代码已有一些解决方案,至少不会再有上次一样的问题了。总之,这部分代码的处理要多考虑一些特例。




  

相关话题

  有哪些好的C#开源项目推荐? 
  路由器进行NAT地址转换时,如何避免可能出现的如下错误? 
  网上常能见到的一段 JS 随机数生成算法如下,为什么用 9301, 49297, 233280 这三个数字做基数? 
  计算机硕士不会编程怎么找工作? 
  为什么一个编程论坛会起名叫 Stack Overflow,多么不吉利的名字? 
  如果一门编程语言中不允许对象(或结构体)循环引用,那么用它实现什么功能会比较困难? 
  127.0.0.1与127.0.0.2这两个IP地址有什么区别?后者能用吗? 
  程序员很闷骚么? 
  为什么编程语言中没有一种 if,来判断大概率为真(或假)的情况,来提升 CPU 分支预测的速度呢? 
  强类型语言的优缺点是什么? 

前一个讨论
现在的很多楼盘名字太霸气,为什么管理部门不约束下,或者起名的机制改下,约束下开发商的起名权?
下一个讨论
如何看喻惠平《这就是非洲》摄影展中将表情相似的非洲人与非洲动物并列,被西方媒体批判为种族歧视?





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利