Skip to main content

Overview

The Packet class represents a simulated network packet used in the Selective Repeat protocol. It provides immutable packet objects with a builder pattern for construction and methods for serialization/deserialization.

Packet Structure

Each packet consists of the following fields:
type
int
required
Packet type identifier:
  • 0: Data packet
  • 1: ACK (Acknowledgment)
  • 2: SYN (Connection request)
  • 3: SYN-ACK (Connection acknowledgment)
  • 4: NACK (Negative acknowledgment)
  • 6: Connection close
sequenceNumber
long
required
Packet sequence number for ordering and acknowledgment (unsigned 32-bit)
peerAddress
InetAddress
required
IPv4 address of the destination peer (4 bytes)
peerPort
int
required
Destination port number (unsigned 16-bit)
payload
byte[]
required
Packet payload data (0-1024 bytes)

Constants

public static final int MIN_LEN = 11;        // Minimum packet size (header only)
public static final int MAX_LEN = 11 + 1024; // Maximum packet size (header + payload)
Packet header is 11 bytes: 1 (type) + 4 (sequence) + 4 (address) + 2 (port) = 11 bytes

Constructor

Packet()

Creates a new packet instance.
type
int
required
Packet type (0-6)
sequenceNumber
long
required
Sequence number
peerAddress
InetAddress
required
Destination IP address
peerPort
int
required
Destination port
payload
byte[]
required
Payload data
Packet packet = new Packet(
    0,                                          // Data packet
    42L,                                        // Sequence number
    InetAddress.getByName("192.168.1.100"),   // Peer address
    8000,                                       // Peer port
    "Hello World".getBytes()                   // Payload
);
Direct constructor usage is discouraged. Use the Builder pattern instead for better readability and flexibility.

Getter Methods

getType()

type
int
Returns the packet type

getSequenceNumber()

sequenceNumber
long
Returns the sequence number

getPeerAddress()

peerAddress
InetAddress
Returns the destination IP address

getPeerPort()

peerPort
int
Returns the destination port number

getPayload()

payload
byte[]
Returns the payload data as a byte array

Builder Pattern

Packet.Builder

Provides a fluent API for constructing packets.
Packet packet = new Packet.Builder()
    .setType(0)
    .setSequenceNumber(1L)
    .setPortNumber(8000)
    .setPeerAddress(InetAddress.getByName("127.0.0.1"))
    .setPayload("Request data".getBytes())
    .create();

Builder Methods

type
int
required
Sets the packet type
builder
Builder
Returns the builder instance for chaining
builder.setType(1)  // ACK packet
sequenceNumber
long
required
Sets the sequence number
builder
Builder
Returns the builder instance for chaining
builder.setSequenceNumber(42L)
peerAddress
InetAddress
required
Sets the destination IP address
builder
Builder
Returns the builder instance for chaining
builder.setPeerAddress(InetAddress.getByName("192.168.1.100"))
portNumber
int
required
Sets the destination port number
builder
Builder
Returns the builder instance for chaining
builder.setPortNumber(8000)
payload
byte[]
required
Sets the payload data
builder
Builder
Returns the builder instance for chaining
builder.setPayload("Data".getBytes())
Constructs and returns the final Packet object.
packet
Packet
The constructed packet instance
Packet packet = builder.create();

toBuilder()

Creates a builder from an existing packet for modification.
builder
Builder
A new builder initialized with the current packet’s values
Packet original = new Packet.Builder()
    .setType(0)
    .setSequenceNumber(1L)
    .setPortNumber(8000)
    .setPeerAddress(InetAddress.getByName("127.0.0.1"))
    .setPayload("Data".getBytes())
    .create();

// Create modified version
Packet ack = original.toBuilder()
    .setType(1)              // Change to ACK
    .setPayload(new byte[0]) // Empty payload
    .create();

Serialization

toBytes()

Converts the packet to a byte array for network transmission.
bytes
byte[]
Raw byte representation of the packet in BigEndian format
Packet packet = new Packet.Builder()
    .setType(0)
    .setSequenceNumber(1L)
    .setPeerAddress(InetAddress.getByName("127.0.0.1"))
    .setPortNumber(8000)
    .setPayload("Hello".getBytes())
    .create();

byte[] data = packet.toBytes();
DatagramPacket dgram = new DatagramPacket(
    data, 
    data.length, 
    routerAddress, 
    routerPort
);
socket.send(dgram);

toBuffer()

Converts the packet to a ByteBuffer in BigEndian format.
buffer
ByteBuffer
ByteBuffer flipped and ready for reading
ByteBuffer buffer = packet.toBuffer();

Deserialization

fromBytes()

Creates a packet from a byte array.
bytes
byte[]
required
Raw packet data received from network
packet
Packet
Reconstructed packet object
DatagramPacket dgram = new DatagramPacket(new byte[1024], 1024);
socket.receive(dgram);

Packet packet = Packet.fromBytes(dgram.getData());
System.out.println("Received sequence: " + packet.getSequenceNumber());
Throws IOException if the data length is invalid (not between MIN_LEN and MAX_LEN).

fromBuffer()

Creates a packet from a ByteBuffer.
buf
ByteBuffer
required
ByteBuffer containing packet data in BigEndian format
packet
Packet
Reconstructed packet object
ByteBuffer buffer = ByteBuffer.allocate(MAX_LEN)
    .order(ByteOrder.BIG_ENDIAN);
buffer.put(receivedData);
buffer.flip();

Packet packet = Packet.fromBuffer(buffer);

Byte Format

Packets are encoded in BigEndian byte order:
Byte Layout:
┌─────────────────────────────────────────────────────────┐
│ Type (1)  │ Seq (4)   │ IP (4)    │ Port (2) │ Payload  │
│  byte     │   int     │  4 bytes  │  short   │ 0-1024   │
└─────────────────────────────────────────────────────────┘
  0         1           5           9          11         MAX
All multi-byte fields use BigEndian (network byte order) encoding.

String Representation

toString()

Returns a human-readable string representation.
string
String
Formatted string with sequence number, peer address, port, and payload size
System.out.println(packet.toString());
// Output: #42 peer=192.168.1.100:8000, size=5

Packet Type Reference

Data (0)

Regular data packet containing payload

ACK (1)

Acknowledgment of received packet

SYN (2)

Connection initiation request

SYN-ACK (3)

Connection acknowledgment

NACK (4)

Negative acknowledgment

CLOSE (6)

Connection termination

Example Usage

Packet dataPacket = new Packet.Builder()
    .setType(0)
    .setSequenceNumber(1L)
    .setPeerAddress(InetAddress.getByName("127.0.0.1"))
    .setPortNumber(8000)
    .setPayload("Request data".getBytes())
    .create();

byte[] bytes = dataPacket.toBytes();

See Also

ReliableClientProtocol

Client-side protocol using packets

ServerTcpProtocl

Server-side protocol using packets

Build docs developers (and LLMs) love