Go bakes in a particular model for network concurrency: you write blocking code, and the runtime does async io for you, switching between goroutines as needed.
Rust, on the other hand, does not bake in any particular IO or concurrency model. This means that you have many options; it also means that it's taken us a lot longer to come up with good defaults :) Tokio presents a single-threaded model for non-blocking IO based around futures. But you can also use a lower-level library like mio, writing your own event loop, or you could choose to directly bind to your operating system's IO model. It's up to you.
It's the same with concurrency: Rust gives you access to the tools you need to use your platform's threads, or to write your own green threaded runtime on top of them, or use someone else's.