TCP套接字中的人工延迟,用于竞争条件攻击
我试图在用C实现的TCP套接字服务器中引入一个人工延迟 其想法是,客户机需要一段时间才能连接到服务器 为了实现这一点,我尝试不简单地使用阻塞接受来接收连接,轮询等待的连接,然后在接受之前睡觉 然而,数据似乎无论如何都被写入了其他缓冲区,唯一的效果是我的程序需要睡眠延迟才能从缓冲区读取数据。同时,客户端已经愉快地连接并发送了数据 我这样做对吗?可能相关信息:客户端和服务器都通过同一虚拟机VMWare Player上的环回接口进行连接 我的客户代码:TCP套接字中的人工延迟,用于竞争条件攻击,c,sockets,C,Sockets,我试图在用C实现的TCP套接字服务器中引入一个人工延迟 其想法是,客户机需要一段时间才能连接到服务器 为了实现这一点,我尝试不简单地使用阻塞接受来接收连接,轮询等待的连接,然后在接受之前睡觉 然而,数据似乎无论如何都被写入了其他缓冲区,唯一的效果是我的程序需要睡眠延迟才能从缓冲区读取数据。同时,客户端已经愉快地连接并发送了数据 我这样做对吗?可能相关信息:客户端和服务器都通过同一虚拟机VMWare Player上的环回接口进行连接 我的客户代码: printf("Connecting to %s
printf("Connecting to %s:18211 .. ", host); fflush(stdout);
fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&sin, 0, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(host);
sin.sin_port = htons(18211);
if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -1) {
printf("Unable to connect to host %s\n", host);
exit(EXIT_FAILURE);
}
#define HITHERE ".oO Oo.\n"
if(write(fd, HITHERE, strlen(HITHERE)) == -1) {
printf("Unable to write banner to host %s\n", host);
exit(EXIT_FAILURE);
}
#undef HITHERE
printf("Connected!\nSending file .. "); fflush(stdout);
ffd = open(file, O_RDONLY);
if(ffd == -1) {
printf("Damn. Unable to open file\n");
exit(EXIT_FAILURE);
}
服务器代码:
我尝试在此处执行套接字轮询,然后在接受之前休眠,但在接收数据时,客户端没有延迟。TCP握手SYN,SYN/ACK,ACK发生在操作系统级别,在收到通知之前,客户端可以立即自由发送数据。accept只是一个服务器端的东西,为特定连接提供fd
如果您想延迟建立连接,您可能应该在防火墙中这样做。TCP握手SYN,SYN/ACK,ACK发生在您收到通知之前,在操作系统级别,客户端可以立即自由发送数据。accept只是一个服务器端的东西,为特定连接提供fd
如果您想延迟建立连接,您可能应该在防火墙中这样做。我支持防火墙的想法,例如,iptables中的一些ack延迟。另一种尝试可能是将listenbacklog设置为0或非常小的值。然而,IIRC虽然我不确定Linux没有设置它的数字给听,所以你必须实验看看它有多大。在调用accept之前,请先查看有多少客户端连接,然后再添加一个待利用的客户端。我支持防火墙的想法,例如,iptables中的一些ack延迟。另一种尝试可能是将listenbacklog设置为0或非常小的值。然而,IIRC虽然我不确定Linux没有设置它的数字给听,所以你必须实验看看它有多大。在调用accept之前,请先查看连接了多少个客户端,然后再添加一个待利用的客户端。我看不到任何服务器代码。复制粘贴错误?@thuovila我将其保存在一个从Live CD启动的暂停虚拟机中,它无法恢复,所以我丢失了它!我看不到任何服务器代码。复制粘贴错误?@thuovila我将其保存在一个从Live CD启动的暂停虚拟机中,它无法恢复,所以我丢失了它!