Framed as identity: the scheme (and, separately, whether one was written at
all), the authority delimiter, the host and its kind, the port, the path and
its kind, and the query -- order and duplicates significant.
Excluded by contract: the fragment and any userinfo. Neither identifies a
web resource, so http://u:pw@h/p#frag and http://h/p mint the same key.
Their structural state is still available from safe_parse_url() and the
diagnostics helpers.
Ports normalize only where the standard makes them redundant: an explicit
:80 under http and :443 under https compare equal to no port at all.
Every other default stays literal, so ftp://h:21/ and ftp://h/ are
distinct, and an inferred scheme normalizes nothing (h.com:80/ is not
http://h.com/).