The issue is the ISP uses IP addresses and connections are peer to peer, so that kind of identification is sort of necessary. On an open network (think a group of people talking), you could implement a non-ip system easily, and there are ways on a peer to peer network as well.
To hide it while using a conventional ISP that uses IP's (all of them as far I have seen), you would have to use a proxy. Services like Tor are a special form of chained proxies, but someone still sees your IP. The most secure way, is to setup a proxy or find a proxy you trust, and run it through there. Still, the proxy's IP is visible, and the proxy knows your IP. It's a good way to get a static IP and anyone who wants to mess with your computer will think it's the proxy. Your IP will be invisible unless someone gets it from the proxy server.
There is at least one alternative to ISP's that exists, too, and this is coming in the future. If you live in a densely populated city, it's pretty easy to setup a mesh wireless network, there just has to be the standard. Considering it has the potential to cure a lot of bottlenecks in the internet speeds and give everyone internet (think homeless people can find guidance if they can get a phone with Wifi access, although content-management is still weak these days and that's the concern people have), then a system that rapidly changes identification number for each connection would work, and you could use user ID's instead of network addresses to send a message to another.
Most networks work basically like this (I'm not an expert on this, so please correct me politely for any mistakes):
Computer #1 says to everyone, "I want 192.168.0.1 to get this message [insert message]." (this is a non-encrypted network)
192.168.0.1 accepts the message, then it checks the values to see if the checksum matches or whatever information would indicate it was transferred properly matches.
If it was transferred properly, it continues, otherwise it says "I didn't get that right, please send it again," and that continues until it verifies it received it properly (this is TCP).
After that, it follows the instructions, which usually entails asking the next network for an IP, such as 167.231.101.4, and either a router/switch that knows that IP or the IP itself continues it until it gets to the final IP on the route. Generally every network has its own set of IP's, so there's an indication of which network the IP is on (generally it's the global internet network, which I think is primarily managed by Level 3 and the ISP's computer connections probably have multiple IP's, one for the internet network, and one for the global network, and all of the ISP's agree on the global IP address -- each one is assigned a number of IP's that they are free to use).
The destination computer reads the message (after confirming it's the correct message) and says, "I got a reply, who has [Computer #1's IP address]," and the computer who knows that IP accepts it, checks it, then continues on until it reaches back to Computer #1.
So without an identification, the computers wouldn't know who to send anything to and no one could properly accept it. It's like sending a message to your friend named "John" rather than sending your message to an "unmentioned friend," the latter would get nowhere.
However, all that's necessary is there is an ID. That ID does not have to correlate for very long. It only needs to last until the request<->response is done. It is then free to change -- something that the traditional ISP's don't provide.
You can create a network where the requesting computer generates a very unique ID (and key, too, for an encrypted network), tells the local router that the router now knows someone with that ID, and the router can do the same and so forth. So you can have a new ID for every different connection. It would be similar to having a different name every time you ask someone a question.