Consider a typical basic-ish Ethernet network, not using VLANs.
We have a bunch of wires and transceivers connecting some devices - the physical layer. At this layer we can only send groups of bytes between directly-connected devices - not terribly useful.
Then we have an Ethernet network built out of those wires and transceivers - the data-link layer. At this layer, we can send a packet to any device on the network, using its MAC address. This layer also adds a checksum to each packet, and a tag identifying the next-layer protocol. "Ethernet routers" (i.e. switches) route packets at this level, and have some restrictions (e.g. no loops).
Then we have an IP network built out of one or more Ethernet networks. At this layer, we can send a packet to any device on the network, using its IP address. This layer also adds a checksum to each packet, and a tag identifying the next-layer protocol. Wait a minute, that sounds familiar. It also supports fragmentation, and more advanced routing.
On top of that we run TCP, UDP, etc...
Hang on, the IP layer can do everything the Ethernet data-link layer can do! So why do we need the Ethernet data-link layer? Why not run TCP over IP directly over the Ethernet physical layer?
Alternatively, why not expand the Ethernet data-link layer to do the things IP can do, then run TCP over the Ethernet data-link layer, without IP?