[英]recv() return -1 on peer disconnect for non blocking tcp ip socket
[英]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.