There are some reasons relating network problem/proccess crash,…etc cause half-open TCP connection. You can refer to below link for common cases.
On module you can enable +KTCP_ACK Notification to see the status report for TCP data. It will show Data sent failure/success (all the data has (NOT) been received by the remote side)
<session_id> TCP session index
0 Data sent failure: not all data has been received by remote side
1 Data sent success: all the data has already been received by the remote side
Please refer to 13.9.1. +KTCPCFG Command: TCP Connection Configuration. page #516 in the AT command which was posted here
Also you can check by using KTCPACKINFO Command: Poll ACK Status for the Latest Data
Please feel free share any concerns you have. Help us tick Solution if your question is answered