**IPv4** on IP-protokollan yleisesti käytetty versio. Sen seuraajaksi on kehitetty IPv6.

IPv4:ssä IP-osoite on 32-bittinen numero, jota on kasvatettu IPv6:ssa 128-bittiseksi useiden muiden muutosten ohella.

IPv4-paketti
------------

IPv4-paketti koostuu pakollisista otsikkotiedoista ja data-osiosta:

| + | 0–3 | 4–7 | 8–15 | 16–18 | 19–31 |
| --- | --- | --- | --- | --- | --- |
| 0 | versio | otsikon pituus | palveluluokka | kokonaispituus |
| 32 | tunnus | liput | fragmentin paikka |
| 64 | elinaika | protokollan numero | otsikon tarkistussumma |
| 96 | lähdeosoite |
| 128 | kohdeosoite |
| 160 | Optiot |
| 192 |  Data  |

**Versio**

Ilmoittaa protokollan versionumeron, tässä tapauksessa 4 eli binäärijärjestelmällä ilmoitettuna 0100.

**Otsikon pituus** (IHL, Internet header length)

Ilmoittaa IPv4-otsikon pituuden 32-bittisinä sanoina. Dataosiota ei lasketa tähän mukaan. Jos optioita ei käytetä, niin kentän arvo on 5.

**Palveluluokka** (TOS, Type of service)

Ilmoittaa toivomuksen palveluluokasta. Alkuperäisessä määrittelyssä (RFC 791) ensimmäiset kolme bittiä (precedence) määriteltiin liikenteen luokitteluun ja merkkaukseen. Seuraavat kolme bittiä sisältävät toivomuksen palvelulaadusta. Kaksi viimeistä bittiä jätettiin tulevia tarpeita varten. Nykyään TOS-kenttää käytetään DiffServ:iä ja ECN:ää varten.

**Kokonaispituus**

Ilmoittaa IPv4-paketin kokonaispituuden (otsikko + data) okteteissa eli kahdeksan bitin mittaisissa tavuissa.

**Tunnus**

Pilkotut IPv4-paketit saavat pilkottaessa (fragmentointi) saman tunnuksen, jotta alkuperäisen datagrammin uudelleenkoostaminen (defragmentointi) onnistuisi vastaanottajapäässä.

**Liput**

Ensimmäinen bitti näistä on varattu, ja sen täytyy olla aina 0. Toinen bitti ilmaisee saako paketin pilkkoa; arvossa 1 saa, muutoin ei. Kolmas bitti ilmaisee onko pilkottu paketti sarjansa eli alkuperäisen datagrammin viimeinen; arvo 1 ilmaisee, että sarja jatkuu, ja arvo 0 ilmaisee, että kyseessä on sarjan viimeinen paketti.

**Fragmentin paikka**

Ilmoittaa mihin kohtaan alkuperäistä datagrammia fragmentti kuuluu. Ensimmäinen fragmentti saa arvon 0, joka tarkoittaa, että fragmentti tulee uudelleenkoostettavassa paketissa ensimmäiseksi. Protokollan mukaan paketit on paloiteltava 64-bitin monikertojen kohdilta.

**Paketin elinaika** (TTL, Time to live)

Ilmoittaa paketin elinajan. Alun perin kenttä ilmoitti paketin elinajan sekunteina, mutta nykyään kenttä on ns. hyppylaskuri. Kentän suurin mahdollinen arvo on 255 eli kaikki kahdeksan bittiä ovat ykkösiä. Arvoa vähennetään aina yhdellä sen kulkiessa reitittimen läpi. Kun elinajan arvo on 0, paketin vastaanottava reitin pudottaa sen liikenteestä ja lähettää usein lähettäjäasemalle ICMP elinaika ylitetty eli Time exceeded -virheilmoituksen lähetyksen epäonnistumisesta.

**Protokolla**

Ilmoittaa seuraavan kerroksen (kapseloidun) protokollan, jota kuljetetaan IPv4-paketin datagrammina. Esimerkiksi:

* 1: ICMP
* 2: IGMP
* 6: TCP
* 17: UDP

**Tarkistussumma**

Ilmoittaa otsikon tarkistussumman. Tarkistussummaa tarvitaan, jotta voidaan havaita onko IPv4-paketin otsikko muuttunut matkalla kohdeasemaan, mikä saattaa olla erittäinkin kriittistä yhteyden kannalta. Datagrammia ei lasketa tarkistuksessa mukaan ja sen oikeellisuuden tarkistus täytyy hoitaa ylemmän tason protokollalla.

**Lähdeosoite**

Ilmoittaa paketin lähettävän verkkosovittimen 32-bittisen IPv4-osoitteen. IP-osoitteen väärentäminen tarkoittaa, että lähdeosoitteeksi väärennetään jokin muu kuin verkkosovittimen todellinen IPv4-osoite. Jotkin reitittimet tosin hylkäävät paketteja, jos pakettien lähettäjäosoite ei kuulu niihin IPv4-aliverkkoihin, jotka reititetään verkkosovittimeen, josta paketti saapui. Toisin sanoen paketti hylätään, jos se saapuu eri paikasta, kuin mistä sen luonnollisesti pitäisi tulla. Tätä ominaisuutta kutsutaan reverse path forwarding -suodatukseksi. 

**Kohdeosoite**

Ilmoittaa paketin kohteena olevan verkkosovittimen 32-bittisen IPv4-osoitteen. 

**Optiot**

Ilmoittaa paketin optiot jos niitä on. Optioita käytetään nykyisin erittäin harvoin ja enimmäkseen ne ovatkin krakkerien suosiossa sillä niillä voidaan muun muassa manipuloida paketin reititystä. Mikäli optiot jäävät vajaaksi 32-bitin monikerrasta täytyy perään lisätä täytettä, koska IP-otsikon täytyy olla 32-bitin monikerran kokoinen.

**Data**

Sisältää IP-paketin varsinaisen datan eli datagrammin, joka yleensä alkaa seuraavan tason protokollan otsikolla.

Standardit
----------

* RFC 791 (korvaa: RFC 760) − IPv4
* RFC 5944 - IP Mobility Support for IPv4, Revised