If we take snapshot of netstat (netstat -nP tcp) the common states we see would be   ESTABLISHED,  TIME_WAIT,  CLOSE_WAIT.
I will try explaining what they mean.
Before we go into TIME_WAIT and   CLOSE_WAIT, lets take close look at sequence of steps for socket closing.
Socket connection is essentially between two peers (Browser to webserver, a java client to webserver, webserver to DB server, a webserver to another webserver etc )
Say there is a socket connection established between webserver1 and webserver2.
This would be the closing sequence, once the data transfer is done: (From TCP sequence diagram)
Here I am assuming webserver1 initiates the close of connection.
1)   Socket on webserver1 sends a TCP segment with FIN bit (in TCP header)
and the socket goes into FIN_WAIT_1 state.
2)  Socket on webserver2 receives the FIN and responds back with ACK to acknowledge the FIN and
the socket goes to CLOSE_WAIT state.
Now until the application calls the close() on this socket this is going to be in CLOSE_WAIT state.
3)  Socket on webserver1 receives the ACK and changes to FIN_WAIT_2
4)  Socket on webserver2 closes the connection(once the application calls close())
and sends back FIN to its peer to close the connection and changes its state to Last Ack
5)  Socket on webserver1 receives the FIN and sends back ACK.
At this point the socket implementation on webserver1 would start a timer (TIME_WAIT) to handle
the scenario where last ACK has been lost and server resends FIN.
Now the socket would wait for 2* MSL (Maximum segment lifetime- default is 4mins for solaris & windows)
6)  Socket on webserver2 receives the ACK and it moves the connection to closed state
7)  After TIME_WAIT is elapsed socket/connection will be closed on webserver1.
These multiple levels of acknowledgments & retransmits are needed
since TCP is a reliable protocol unlike basic UDP
Here is what the three states mean:
This is pretty explanatory which basically means the two ends are in a state where
data transfer can occur or occurring in both directions. (tcp socket is full duplex, i.e data can be received and responded to on same channel)
This is a state where socket is waiting for the application to execute close()
CLOSE_WAIT is not something that can be configured where as TIME_WAIT can be set through tcp_time_wait_interval (The attribute tcp_close_wait_interval has nothing to do with close_wait state and
this was renamed to tcp_time_wait_interval starting from Solaris 7)
A socket can be in CLOSE_WAIT state indefinitely until the application closes it.
Faulty scenarios would be like filedescriptor leak, server not being execute close() on socket leading to
pile up of close_wait sockets. (At java level, this manifests as "Too many open files" error)
This is just a time based wait on socket before closing down the connection permanently.
Under most circumstances, sockets in TIME_WAIT is nothing to worry about.