You need to distinguish between transmitter (TX) and receiver (RX) here. For the receiver it is generally quite easy to gain knowledge of the channel: have the transmitter send a few known symbols, then the receiver can estimate the channel coefficients (e.g., via Least Squares or MMSE). The receiver needs this channel estimate for equalization. For example, the ZF receive strategy you mentioned essentially means you divide out the channel coefficient, i.e., if you receive $y = h \cdot s + w$ where $h$ is the channel, $s$ your unkown information symbol and $w$ the noise, the simplest you can do to estimate $s$ is divide out $h$ (use $y/h$ as an estimate), for which you need to know it.
The question you asked about is knowing the channel at the transmitter. This is much harder since in general, the receiver would need to send its estimated channel coefficient back to the transmitter to know it. This requires extra communication resources. And time, which is a problem since the channel information might be outdated by the time it reaches the transmitter, if your channel is time-varying. Another option is to assume the channel between TX and RX are "symmetric", in communication parlance referred to as reciprocity. Then, the TX can estimate its own received channel for data it got from the RX and assume that the same channel coefficient applies for the reverse link. For this to work, in general we need to assume that TX and RX work on the same frequency (e.g., when they use time division duplexing).
The real question here is what would it help the TX to know the channel? Does that improve capacity? As I'm sure you read it does help in the MIMO case as this allows the TX to send data in the "proper directions", i.e., excite the strong eigenmodes of the channel and thus get more power across. There are other cases where it helps, e.g., when dealing with multiple users, interference, and other things.