Best I could gather from several places is that :
C3 introduces a distinction between hardware pixels and abstract (layout) pixels.
Viewport size values are abstract pixels, meaning the pixels the game renders (which may not correspond with how they are displayed on the screen); e.g. when a layer is zoomed in, it may only have 50xN abstract pixels on the screen, thus ViewportWidth(0) will be 50, while physical amount of pixels that is used to display stuff relies on scaling, window size and other factors.
Canvas size values are device pixels, so by setting canvas size you basically set the Window size.
Also note that some tutorials refer to abstract pixels as CSS pixels, which may or may not be the same thing.
Feel free to correct me if I got something wrong.
(I wish there was a comprehensive tutorial about that!)