繁体   English   中英

如果您不调用recv,则TCP / IP堆栈中的缓冲区在哪里?

[英]Where does the Buffer from TCP/IP stack if you don't call recv?

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

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

如果服务器没有发生什么recv程序来“刷新”缓冲区?

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

是否还可以“ DDos”?

如果服务器没有用于“刷新”缓冲区的recv例程,会发生什么情况?

与此套接字对应的接收缓冲区将填满。 发生这种情况时,UDP将静默丢弃传入的数据报。 TCP将丢弃传入的数据报,而不对其进行确认,从而触发拥塞控制(在Reno / XP下将窗口大小减半,或者在CompoundTCP / Vista +下切换到延迟窗口)。
当您从缓冲区中删除一些数据时,UDP将恢复接收数据报,就像什么都没发生一样(找出丢失的数据是您的问题!),而TCP将继续接受和确认数据包,并逐渐增加窗口大小(数据在模拟流中将保持一致,就好像什么都没掉一样)。

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

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

是否还可以“ DDos”?

是。 DDoS是一种使网络电缆物理饱和的攻击。 在软件方面做什么并不重要(或根本不重要)。 DDoS需要在更高的网络层上寻址(您通常无法访问的一个!)。 一旦恶意流量通过“胖管道”到达服务器的子网(或上游连接它的路由器),您将无能为力。
网络具有不同的物理(光学或电气)和逻辑(例如令牌)形式,但是在任何一种情况下,电缆上的任何时间都只能有一个发送者。 如果有人通过DDoS使您的线路容量达到饱和,则您和路由器都将无法将数据包放在线路上,除非偶尔是偶然的。 但是,路由器的构建具有短的转发队列,并在队列填满时迅速丢弃数据包,因此实际上您很不走运。

我对TCP不太了解,因此外行的解释可能并不完全正确。 要了解更多信息的相关搜索词是“流量控制”,“窗口”,“吞吐量”和“饱和度”。

看看tcp / udp服务器发布的速度快于客户端消耗的速度吗? ,答案为“不会”:连接仅允许一定数量的数据“处于传输中”,并在检测到达到最大值后停止发送。

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

由于数据包最终会出现在NIC中,因此这仍然会占用带宽,因此是的,这仍然是DDOS漏洞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM