gpt4 book ai didi

c - 为什么网络服务器在发送响应之前应该清除套接字接收缓冲区?

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:11 24 4
gpt4 key购买 nike

我正在研究一个微型网络服务器,它可以从浏览器接收 GET 请求并返回一个 html 文件。 serve_file 函数向浏览器发送响应消息,get_line 函数从套接字缓冲区获取一行。我不知道为什么必须读取并丢弃请求 header 。我尝试评论这两行,浏览器显示连接重置页面。估计是server socket receive buffer满了,具体原因不知道。谁能解释一下?
source code

/* Send a regular file to the client.  Use headers, and report */

void serve_file(int client, const char *filename) {
FILE *resource = NULL;
int numchars = 1;
char buf[1024];

buf[0] = 'A'; buf[1] = '\0';

//why?
while ((numchars > 0) && strcmp("\n", buf)) /* read & discard request headers */
numchars = get_line(client, buf, sizeof(buf));

resource = fopen(filename, "r");
if (resource == NULL)
not_found(client);
else {
headers(client, filename); //send headers to tcp buffer
cat(client, resource); //send index.html to tcp buffer
}
fclose(resource);
}

最佳答案

您观察到的行为是标准套接字行为。

如果应用程序未读取从对等点接收到的数据,并且应用程序在套接字上调用close,则操作系统不会执行通常的 TCP 连接终止。它立即重置连接而不是完成。如果应用程序真的想在接收缓冲区中有未读数据时优雅地关闭连接,那么它必须在调用 close 之前调用 shutdown(socket, SHUT_WR)

为什么套接字 API 是这样实现的?因为这样处理可以避免dos攻击。如果 close 执行正常的 TCP session 终止,则以下攻击是可能的:

  • 恶意客户端打开 TCP 连接
  • 服务器接受连接并开始接收数据
  • 客户端发送连续的随机数据流
  • 服务器迅速检测到接收到的数据有误,并在套接字上调用close
  • close 只是发送一个 FIN 然后等待对等点关闭。服务器资源保持分配状态,因为正常的 FIN 只是关闭朝向客户端的方向。客户端仍然可以发送数据并且 recv 缓冲区不会被释放。

但是当关闭启动连接重置时,与此 TCP 连接相关的资源将立即释放。 dos 攻击则稍微复杂一些。

参见 https://www.spinics.net/lists/linux-c-programming/msg01345.html了解更多详情。

关于c - 为什么网络服务器在发送响应之前应该清除套接字接收缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53005266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com