Why we need contact in SIP messages?

In SIP messages, VIA already specify where the client is. Then why we need CONTACT?

Thanks for any help in advance!

From RFC3261[1]:

“While the Via header field tells other elements where to send the
response, the Contact header field tells other elements where to send
future requests.”

As SIP is somewhat of a standard (some points are not clear enough in practice) you can consult the RFC for questions like these.

[1] ietf.org/rfc/rfc3261.txt

A typical case would be a load balancing proxy. Once the call reaches a particular worker, the contact header will directly identify that worker, so that the proxy is cut out of further interactions.

It’s also used in a REGISTER to provide a binding for an address of record, so you know where to contact when that AOR is looked up.