Is the SYN packet the only packet that have the ACK flag not set, or are there other packets that have the ACK flag not set?
Under some circumstances, an RST packet will not have the ACK flag set. For example, if a host receives a TCP packet with the ACK flag set, but it doesn't match any open connection, it'll reply with a packet that has the RST flag but not ACK. (As opposed to e.g. when a host receives a SYN packet for a closed port -- then it'd reply with an RST+ACK packet.)