Hey, I made this! I also made this other thing on HN today (<a href="https://news.ycombinator.com/item?id=37062422">https://news.ycombinator.com/item?id=37062422</a>), really cool to see ArpChat as well (guess someone went through my profile). It was a super fun project and I learned a lot about networking.<p>I actually got a chance to use it in a totally-offline setting a bit ago, which was fun! ... however, I then found a major bug that was causing tons of latency, and I fixed it but I haven't gotten around to building new artifacts yet, so you might want to build from scratch if you're planning on testing it out in a real setting for some reason. I also added fun username colors and message times. I promise I'll upload a new release soon!<p>If you're interested, I wrote an article about a year ago about how ArpChat works: <a href="https://kognise.dev/writing/arp" rel="nofollow noreferrer">https://kognise.dev/writing/arp</a>
Oh heck yeah now this is what I'm talking about! Data link layer shenanigans!!<p>For that of you who have no idea what the Address Resolution Protocol (ARP) is, to a first approximation it is the missing link between your MAC address (what Ethernet runs on) and your IP address (what Internet runs on). After your IP routing table, which you can see with `route`, decides what immediate next IP address to forward a packet to, then your ARP cache, which you can see with `arp`, will decide which MAC address that IP correspond to (usually your router's local IP address).<p>Knowing that ARP even exists is considered mild esoterica today, to say nothing of its IPv6 sibling the Network Discovery Protocol. But even though you don't use it much in modern cloud-based deployments, knowing it exists makes your bird's eye view of how the whole network stack works that much more holistic.
It's fun that it abuses ARP's ability to include an arbitrary payload, but just to remind everyone of networking 101, thing that the author is relying on is just the simple fact that switches flood packets addressed to ff:ff:ff:ff:ff to the entire broadcast domain. You can achieve similar message flooding without having to have superuser/raw packet permissions by directing packets to the L3 broadcast address whereupon they will (usually) be L2 flooded (Aka it's fun to ping the broadcast address.)<p>Using ARP doesn't offer any particular advantage, and I would note since many modern switches do thinks like snooping arp packets, putting a high amount of bogus ARP traffic on the network could actually have some negative impact. It's still fun at any rate and reminds me of the type of crap that I used to make when I was learning. As alluded to before, I personally would have chosen to abuse ICMP for this purpose; maybe it's a future avenue for development. Kudos to the fun project!
I love (ab)using protocols that are built-in to most OS'. I wrote a dumb fake samba share that let people see messages in Finder.app/Explorer.exe/Gnome/KDE since I couldn't find a cross-platform gui or cli messaging system that didn't require installing special client software. (even netcat invocations were not working when trying on our local network, and had OS-specific flag differences if we wanted to do broadcast).<p>You see the samba share message in your file browser, click it and can edit the filenames to update a 3-line "bulletin board".<p><a href="https://github.com/jedahan/samba-haiku/blob/master/index.js">https://github.com/jedahan/samba-haiku/blob/master/index.js</a><p>Even this was a re-implementation that used WIFI ssids to make a captive portal haiku.<p><a href="https://github.com/jedahan/haiku-wifi">https://github.com/jedahan/haiku-wifi</a>
This may be even more fun than you expect. We were doing VLANs using hardware from a major vendor to partition a network and discovered that while the VLANs worked most of the time, they were leaky with ARP traffic. It was causing us headaches because the machines were supposed to be sending all of their traffic through the router, but sometimes they were seeing ARP replies that they shouldn't and were thinking that the other machines would be reachable directly, causing them to be unable to send traffic until the ARP cache entry timed out. We couldn't get the vendor to show any interest in fixing the bug either, because they were too big to care.<p>It's possible this chat app could break through VLANs in certain circumstances.
My wife, kids and I all work or study mostly from home, so often all on our computers in our separate crates^H^H^H^H^H^Hrooms. We use Beebeep to be able to message back an forth when needed. It doesn't need a server and has both Linux (me) and Windows (everyone else) clients which was the deal clincher.<p>It works pretty well, although sometimes you have to restart after your laptop wakes up before it sees others on the LAN. That and not being able to open a message window to someone direct from the tray icon are really my only grips. Can cut and paste pictures (of funny cats) and even send files and other capabilities I've never used. (This is not a paid advertisement, I've just started rambling.)<p><a href="https://www.beebeep.net/" rel="nofollow noreferrer">https://www.beebeep.net/</a>
super neat.<p>> I also described ARP as a layer 3 protocol. There’s some contention on this — while I think this is the most accurate and easiest explanation, networking is more nuanced than the OSI model might convey. Some would describe ARP as a level 2 or even level 2.5 protocol. For our purposes, I believe calling it level 3 makes the most sense.<p>TCP/IP doesn't follow the OSI model, so the nuance of OSI isn't directly applicable. ARP is practically defined (ref Stevens) as being in layer 2.5 (of the TCP/IP model), so i believe calling it 2.5 would make the most sense.<p>and i mean, ARP frames aren't routable. so they clearly aren't L3.
Back when IPv4 NAT was sort of standard (still is but so is IPv6 as well as GCNAT now), I created a thing I called NATChat. It would basically just create a chat room for you based on your public IPv4 address, allowing you to chat with anyone on your network. Was kinda neat to use in office with others (back when that was also a thing).
Other similar in c++: <a href="https://github.com/gbonacini/arpchatcpp">https://github.com/gbonacini/arpchatcpp</a>
That's fun!<p>That reminds me of a chat software that I did in Delphi 3 back in 1999/2000 (being not that much older than OP) for our LAN parties, that was basically broadcasting on 255.255.255.255 [0]<p>It was inspired by Kali (remember Kali? [1]) and IRC.<p>I think it worked until we moved from hubs to switches ;)<p>Keep on coding! :)<p>[0] <a href="https://i.imgur.com/IPGPaae.png" rel="nofollow noreferrer">https://i.imgur.com/IPGPaae.png</a><p>[1] <a href="http://www.tweak3d.net/articles/kali/images/bigchat.jpg" rel="nofollow noreferrer">http://www.tweak3d.net/articles/kali/images/bigchat.jpg</a>
I don't know much about networking...<p>I've been to ski resorts where there's no phone reception, and I love it that way. No one's on their phones. But it's easy to lose someone for an entire day (or until your agreed meeting time).<p>Is it possible to use something like this to setup a wireless network which would facilitate chat without a connection to the outside world?<p>Ok now that I typed it it sounds crazy but I always thought this should be possible
It is also possible to configure device IP addresses directly with ARP <a href="https://jetdirect.printerdepo.com/en/hp-jetdirect-print-servers/tcpip-configuration/ipv4-configuration/use-the-arp-and-ping-commands-ipv4/" rel="nofollow noreferrer">https://jetdirect.printerdepo.com/en/hp-jetdirect-print-serv...</a>
I did something similar to this before in my old job, because installing of chat applications is unauthorized, the solution I come up with is I created a batch script with easily to identify computer network map so regular users will have problem using it, it utilizes net send command.
Déjà vu I wrote an implementation that _exactly_ did this PoC a decade ago.<p>Modern network protocols have so much extra reserved bits that you can add pretty much anything want in it; keep going ;)