# ISCSI

Internet Small Computer System Interface (iSCSI) is een netwerkprotocol ontwikkeld door de Internet Engineering Task Force (IETF). Het wordt gebruikt om SCSI-commando’s te verzenden over TCP/IP netwerken, dit kan een Local area network, een Wide area network of het internet zijn. De bedoeling van dit protocol is om verbindingen op te stellen tussen opslagapparaten, servers en clients. Wanneer een opslagfaciliteit niet rechtstreeks verbonden is met de server, zal iSCSI dit wel zo doen lijken. Dit protocol wordt gebruikt met Storage Area Network (SAN). Een alternatief protocol dat gebruikt wordt bij SAN’s is Fibre Channel. Een nadeel hiervan is dat de transmissies dan over glasvezel moeten gebeuren terwijl iSCSI gebruikt kan worden over bestaande netwerkinfrastructuur. Bekende bedrijven zoals Microsoft, IBM, Cisco en Intel maken gebruik van de iSCSI-standaard.

## SCSI

Small Computer System Interface is een Client-servermodel. De client zal hier de term ‘initiator’ worden toegewezen en de server ‘target’. Een initiator zal een SCSI commando versturen naar een I/O-apparaat, logical unit (LU) genoemd, van een server om een service aan te vragen. Omdat een target meerdere LU’s kan hebben, zal naar elke LU verwezen worden via een logical unit number (LUN). SCSI-commando’s worden verstuurd in een command descriptor block (CDB) datastructuur.

## Basisprincipes
### Sessies

De data die wordt verstuurd van initiator naar target en terug wordt opgedeeld in protocol data units (PDU's). Als een initiator en een target met elkaar communiceren kan dit gebeuren over meerdere TCP-connecties. De verzameling van zo’n connecties noemt men een sessie en wordt benoemd met een sessie-ID. Ook krijgt elke connectie een connectie-ID. Over alle connecties wordt de target op dezelfde wijze bekeken en de initiator is ook gelijk over alle connecties van een sessie.

### Loginproces

Om een connectie tussen initiator en target te vestigen zal het loginproces moeten worden gestart. Dit proces wordt gestart als een initiator verbindt met een TCP-poort van de target. Dan kan er optioneel een authenticatie uitgevoerd worden en kan er een security association protocol ingesteld worden, zoals bijvoorbeeld IPsec. Als dan de juiste parameters zijn bevestigd eindigt de loginfase en begint de fase met volledige functionaliteit en mogen SCSI-commando’s verzonden worden. Tijdens de loginfase mag enkel gebruikgemaakt worden van login requests en login responses. Als er buiten deze fase login PDU’s ontvangen worden door een target zal deze direct de connectie verbreken.

### Connectie-aanhankelijkheid

Als een initiator over een bepaalde connectie een request stuurt naar een target zal het target de response of andere gerelateerde PDU’s over dezelfde connectie moeten terugsturen. Als de connectie wordt verbroken voordat het commando voltooid is, zal een andere connectie worden toegewezen aan het onvoltooide commando.

### Naamgeving

Elke initiator of target heeft een unieke naam voor identificatie. Er zijn drie gebruikte formaten in iSCSI:

##### IQN

De iSCSI Qualified Name maakt gebruik van domeinnamen. Degene die de naam genereert, moet een geregistreerde domeinnaam bezitten. Dit om te voorkomen dat verschillende targets dezelfde naam hebben. De iSCSI Qualified Name bestaat uit volgende onderdelen:
* De string ‘iqn.’
* Een datum (jjjj-mm) wanneer de domeinnaam nog in het bezit is van de target
* Een punt ‘.’
* De omgekeerde domeinnaam van diegene die de iSCSI naam aanmaakt.
* Dan kan er nog optionele informatie volgen voorafgegaan door een dubbele punt ‘:’.
Enkele voorbeelden:

##### IEEE EUI-64

Dit formaat, opgesteld door IEEE, wordt gebruikt zodat er makkelijk kan worden omgezet naar een globale identifier voor gebruik in andere netwerkprotocollen. Dit formaat bestaat uit volgende onderdelen:
* De string eui.
* 16 ASCII-gecodeerde hexadecimale cijfers.
Een voorbeeld:
Type EUI-64 identifier (ASCII-encoded hexadecimal)

##### T11 Network Address Authority (NAA)

Dit is een formaat dat later nog werd toegevoegd voor compatibiliteit met glasvezel en serial attached SCSI (SAS). Dit formaat bestaat uit volgende delen:
* De string naa.
* ASCII-gecodeerde hexadecimale cijfers.
Voorbeelden:
Type NAA identifier (64-bit ASCII-encoded hexadecimal)
Type NAA identifier (128-bit ASCII-encoded hexadecimal)

## Fouten behandelen en herstel

In verschillende implementaties kunnen verschillende technieken gebruikt worden om fouten te herstellen. Omdat er toch enige vorm van interoperabiliteit aanwezig moet zijn is er wel een algemeen model gespecificeerd. Er moet ook voor een goede distributie gezorgd worden, zodat target en initiator niet dezelfde PDU’s gaan herstellen. Een initiator zal gebruikmaken van R2T (ready-to-transfer) support en een target van de SNACK-support (bevestiging dat data gelezen werd). Ook kan de connectie aanhankelijkheid aangepast worden, indien er iets mis is met de connectie. Foutenherstel kan gebeuren in een commando of een connectie. Ook kan een sessie of een connectie zelf hersteld worden.

## PDU-formaat

Het formaat van een protocol data unit (PDU) is verschillend voor andere commando’s. Wat ze wel gemeenschappelijk hebben is de basic header segment (BHS). Dit is een deel van de header die bestaat uit 48 bytes. Deze kan optioneel nog gevolgd worden door een additional header segment, een header-digest, een data segment en/of een data-digest. Een BHS ziet er zo uit:
| I(opcode) | F(opcode specific fields) |
| TotalAHSLength | DataSegmentLength |
| LUN or Opcode Specific fields ||
| Initiator Task Tag ||
| Opcode Specific fields ||
* I: deze wordt bij requests op 1 gezet voor onmiddellijke levering
* F: wanneer deze 1 bevat is deze PDU de laatste van een reeks PDU’s
* TotalAHSLength: dit is de totale lengte van alle bijgevoegde AHS headersegmenten
* DataSegmentLength: dit is de lengte van het datasegment
* LUN: dit veld duidt aan op welke logical unit de opcode toepassing heeft
* Initiator Task Tag: deze duidt het commando of een reeks gelinkte commando’s aan
Veel velden hangen af van de opcode die de PDU bevat. Opcodes kunnen zijn: login request, text request, SCSI task management function request, SCSI data-in (read operation), R2T (Ready to transfer) en nog veel meer.

## Veiligheid

Indien er gebruikgemaakt wordt van authenticatie, dit is volledig vrij, kunnen volgende methodes van authenticatie gebruikt worden:
* Kerberos V5
* SPKM1, Simple Public-Key GSS-API Mechanism
* SPKM2, Simple Public-Key GSS-API Mechanism
* Secure Remote Password
* Challenge-Handshake Authentication Protocol
IPSec kan hierbij gebruikt worden voor data integriteit, authenticatie en confidentialiteit.