user30935: There are many descriptions of what mining is, but none of them describe it exactly. From what I gather:

Mining means finding a nonce c such that for some information s the hash value h(s||c) begins with a certain number of zeros (h is sha-256, || concatenation).

The "information" is given here. The nonce is an integer that is incremented in the mining process. But it seems that it's not s||c that is hashed, but rather there is some double hashing going on, but of what, h(s)||c, h(s||c), h(s)||h(c)? I can't deduce it from the Python code in the previous link (NB: I'm code illiterate).
Also the nonce isn't just initialized at zero and then incremented until there's success:

To avoid risking wasting work in this way, there needs to be a random starting point, and so the work becomes to find H(s,x,c)/2^(n-k) = 0 where x is random (eg 128-bits to make it statistically infeasible for two users to maliciously or accidentally start at the same point), and c is the counter being varied, and s is the service string. (source)

But that's the article describing hashcash, and who knows bitcoin might not have implemented the hashcash protocol as it was proposed.
So my question is, what is the exact protocol? I'd go and read the source code if I could but like I said I'm not code literate. Surely the answer must be possible to formulate concisely, something like:

Compute h(s||c) where c runs over 0,1,... until value begins with 15 zeros.

or

Hash s and obtain x in manner X, then compute h(h(s)||c) where c runs over x,x+1,..., until value begins with 17 zeros.

Sorry if this has been asked before, if so clearly I'm googling the wrong words, thanks.

user29532: There is no precise nonce finding protocol.
The miner can arbitrarily choose a nonce c to perform the hashing operation.
Mining is a mathematical game where the goal is to make the result of the hash function smaller than a given number (this is what "a result starting with x zeros" is looking for). The number is directly based on the current Bitcoin network difficulty and changes every two weeks to keep average block finding time at 600 seconds.
Most nonce generators just increment by 1 but the key is where they start. If you are solo mining, you can pick a random number. If you are mining with multiple devices or you are a pool administrator, you have to divide the work to avoid calculating the same hash twice (make sure they never use the same c).

user141: There is no concatenation. The nonce is part of the block header. The block header is 80 bytes and is hashed twice. That means you first sha-256 hash the 80 byte block header, and then you hash the hash.
Starting different users in a pool at different nonce values would be useless. With modern hardware all possible nonce values are processed in a split second.
Instead different users are given a different template from which to generate different blocks (small variations of the same block). After a miner has tried all nonce values it generates a new block from the template and starts over.
Using templates ensures that each client can generate their own work without needing to talk to a mining pool server many times per second.
Using different templates for each user ensures that no two users in the pool will ever do the same work.
What part of the work does an ASIC chip do: https://bitcoin.stackexchange.com/a/41775/141
Mining protocols: https://bitcoin.stackexchange.com/a/13307/141

user31391: This mining simulator is a good visual of what is being hashed. 
http://www.yogh.io/#mine:last
People are correct you don't have to change the Nonce it's just the fastest way to get a different hash output.  You could very well keep the nonce at 1 and change the timestamp, or the list of included transactions, which would change the merkelroot.
What's being hashed is version + previous block hash + merkel root + time + bits (target) + nonce.  This gets hashed twice sha256(sha256(blockheader))
The code and description here is pre
https://en.bitcoin.it/wiki/Block_hashing_algorithm

30935: <p>There are many descriptions of what mining is, but none of them describe it exactly. From what I gather:</p>

<blockquote>
  <p>Mining means finding a nonce c such that for some information s the hash value h(s||c) begins with a certain number of zeros (h is sha-256, || concatenation).</p>
</blockquote>

<p>The "information" is given <a href="https://en.bitcoin.it/wiki/Block_hashing_algorithm" rel="noreferrer">here</a>. The nonce is an integer that is incremented in the mining process. But it seems that it's not s||c that is hashed, but rather there is some double hashing going on, but of what, h(s)||c, h(s||c), h(s)||h(c)? I can't deduce it from the Python code in the previous link (NB: I'm code illiterate).</p>

<p>Also the nonce isn't just initialized at zero and then incremented until there's success:</p>

<blockquote>
  <p>To avoid risking wasting work in this way, there needs to be a random starting point, and so the work becomes to find H(s,x,c)/2^(n-k) = 0 where x is random (eg 128-bits to make it statistically infeasible for two users to maliciously or accidentally start at the same point), and c is the counter being varied, and s is the service string. <a href="https://en.bitcoin.it/wiki/Hashcash#Adding_purpose" rel="noreferrer">(source)</a></p>
</blockquote>

<p>But that's the article describing hashcash, and who knows bitcoin might not have implemented the hashcash protocol as it was proposed.</p>

<p>So my question is, what is the exact protocol? I'd go and read the source code if I could but like I said I'm not code literate. Surely the answer must be possible to formulate concisely, something like:</p>

<blockquote>
  <p>Compute h(s||c) where c runs over 0,1,... until value begins with 15 zeros.</p>
</blockquote>

<p>or</p>

<blockquote>
  <p>Hash s and obtain x in manner X, then compute h(h(s)||c) where c runs over x,x+1,..., until value begins with 17 zeros.</p>
</blockquote>

<p>Sorry if this has been asked before, if so clearly I'm googling the wrong words, thanks.</p>
 29532: <p><strong>There is no precise nonce finding protocol.</strong></p>

<p>The miner can <strong>arbitrarily</strong> choose a nonce c to perform the hashing operation.</p>

<p><strong>Mining is a mathematical game</strong> where the goal is to make the result of the hash function smaller than a given number (this is what "a result starting with x zeros" is looking for). The number is directly based on the current Bitcoin network difficulty and changes every two weeks to keep average block finding time at 600 seconds.</p>

<p><strong>Most nonce generators just increment by 1</strong> but the key is where they start. If you are solo mining, you can pick a random number. If you are mining with multiple devices or you are a pool administrator, you have to divide the work to avoid calculating the same hash twice (make sure they never use the same c).</p>
 141: <p>There is no concatenation. The nonce is part of the block header. The block header is 80 bytes and is hashed twice. That means you first sha-256 hash the 80 byte block header, and then you hash the hash.</p>

<p>Starting different users in a pool at different nonce values would be useless. With modern hardware all possible nonce values are processed in a split second.</p>

<p>Instead different users are given a different template from which to generate different blocks (small variations of the same block). After a miner has tried all nonce values it generates a new block from the template and starts over.</p>

<p>Using templates ensures that each client can generate their own work without needing to talk to a mining pool server many times per second.</p>

<p>Using different templates for each user ensures that no two users in the pool will ever do the same work.</p>

<p>What part of the work does an ASIC chip do: <a href="https://bitcoin.stackexchange.com/a/41775/141">https://bitcoin.stackexchange.com/a/41775/141</a></p>

<p>Mining protocols: <a href="https://bitcoin.stackexchange.com/a/13307/141">https://bitcoin.stackexchange.com/a/13307/141</a></p>
 31391: <p>This mining simulator is a good visual of what is being hashed. </p>

<p><a href="http://www.yogh.io/#mine:last" rel="noreferrer">http://www.yogh.io/#mine:last</a></p>

<p>People are correct you don't have to change the Nonce it's just the fastest way to get a different hash output.  You could very well keep the nonce at 1 and change the timestamp, or the list of included transactions, which would change the merkelroot.</p>

<p>What's being hashed is version + previous block hash + merkel root + time + bits (target) + nonce.  This gets hashed twice sha256(sha256(blockheader))</p>

<p>The code and description here is pre
<a href="https://en.bitcoin.it/wiki/Block_hashing_algorithm" rel="noreferrer">https://en.bitcoin.it/wiki/Block_hashing_algorithm</a></p>
