The Canonical URL tag has many similarities to the 301 Permanent redirect from an SEO standpoint. With a Canonical URL tag, you are letting the search engines know that the pages should count as one, while still leaving all the pages online for visitors. With a 301 Permanent redirect, this actually forwards the users to the new url. There may be cases where you are not able to implement a 301 redirect, and in these cases, the Canonical URL tag is a good option.
The Canonical URL tag just mainly for the search engines. These urls can still be tracked separately online. With a 301 Permanent redirect, all traffic search engine robots and online visitors are redirected.
Canonical URL tags operates on a single domain only, including subfolders and subdomains but (not cross domains). You cannot set a Canonical URL tag from domain1.com to domain2.com. 301 redirects can be used from one domain to another, from one page to another.
A 301 redirect is typically the preferred method as it tends to have a stronger signal. Both a 301 redirect and the Canonical URL tag method will both pass PageRank/Link Juice. Past research has shown that a 301 redirect passes anywhere from 90-99% of the PageRank. Meaning, in either case there will be some PageRank lost, but most times it is very minimal.
302 Redirects and the NoFollow Tag
Just to touch on other methods and tags that do not pass any PageRank. The nofollow attribute allows webmasters to adjust the PageRank flow. Using the nofollow tag on a link will stop the PageRank from going to the intended page. This may be helpful for when you want to adjust the PageRank flow going to outside websites, or to pages within your website.
The 302 Redirect, is a temporary redirect and with this, no PageRank or Link Juice is passed on to the page/site. The 302 Redirect should be avoided in most cases. Often times, you will see the 302 Redirect being used improperly with domain registrars. People/Companies tend to have multiple domains and they opt to have them redirect, and it is easy for someone to have the wrong redirect used.
Check your site at http://web-sniffer.net/ to get the HTTP Request and Response Header information