假设我有一个监听端口 X 的服务器。
多个客户端连接到服务器并通过send
命令发送数据。
如果服务器没有有recv
例程来“刷新”缓冲区,会发生什么情况?
缓冲区是驻留在您自己的进程中还是在 Windows 中?
是否还可以“DDos”呢?
最佳答案
What happens if the server does NOT have a recv routine to "flush" the buffer?
对应于该套接字的接收缓冲区将被填满。当发生这种情况时,UDP 将默默地丢弃传入的数据报。 TCP 将丢弃传入的数据报并且不确认它们,从而触发拥塞控制(在 Reno/XP 下将窗口大小减半或在 CompoundTCP/Vista+ 下切换到延迟窗口)。
当您从缓冲区中删除一些数据时,UDP 将恢复接受数据报,就好像什么都没发生一样(弄清楚丢失数据是您的问题!),TCP 将继续接受和确认数据包,再次逐渐增加窗口大小(数据在模拟流中将是一致的,就好像没有任何东西被丢弃一样,永远)。
Does the buffer reside in your own process or in Windows?
两者都可以,对两者都没有紧迫的要求,只要它由库层管理/拥有,它也可以驻留在用户空间中(尽管它实际上是在内核空间中)。这是一个并不重要的细节,因为您无法以任何方式直接访问原始缓冲区。您只能通过网络库提供的 API(Winsock 函数或类似 Berkeley 的套接字函数)访问它。
Is it also possible to "DDos" still?
是的。 DDoS 是一种使网络电缆物理饱和的攻击。你在软件方面做什么并不重要(或者根本不重要)。 DDoS 需要在更高的网络层(您通常无权访问的网络层!)解决。一旦流氓流量通过“粗管道”进入您服务器的子网(或连接到上游的路由器),您就无能为力了。
网络具有不同的物理(光学或电气)和逻辑(例如 token )风格,但在任何一种情况下,电缆上任何时候都只能有一个发送者。如果有人用 DDoS 使您的线路容量饱和,您和路由器都无法将数据包放到线路上,除非偶然发生。然而,路由器被构建为具有较短的转发队列并在队列填满时迅速丢弃数据包,所以实际上你运气不好。
关于windows - 如果不调用 recv,来自 TCP/IP 的缓冲区在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23912818/