Article
Biophysics · Physiology · ⏱ ~13 min read · Last updated: 3 July 2026

Oxygen Diffusion in Tissue — Krogh's Cylinder Model

Every mitochondrion in your body sits within a few tens of micrometres of a capillary — not by accident, but because oxygen molecules have no engine of their own. They move by pure passive diffusion, a random walk down a concentration gradient, and diffusion is ferociously slow over anything but microscopic distances. August Krogh's 1919 cylinder model, built from measurements of capillary density in resting and working muscle, turned this constraint into a quantitative theory that still underlies how we understand hypoxia, tumour biology, exercise physiology and the engineering limits of artificial tissue.

1. Fick's First Law of Diffusion

Adolf Fick described diffusive transport in 1855: the flux of a solute is proportional to the local concentration gradient. For oxygen crossing a thin slab of tissue:

Fick's first law: J = −D · (dC/dx) J = flux [mol / (m²·s)] D = diffusion coefficient of O₂ in tissue [m²/s] dC/dx = concentration gradient [mol/m⁴] Steady-state radial diffusion (cylindrical symmetry) obeys the diffusion equation with source term (oxygen consumption rate M, assumed uniform): D · (1/r) · d/dr[r · dC/dr] = M This is Fick's second law at steady state, with a sink term for metabolic O₂ consumption.

The minus sign says flux runs from high to low concentration — O₂ always flows from the oxygen-rich capillary lumen (PO₂ ≈ 100 mmHg arterial) toward the oxygen-poor mitochondria (PO₂ as low as 1–3 mmHg at the point of use), never the reverse, exactly as required by the second law of thermodynamics.

2. Why Diffusion Is Fast at Micron Scale, Useless at Centimetre Scale

The time for a diffusing particle to travel a distance L scales with L², not L — this quadratic scaling is the entire reason multicellular organisms need circulatory systems at all:

Random-walk / diffusion time estimate: t ≈ L² / (2·D) For O₂ in aqueous tissue: D ≈ 2 × 10⁻⁹ m²/s (at 37 °C) L = 10 μm (one cell width): t ≈ (10×10⁻⁶)² / (2 × 2×10⁻⁹) ≈ 0.025 s (instant) L = 100 μm (typical capillary spacing): t ≈ 2.5 s (fine) L = 1 mm: t ≈ 250 s ≈ 4 min (too slow for living tissue) L = 1 cm: t ≈ 25 000 s ≈ 7 hours (metabolically fatal)

A tissue block more than roughly half a millimetre from its nearest capillary cannot be kept oxygenated by diffusion alone at typical metabolic rates — this single number, not any exotic biology, fixes capillary density at 1 vessel roughly every 20–50 μm in most tissues, and is the central design constraint that convection (blood flow) exists to bypass: circulation delivers O₂ over centimetres to metres at bulk-flow speed, then diffusion finishes the job over the last tens of micrometres.

3. The Krogh Cylinder Model

August Krogh (1874–1949, Nobel Prize in Physiology or Medicine 1920) modelled tissue as concentric cylinders of tissue surrounding each capillary, each supplying O₂ to a fixed radius r_t before the next capillary's territory begins:

Krogh–Erlang equation (steady-state PO₂ profile in the tissue cylinder), radius r from capillary axis (r_c ≤ r ≤ r_t): P(r) = P_c − (M / (4·D·α)) · [r² − r_c² − 2·r_t²·ln(r/r_c)] where: P_c = PO₂ at capillary wall [mmHg] M = tissue O₂ consumption rate [mL O₂ / (mL·s)] D = diffusion coefficient of O₂ in tissue [cm²/s] α = solubility (Bunsen) coefficient of O₂ in tissue [mL O₂/(mL·mmHg)] r_c = capillary radius (≈ 3 μm) r_t = tissue cylinder radius (Krogh radius, ≈ half inter-capillary spacing) The minimum PO₂ occurs at the cylinder boundary r = r_t (farthest point from any capillary) — the classic "lethal corner".

The product D·α is called the Krogh diffusion coefficient, K = D·α, and is the single empirical constant Krogh measured directly by timing bubble absorption through gelatin and muscle — it collapses two unknowns (how fast O₂ moves, how much dissolves) into one measurable number.

4. Oxygen Solubility and the Krogh Diffusion Coefficient

Diffusion coefficient D

O₂ in water/tissue at 37 °C: D ≈ 1.7–2.4 × 10⁻⁵ cm²/s. About 5–10× slower than in air (D_air ≈ 2 × 10⁻¹ cm²/s) because liquid water is far more viscous than gas.

Solubility α (Bunsen)

O₂ dissolves poorly in water: α ≈ 2.4 × 10⁻⁵ mL O₂/(mL·mmHg) at 37 °C — Henry's law, C_dissolved = α · P. This low solubility is why oxygen alone in plasma cannot meet metabolic demand.

Krogh's K = D·α

K ≈ 1.4 × 10⁻¹⁴ mL O₂ / (cm·s·mmHg) in resting skeletal muscle — Krogh's original 1919 measurement, still cited in modern tumour-oxygenation models a century later.

Myoglobin facilitation

