From RFC 793:
To be sure that a TCP does not create a segment that carries a sequence number which may be duplicated by an old segment remaining in the network, the TCP must keep quiet for a maximum segment lifetime (MSL) before assigning any sequence numbers upon starting up or recovering from a crash in which memory of sequence numbers in use was lost. For this specification the MSL is taken to be 2 minutes.
Seems contradicting what RFC 791 states:
Network delays are incurred in other ways, e.g., satellite links, which can add seconds of delay even though the Time to Live (TTL) is not decremented by a corresponding amount. There is thus no enforcement mechanism to ensure that datagrams older than 120 seconds are discarded.
I understand that MSL and TTL are used for different purposes reading this.
Provided that TCP segments are forwarded between routers as IP packets (considering no fragmentation for the sake of easier understanding), and IP packets have a Time To Live (TTL) field that works as a hop count and from RFC 791 seems like that is not time-related, how can routers in the network or TCP entities check that MSL is expired and therefore discard the segment?