If there is no traffic initiated by the first host, the connection will happily stay in "ESTABLISHED" state forever until either the local process closes the connection or the remote host closes the connection.
Now imagine there is a network interruption between the hosts; no packets from the remote host can reach the first host. During this outage the remote host tries to send something to the first host; this times out because no ACK packets are received from the first host. After some time the connection times out and the remote host closes the connection. However the first host is blissfully ignorant of what's happened on the other host, so there the connection is still in state "ESTABLISHED".
The same thing happens if the remote host experiences a power failure and is rebooted; there's no chance of first terminating the existing network connections.
To prevent this situation there's tcp keepalive which needs to be turned on at the socket level. This causes a periodic keepalive packet to be exchanged between the hosts so that network outages can be detected even if there's no normal traffic.