Tiberiu Iancu
Tiberiu Iancu

Reputation: 11

Raw socket for transport layer protocol

What I want to do is make my own transport layer protocol in C++. I can't figure out how to create a raw socket that that automatically resolves IP headers, and leaves it up to me to set the payload.

I managed to receive packets on the server using

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))

but didn't manage to create a client that can send data to the server. (I'm not even sure if the above socket is L2 or L3)

From what I understand from reading about raw sockets, a L3 socket would look like

socket(AF_INET, SOCK_RAW, protocol)

Thing is, I don't know what to fill in for the protocol, if my intention is to create my own and not to use existing ones. (I have tried many of the iana numbers, including the range 143-252)

So the question is: how to create a socket, server and client sided, on top of the Internet Protocol such that two computers can communicate in an arbitrary protocol (or send data to each other)? In other words, I want to specify the end IP address and a payload and have the socket take care of the IP header.

What I have now:

server.cpp: https://pastebin.com/yLMFLDmJ

client.cpp: https://pastebin.com/LWuNdqPT

Upvotes: 0

Views: 1295

Answers (1)

Tiberiu Iancu
Tiberiu Iancu

Reputation: 11

For those who are searching, here is the solution I found: http://www.pdbuchan.com/rawsock/rawsock.html

In the file tcp4.c on the above mentioned page, there is a client implementation using a raw socket. The code adds both IP and TCP headers, but you can simply remove the lines where the TCP headers are added and replace them with your own protocol. You also need to change this line: iphdr.ip_p = IPPROTO_TCP to iphdr.ip_p = 200 (200 or any number in the range 143-252; see https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) and set the name of the interface you are using, as well as change the addresses.

So here is a stripped down version with the mentioned changes that sends an IP packet only containing IP headers: https://pastebin.com/z2sGmtQd

And here is a very simple server that can receive these packets: https://pastebin.com/jJgZUv5p

Upvotes: 1

Related Questions