Muscle myoglobin acts as an intracellular O₂ shuttle, effectively boosting apparent D by 1.5–2× at low PO₂ by "facilitated diffusion" — molecules hop from one myoglobin site to the next.

5. Haemoglobin: the Oxygen Buffer

Free dissolved O₂ in plasma cannot supply the body's demand — a litre of blood carries only ≈ 3 mL of dissolved O₂ at arterial PO₂, versus ≈ 200 mL bound to haemoglobin. The sigmoidal oxygen–haemoglobin dissociation curve is what makes this buffer work efficiently across the whole PO₂ range the body encounters:

Hill equation for haemoglobin saturation: S = P^n / (P50^n + P^n) P50 ≈ 26–27 mmHg (PO₂ at 50% saturation, normal adult, pH 7.4, 37 °C) n ≈ 2.7 (Hill coefficient — cooperative binding across 4 haem sites) Bohr effect (right-shift of curve): ↑CO₂, ↓pH, ↑temperature in active tissue → P50 increases → Hb releases O₂ more readily exactly where it's needed most (working muscle, hot, acidic, CO₂-rich microenvironment) Arterial: PO₂ ≈ 100 mmHg → S ≈ 97–98% Venous (resting): PO₂ ≈ 40 mmHg → S ≈ 75% Venous (heavy exercise): PO₂ ≈ 20 mmHg → S ≈ 30% → large O₂ extraction reserve

The steep middle portion of the sigmoid (roughly 20–60 mmHg) is exactly where the capillary-to-tissue PO₂ drop happens, so small changes in tissue PO₂ release comparatively large amounts of O₂ — the curve's shape is itself an adaptation that keeps the driving gradient for Fick diffusion high along the whole capillary length, rather than collapsing to zero early.

6. The Lethal Corner and Tissue Hypoxia

Combining the Krogh–Erlang profile with the falling PO₂ along the capillary length (as O₂ is extracted from venous to arterial end) produces a two-dimensional map of tissue oxygenation. The lowest PO₂ in the whole cylinder sits at the venous end, at the farthest radius from the capillary — Krogh's "lethal corner":

Critical radius (max r_t before P(r_t) = 0, tissue anoxia): r_t,max = r_c · exp[ (4·D·α·(P_c − 0)) / (M·r_t²) + 1/2 ] (solved implicitly — practically, tabulated or computed numerically) Rule-of-thumb diffusion limits observed experimentally: Resting skeletal muscle: r_t ≈ 25–40 μm safe radius Maximally working muscle (M up 20×): r_t drops to ≈ 10–15 μm — capillary recruitment compensates by opening previously closed capillaries, shrinking effective spacing Solid tumour tissue: diffusion-limited hypoxia begins at ≈100–150 μm from the nearest patent vessel — the biological basis of radioresistant hypoxic tumour cores

Physiological responses to the diffusion limit:

7. JavaScript Krogh Cylinder Simulator

// Krogh cylinder: steady-state radial PO2 profile around a capillary
// P(r) = Pc - (M / (4*D*alpha)) * [r^2 - rc^2 - 2*rt^2*ln(r/rc)]

function kroghProfile({
  Pc    = 40,        // capillary wall PO2 [mmHg]
  rc    = 3e-4,     // capillary radius [cm] (~3 um)
  rt    = 2.5e-3,   // tissue cylinder radius [cm] (~25 um)
  M     = 2e-4,     // O2 consumption [mL O2 / (mL tissue . s)]
  D     = 1.7e-5,   // diffusion coeff [cm^2/s]
  alpha = 2.4e-5    // solubility [mL O2 / (mL . mmHg)]
} = {}, samples = 40) {
  const K = D * alpha; // Krogh diffusion coefficient
  const profile = [];
  for (let i = 0; i <= samples; i++) {
    const r = rc + (rt - rc) * (i / samples);
    const term = r**2 - rc**2 - 2 * rt**2 * Math.log(r / rc);
    const P = Pc - (M / (4 * K)) * term;
    profile.push({ r_um: (r * 1e4).toFixed(1), P_mmHg: Math.max(0, P).toFixed(2) });
  }
  return profile;
}

// Maximum sustainable tissue radius: find rt where P(rt) just reaches 0
function maxRadius(Pc, rc, M, K, tolerance = 1e-6) {
  let lo = rc, hi = rc * 50;
  function Pboundary(rt) {
    const term = rt**2 - rc**2 - 2 * rt**2 * Math.log(rt / rc);
    return Pc - (M / (4 * K)) * term;
  }
  while (hi - lo > tolerance) {
    const mid = (lo + hi) / 2;
    if (Pboundary(mid) > 0) lo = mid; else hi = mid;
  }
  return lo; // [cm]
}

const profile = kroghProfile({});
const minP = Math.min(...profile.map(p => +p.P_mmHg));
console.log(`Minimum tissue PO2 (lethal corner): ${minP.toFixed(1)} mmHg`);

const K = 1.7e-5 * 2.4e-5;
const rMax = maxRadius(40, 3e-4, 2e-4, K);
console.log(`Critical radius before anoxia: ${(rMax * 1e4).toFixed(1)} um`);
🫁 Open Membrane Diffusion →