如果你不调用recv,那么来自TCP / IP堆栈的缓冲区在哪里?

时间:2014-05-28 13:21:34

标签: windows winapi tcp

假设我有一台服务器在端口X上侦听。

多个客户端连接到服务器并通过send命令发送数据。

如果服务器 NOT recv例程来“刷新”缓冲区,会发生什么?

缓冲区是在您自己的进程中还是在Windows中?

“DDos”还可以吗?

2 个答案:

答案 0 :(得分:3)

  

如果服务器没有一个recv例程来" flush"会发生什么?缓冲区?

与此套接字对应的接收缓冲区将填满。当发生这种情况时,UDP将默默地丢弃传入的数据报。 TCP将丢弃传入的数据报而不确认它们,触发拥塞控制(在Reno / XP下将窗口大小减半或切换到CompoundTCP / Vista +下的延迟窗口)。
当您从缓冲区中删除一些数据时,UDP将恢复接受数据报,就像没有发生任何事情一样(确定丢失数据是您的问题!),TCP将继续接受并确认数据包,逐渐增加窗口再次调整大小(模拟流中的数据将保持一致,就像没有任何东西被丢弃一样)。

  

缓冲区是在您自己的进程中还是在Windows中?

它们可能都是,两者都没有紧急要求,只要它由库层管理/拥有,它也可以驻留在用户空间中(尽管它实际上在内核空间中)。这是一个不重要的细节,因为无论如何都无法直接访问原始缓冲区。您只能通过网络库提供的API(Winsock函数或类似Berkeley的套接字函数)访问它。

  

是否也可以使用" DDos"仍然?

是。 DDoS是一种物理上使网络电缆饱和的攻击。它在软件方面做了很多(或根本没有)。需要在更高的网络层(一个您通常无法访问的网络层)处理DDoS!)。一旦流氓交通使它通过"胖管道#34;在您的服务器的子网上(或连接到它上游的路由器上),您无能为力 网络具有不同的物理(光学或电子)和逻辑(例如令牌)风格,但在任何一种情况下,电缆上任何时候都只能有一个发送者。如果某人使用DDoS使您的线路容量饱和,您和路由器都无法将数据包放在线路上,偶然偶然。然而,路由器被构建为具有短的前向队列并且在队列填满时快速丢弃分组,所以实际上你运气不好。

答案 1 :(得分:1)

我对TCP没有透彻的了解,所以这个外行的解释可能并不完全正确。要了解更多内容的相关搜索字词包括"流量控制","窗口","吞吐量"和"饱和"。

请参阅what happens when tcp/udp server is publishing faster than client is consuming?,其中的答案是"它赢了":一个连接只允许一定数量的数据在飞行中"并在检测到达到最大值后停止发送。

当所有接收缓冲区(NIC,内核)已满并且接收应用程序未处理,并且发送方不断发送数据(恶意地不遵守TCP协议)时,接收NIC将丢弃传入的数据包。

当数据包最终进入网卡时,这仍会花费带宽,所以是的,这仍然是DDOS漏洞。