Quoting from Wikipedia:
"When both endpoints support ECN they mark their packets with ECT(0) or ECT(1). Routers treat the ECT(0) and ECT(1) codepoints as equivalent. If the packet traverses an active queue management (AQM) queue (e.g., a queue that uses random early detection (RED)) that is experiencing congestion and the corresponding router supports ECN, it may change the code point to CE instead of dropping the packet. This act is referred to as "marking" and its purpose is to inform the receiving endpoint of impending congestion. At the receiving endpoint, this congestion indication is handled by the upper layer protocol (transport layer protocol) and needs to be echoed back to the transmitting node in order to signal it to reduce its transmission rate."
So, the congestion feedback mechanism is carried out in the transport layer (TCP) via receiving end sending segments with ECE flag set to 1. My question is, why doesn't the router that first experiences congestion just send, for instance, an ICMP message immediately back to the sender (I know that ICMP does not have a congestion option, however, can't it be simply implemented?) so that the sender can reduce its congestion window earlier? Why wait until the datagrams reach to the receiving end? What happens if the segments make it to the receiving end long enough to cause a burst transmission by the sender to lead to a bufferbloat (which might have been prevented by an early notification) so that other connections on the router experience high latency and jitter even if it may be for a short period of time?
It might be the case that the beneficial effect of this on the network is not worth the effort and the reason why the receiving end is the one that does the echoing of the congestion might be because the router can't bother preparing control messages in an environment in which many connections are regulated. However, I cannot find any sources on this topic.
Additionally, I first thought that maybe the packet needs to go through all the routing nodes to make clear the nodes that are going through congestion, however, there is not an information option that keep tracks of individual nodes in neither of the frame, datagram, and segment header fields. Another reason I thought why the segments make it to the receiving end to send congestion feedback rather than being sent directly by the router is keeping the congestion control on the transport layer (specificially TCP) but internet layer (e.g. IPv4) also supports congestion information via a 2 bit ECN field, which makes me question this reason. I am not sure if my reasonings make practical sense, though.