Solution 1:

My understanding is that a TCP socket consists of the IP+port number, so changing the IP breaks that connection. nc has no way of knowing the IP changed, so it continues sending data to the original IP until the session times out.

See RFC 793 (Transmission Control Protocol), specifically section 2.7:

2.7. Connection Establishment and Clearing

To identify the separate data streams that a TCP may handle, the TCP provides a port identifier. Since port identifiers are selected independently by each TCP they might not be unique. To provide for unique addresses within each TCP, we concatenate an internet address identifying the TCP with a port identifier to create a socket which will be unique throughout all networks connected together.

I suggest using Wireshark or another packet sniffer to watch the traffic for yourself and see it in action.

Solution 2:

The previous answers will tell you, that TCP connections cannot be kept alive when the IP address changes. That was correct in 2009, when those answers were written.

However in January 2013 RFC 6824 was published, which introduces a way to keep TCP connections alive when the IP address changes. As of June 2014, it is not yet widely supported. Most notably the reference implementation exists as a patch for Linux, and iOS7 supports MPTCP by default. Wikipedia lists a total of five implementations.