Internet Cache Protocol (ICP) è un protocollo molto leggero per la localizzazione di oggetti web incluso come parte del progetto Harvest. Un client ICP trasmette un messaggio di domanda ad uno o più server ICP, chiedendo se essi hanno in cache un URI particolare. Ogni server può rispondere con un messaggio ICP che indica un hit, un miss o di segnalazione. Il client ICP utilizza le informazioni nelle risposte ICP per prendere una decisione di inoltro della richiesta.
Oltre che la predizione dei cache hits, l'ICP è utile per la fornitura dei suggerimenti circa i termini della rete in un paradigma di Inter-caching tra i proxy. I messaggi ICP sono simili ai ping del protocollo ICMP in questo senso. Misurando il Round Trip Time (RTT), dall'invio della richiesta alla ricezione della risposta, si possono stimare le congestioni di rete. Nel caso estremo, i messaggi ICP possono essere persi, indicando che il percorso fra i due è interrotto o congestionato. Con questo un proxy decide di evitare di inoltrare al vicino quella richiesta particolare. Lo svantaggio più grande nell'uso del protocollo ICP è la pesante latenza generata del metodo richiesta/risposta. I proxy cache devono ridurre la latenza non aumentarla. ICP inoltre soffre di un alcune mancanze di progetto: sicurezza, scalabilità, falsi hits e la mancanza di un metodo di richiesta. Il protocollo non comprende alcuna caratteristica di sicurezza. A questo si aggiunge la scarsa scalabilità del protocollo: il numero dei messaggi di ICP cresce in proporzione al numero dei vicini. Di conseguenza la banda disponibile, inversamente proporzionale al numero dei messaggi, diminuisce. A meno di usare un certo schema di partizione, questa caratteristica pone un limite superiore al numero di vicini di cui si può disporre. Tipicamente non si oltrepassano i sei.
Le richieste ICP contengono soltanto URI, senza altre intestazioni di richiesta supplementari. Ciò fa sì che sia difficile predire i cache hits con precisione. Una richiesta HTTP può includere le intestazioni supplementari come Cache-Control: max-stale=N che trasforma un cache hit in un cache miss. In più ICP assume che tutte le richieste siano di tipo GET. In questo modo si ha che un cache proxy non può impiegare il protocollo ICP in aggiunta ad un metodo HEAD per la localizzazione di un oggetto.