Anwyay. With "fresh" routing table - let's assume that the only thing there
is localhost. When you did:
$ ifconfig sk0 192.168.50.1
$ ifconfig sk1 192.168.50.2
The first command would add something like:
192.168/255.255.0.0 link#1 .... UC sk0
Flag C (check netstat man page) is important here. Now every new connection
you would normally do to subnet 192.168 will add direct routes to hosts.
That includes 192.168.50.2, which isn't on sk0. 192.168.50.1 otoh, on sk0,
will add similar entry, but going through lo0 (as going to itself, through
sk0, is not the thing to do).
The first of your ping will send requests to "host" .2 going through sk0,
but the replies from that "host" will go locally through loopback, as per
routing table. Similary, the second ping command, will send requests through
lo0, but replies through sk0.
If you changed ifconfig sequence, you would see something similar, but
traffic to .1 would go through sk1 and to .2 through lo0.
Small correction to my prev post - messing with route / PF to enforce going
over cable in both ways shouldn't probably yield any results here.