It should be TCP only.As TCP is a Transport Layer Protocol and as it a reliable Protocol i.e will retransmit the message or will send negative acknowledgement (using giving sequence number(as well as ack. number) to each byte) whenever it discover any error or a packet loss.
Coming to ICMP ,it is a Network layer protocol which is used for error reporting/sending.Now TCP itself will use sequence number for error reporting/sending.so it will NOT depend on the lower layers(Network Layer).
But UDP is a non reliable transport layer protocol,so apacket coming from application layer will go to transport layer ..here too there is no provision for error reporting.so ultimately it will dependent upon lower layer i.e Network layer .Network layer provides ICMP protocol to report error .