How Raw sockets behave differently in macOS and Linux
swagnik.netlify.app
swagnik.netlify.app
On macOS, 'man ip' gives all the necessary info about raw sockets and IP_HDRINCL:
> Outgoing packets automatically have an IP header prepended to them (based on the destination address and the protocol number the socket is created with), unless the IP_HDRINCL option has been set.
> Unlike previous BSD releases, the program must set all the fields of the IP header
> Note that the ip_off and ip_len fields are in host byte order.
And most of the time the docs are interchangable enough. Until they're not. At the raw socket layer, I'd still expect the macos docs to be consulted _eventually_.
Becasue BSD raw socket rules.
That's how you get Sniffer to be performing waaaaay more intuitively on macos than at all on Linux.
Do you know a good overview of what can be done with eBPF?
I believe they can both monitor and manipulate data as it flows through the OS primatives (sockets, file descriptors, etc.).
https://wiki.nftables.org/wiki-nftables/index.php/Matching_p...
https://developer.apple.com/library/archive/documentation/Ne...
[1]- https://stackoverflow.com/a/32599757/3728336
[2] - https://cseweb.ucsd.edu/~braghava/notes/freebsd-sockets.txt
You may also find this [2] table useful, it shows which platforms allow the combination of IPPROTO_ICMP + IP_HDRINCL so it may be used without elevated privileges.
In general, my experience of raw sockets is that they are not very “raw” at all, the OS can and does still perform a variety of modifications and additions to what you send and receive, in highly platform specific and often poorly documented ways. In particular, TCP and raw sockets should generally be avoided.
[1] https://github.com/fujiapple852/trippy/blob/master/crates/tr...
[2] https://github.com/fujiapple852/trippy/issues/101#issuecomme...
Maybe this post is dealing with the layer below - I'm out of my comfort zone with networking - but I recently built a custom protocol using Network and it's working well for me so far.
CFSocket would be the Swift/Obj-C API.
https://developer.apple.com/documentation/corefoundation/cfs...
The sysctls are net.link.generic.system.hwcksum_tx and net.link.generic.system.hwcksum_rx on macos.
At least Windows is completely different and there's no expectation of compatibility, but with the mac you can start off thinking things would work, but they don't.
Windows and WSL feels better to me at least.
I'd call that an excellent feature and more true to Linux than Linux is to itself today.
Even Linux is not a true UNIX,it is UNIX-like. You can't expect macOS to be like Linux, it should be quite the other way around.
Also the difference in some of the tools CLI flags wind up boiling down to being the BSD versions of them as opposed to the GNU versions of them. Which, again, isn’t a problem isolated to MacOS.
If you’re considering all Unixes everything you said basically still applies even if you remove MacOS from the equation. Unix isn’t just Linux.
My point was that systemd and bash are _not_ part of a linux system, and you can't count on them being there.
> Zsh is different from bash
Ubuntu has had a non-Bash system shell (dash is /bin/sh) since 6.10.
> no systemd
Without getting into objected-on-principle distributions like Devuan, tons of stripped-down and embedded linux distros besides Android and Alpine don't have systemd, e.g. DD-WRT, OpenWRT, TinyCore. Heck, launchd is more similar to systemd than SysV init was.
> /dev or /proc or /etc
Other than the parts specified by POSIX, the /dev filesystem is the wild west across tons of Linux and Unix systems, and expecting further standardization in behavior from it is a fool's errand (e.g. device name selection, device ID assignment order at boot, presence of metadata-symlinked directories like by-id, overlay/loopback devices ... all of these are highly variable even across modern, systemd-using Linux distros). I do miss /proc, though I don't miss the file descriptors it costs. /etc and XDG standards for configs are nice conventions to be sure, but a significant minority of Linux software breaks with those conventions (all-/opt install locations, anyone?).
> different filesystem,
Sure, APFS isn't ext3/4. Neither are XFS, ZFS, BTRFS, and so on. ext3/4 is a tenuous standard at best, and many businesses make a point of preferring other filesystems on Linux.
...like, I think you might have just been getting lucky and using a fairly similar set of Linux distros such that MacOS was a big switch. There are plenty of valid beefs with MacOS's divergences (don't get me started on an OS that claims certified POSIX compliance while providing a plethora of low-level system APIs documented to break in the presence of fork(2), or the not-quite-superset clusterfuck that is FSEvents vs. MacOS's not-quite-BSD-complete kqueue implementation, or the Sophie's choice of bizarre xattrs behavior vs. the historical accident that is aliases), but what you listed isn't even remotely standard Linux behavior, much less Unix behavior.
The Real World - it's got more stuff than you can imagine.
You initially said, seemingly implying this was a "false cool thing":
> Developers wax poetic about 'oh its a UNIX'
I don't think they meant what you think they meant by that. When people said that (back in the early '00s), people were familiar with Linux, yes, but they also interacted with several other commercial UNIXes that were still in wide use at the time (like those mentioned by the GP), as well as the BSDs. Being able to treat macOS like a UNIX (or, more specifically, like a BSD) was a big step up in convenience from Mac OS Classic.
No one expected macOS to be like Linux, at least not in the ways you are talking about.
CLI utils are an interesting thing: the BSDs have always(?) had their own, and don't use GNU coreutils (which is what Linux uses). There wasn't really much coordination over the decades, so they went in different directions. Most (all?) of them should be POSIX-compliant (possibly after setting an env var, at least in GNUs case), so if you restrict yourself to functionality specified in POSIX, you should be fine.
I don't really like macOS, but your specific criticism of it doesn't really hold water. If you're going to hate on macOS for this stuff, then you also have to hate on all the BSDs, which seems a little silly and unwarranted.
> with the mac you can start off thinking things would work, but they don't.
If you're expecting things to work on macOS just like on Linux, then your expectations were way off in the first place. If you want cross-platform compat in these areas, you'll have to stick with POSIX. Which sucks, especially since no one really implements POSIX correctly, but that's just how it is, and has always been.