Internet Protocol Version 4 (IPv4) เป็นหนึ่งใน Core Protocols ของมาตรฐาน Internetworking Methods ใน Internet และ Packet-Switched Networks อื่นๆ IPv4 ยังคงเป็น Internet Protocol ที่ปรับใช้กว้างที่สุด สถิติ IPv6 ของ Google แสดงว่า 44.29% ของ Traffic ไปยัง Google Services วันที่ 24 เมษายน 2025 เป็น IPv6 ซึ่งหมายความว่า 55.71% ยังคงเป็น IPv4
คู่มือนี้จะพาคุณผ่านทุกด้านของ IPv4 ตั้งแต่การเข้าใจ IP Addresses จนถึงการตรวจสอบ Packet Headers และ Fragmentation คุณจะได้เรียนรู้:
การทำงานของ IP Addresses และรูปแบบต่างๆ
Network Addressing Schemes จาก Fixed-Length ถึง CIDR
Special IPv4 Addresses และการใช้งาน
โครงสร้างและวัตถุประสงค์ของทุก Field ใน IPv4 Header
วิธีที่ IPv4 จัดการ Packet Fragmentation ข้าม Network ต่างๆ
ไม่ว่าคุณจะเป็น Network Engineer, Software Developer หรือ IT Professional การเข้าใจ IPv4 มีความสำคัญต่อการทำงานกับ Computer Networks สมัยใหม่
สิ่งที่เราจะครอบคลุม:
Background
Understanding IP Addresses
Network ID และ Host ID
วิธีกำหนด Network vs Host Portions
Fixed-Length Approach
ข้อเสียคืออะไร? 🤔
Classful Addressing
IP Address Assignment
ข้อเสียคืออะไร? 🤔
CIDR: Classless Interdomain Routing
- Real-world Example
Subnet Masks
Interim Summary – IPv4 Addresses
Test Yourself
Converting Between Prefix Notation และ Subnet Masks
Working Backwards with Subnet Masks
Non-Byte-Aligned Prefixes
Determining Network Membership
Special IPv4 Addresses
"This Host" Address: 0.0.0.0
"This Network" Addresses
Broadcast Addresses
Loopback Addresses: 127.0.0.0/8
Summary of Special IPv4 Addresses
IPv4 Header
The Header Structure
IPv4 Header – Interim Summary
IPv4 Fragmentation
Why Fragmentation Is Needed
How Fragmentation Works in IP
Identification Field
Fragment Offset
More Fragments และ Don't Fragment Flags
Fragmentation Example
IPv4 Fragmentation – Summary
Summary – IPv4
Addressing and Network Structure
IPv4 Header Structure
Fragmentation
Final Words
About the Author
Additional References
Quick Notes ก่อนเริ่ม
หาเนื้อหา Computer Networks เพิ่มเติมได้ที่ YouTube Channel: Computer Networks Playlist
ผมกำลังเขียนหนังสือเกี่ยว Computer Networks! สนใจอ่าน Early Versions และให้ Feedback? ส่งอีเมล: gitting.things@gmail.com
Background
IP ย่อมาจาก "Internet Protocol" ดังนั้น IPv4 คือ Internet Protocol Version 4 ถูกอธิบายใน RFC 791 โดย IETF เผยแพร่กันยายน 1981 และ Deploy ผลิตครั้งแรก 1982 บน SATNET (Atlantic Packet Satellite Network) ซึ่งเป็น Satellite Network เริ่มต้นที่เป็น Segment แรกของ Internet
IPv4 เป็น Connectionless และทำงานใน Best-Effort Delivery Model หมายถึงไม่รับประกัน Delivery, Correct Ordering ของ Packets หรือ Validity ของ Data มันออกแบบมาให้ Fast และ Flexible
Understanding IP Addresses
IP Addresses เป็น Hierarchical, Logical Addresses ที่ขับเคลื่อน Internet Connections ส่วนใหญ่วันนี้ แต่ละ Address ประกอบด้วย 4 Bytes หรือ 32 Bits เขียนใน Dotted Decimal Notation ปกติ เช่น:

ทดสอบตัวเอง – Address ต่อไปนี้เป็น Valid IP Address หรือไม่?

ไม่ใช่ เนื่องจาก Dots แยก Bytes ต่างๆ แต่ละค่าต้องอยู่ระหว่าง 0 และ 255 เนื่องจาก 392 มากกว่า 255 จึงไม่สามารถแทนใน Single Byte ได้

Network ID และ Host ID
IP Addresses มี 2 ส่วน: Network Identifier (Network ID) ที่เป็นของ Hosts ทั้งหมดใน Network และ Host Identifier (Host ID) ที่ระบุ Host เฉพาะใน Network นี้
Network Identifier จะเหมือนกันสำหรับ Hosts ทั้งหมดใน Network เรียกอีกอย่างว่า "Prefix" เช่น Network Identifier 201.22.3 Addresses ต่อไปนี้:
201.22.3.15
201.22.3.91
อยู่ใน Network เดียวกัน เพราะ Share Prefix เดียวกัน Address แรกเป็น Host #15 ใน Network นี้ และ Address ที่สองเป็น Host #91
Address นี้มี Prefix ต่างกัน จึงเป็น Network อื่น:
201.22.14.50
ในตัวอย่างข้างต้น Network Identifier 3 Bytes (24 Bits) และ Host Identifier 1 Byte (8 Bits)

วิธีกำหนด Network vs Host Portions
คำถามคือ: เราจะรู้ได้อย่างไรว่า Bits ไหนเป็น Network ID และ Bits ไหนเป็น Host ID? หลาย Approaches ได้วิวัฒนาการมาตอบสนองความท้าทายนี้
Fixed-Length Approach
พิจารณาวิธีนี้: สำหรับทุก IP Address Byte แรก (Most-Significant) คือ Network ID และ 3 Bytes ที่เหลือ (Least-Significant) คือ Host ID วิธีนี้อ่าน IP Addresses ได้ง่ายมาก เช่น Address:
20.12.1.92
คุณรู้ว่า Network 20 Host 12.1.92 ใน Network นั้น IP Address ใดๆ ที่ไม่เริ่มด้วย 20 เช่น 22.1.2.3 จะอยู่ Network อื่น และ IP Address ใดๆ ที่เริ่มด้วย 20 เช่น 20.1.2.3 จะอยู่ Network เดียวกัน

ข้อเสียคืออะไร? 🤔
ด้วยเพียง 1 Byte (8 Bits) สำหรับ Network ID คุณมีเพียง 2^8 หรือ 256 Networks ต่างๆ จริงๆ แล้วมี Networks มากกว่านั้นมาก แม้ในยุคแรกของ Internet มหาวิทยาลัยและบริษัทใหญ่แต่ละแห่งก็ต้องการ Network Identifiers ของตัวเอง
โดยทั่วไป การใช้ Fixed Length สำหรับ Network ID และ Host ID ไม่ยืดหยุ่นพอ หากตัดสินใจว่า 2 Most-Significant Bytes คือ Network ID และ 2 Least-Significant Bytes คือ Host ID คุณสามารถแทนได้สูงสุด 2^16 หรือ 65,536 Networks ซึ่งก็ไม่พอ อีกทั้งบาง Networks เช่น บริษัทใหญ่ อาจต้องการ Host IDs มากกว่า 65,536
Classful Addressing
โซลูชันอยู่ที่การให้ Flexibility พิจารณาอีก Approach หนึ่งชื่อ "Classful Addressing" ใน Approach นี้ จำนวน Bits สำหรับ Network ID เปลี่ยนไปจาก Address หนึ่งไปอีก Address และคุณสามารถบอก Network ID ได้โดยดูที่ Byte แรก (Most-Significant) ของ Address
Address ใดๆ เริ่มด้วยตัวเลขระหว่าง
1ถึง127属于 "Class A" หมายถึง Network ID 1 Byte เหลือ 3 Bytes สำหรับ Host IDAddress ใดๆ เริ่มด้วยตัวเลขระหว่าง
128ถึง191属于 "Class B" หมายถึง Network ID 2 Bytes และ Host ID 2 BytesAddress ใดๆ เริ่มด้วยตัวเลขระหว่าง
192ถึง223属于 "Class C" ดังนั้น Network ID 3 Bytes และ Host ID 1 Byte
เห็นการแทนค่าเต็มได้ในตารางด้านล่าง:
| Class | First Byte Range | Network ID Size | Host ID Size |
|---|---|---|---|
| A | 1 - 127 | 1 Byte | 3 Bytes |
| B | 128 - 191 | 2 Bytes | 2 Bytes |
| C | 192 - 223 | 3 Bytes | 1 Byte |
| D | 224 - 239 | (Multicast) | |
| E | 240 - 255 | (Reserved) |

ตัวอย่าง Address นี้เป็น Class ไหน?
(1) 130.12.204.5
เริ่มด้วย 130 อยู่ระหว่าง 128 และ 191 จึงเป็น "Class B" Network ID คือ 130.12 Host ID คือ 204.5 เรียกว่า "Address หมายเลข 1"
Address นี้และ Address ต่อไป (2) อยู่ Network เดียวกันไหม?
(2) 130.90.2.40
ไม่ใช่ เพราะ Network Identifiers ต่างกัน จึงไม่อยู่ Network เดียวกัน
Address ต่อไปนี้เป็น Class ไหน?
(3) 200.1.1.9
เป็น Class C เพราะ First Byte 200 อยู่ระหว่าง 192 และ 223 Network Identifier คือ 200.1.1 Address ใดๆ เริ่มต้น Prefix นี้จะอยู่ Network เดียวกัน Address นี้คือ Host 9 ใน Network นี้
Address เริ่มต้น 224 - 239 เป็น "Class D" — Multicast Addresses Address เริ่มต้น 240 - 255 Reserved สำหรับอนาคต Address เริ่มต้น 0 เป็น Special Addresses
IP Address Assignment
ใน Internet ยุคแรก IPv4 Addresses ถูกมอบหมายให้องค์กรโดย IANA (Internet Assigned Numbers Authority) เมื่อ Internet โตขึ้น หน้าที่นี้กระจายไป 5 Regional Internet Registries (RIRs) ที่จัดสรร Address ตามภูมิภาค องค์กรใหญ่ได้รับ Blocks ของ Addresses ตามความต้องการ โดย Address Classes กำหนดขนาด Blocks
ข้อเสียคืออะไร? 🤔
แม้ Classful Addressing ให้ Flexibility มากกว่า Fixed-Length แต่ยังไม่พอ
สถานการณ์: Startup เล็ก 2 Founders ต้องการ Network Identifier ต้องการ Class ไหน?
Class A หรือ B จะมากเกินไป อาจได้ Class C — ให้ 256 Addresses มากกว่าที่ต้องการตอนนี้ แต่ยอมให้ขยายได้ ถ้า Startup โตเกิน 256 พนักงาน (และอุปกรณ์)?
จุดนี้ต้องได้ Class B Address ให้ไม่ต่ำกว่า 65,536 Addresses เมื่อต้องการแค่เกิน 256 นิดหน่อย หมายถึง Waste มากกว่า 60,000 Addresses
นี่กลายเป็นปัญหาจริงในต้นทศวรรษ 1990s เมื่อ Internet โตเร็ว ความต้องการ IP Addresses เพิ่มขึ้น และ IPv4 Address Space ใกล้จะหมด กรณีที่ Waste 60,000 Addresses ไม่ทนทานได้อีกต่อไป
CIDR: Classless Interdomain Routing
มาตรการหนึ่งจัดการขาดแคลน Addresses คือทิ้ง Classful Addressing ในปี 1993 และเปลี่ยนไป CIDR – Classless Interdomain Routing Approach นี้ยังใช้อยู่จนถึงปัจจุบัน
CIDR ให้ Flexibility เลือก Network ID และ Host ID ให้ Network Admins สร้าง Subnets ขนาดพอดี ไม่จำกัด Classes A, B, C
เริ่มตัวอย่างง่าย ใน CIDR Notation เราเพิ่ม Suffix บอกว่าใช้กี่ Bits สำหรับ Network Portion:
(4) 200.8.3.1/16
Slash Notation ระบุว่ากี่ Bits ใช้สำหรับ Network ID ในตัวอย่าง (4) 16 Bits แรก (2 Bytes) ใช้ Network ID ดังนั้น 200.8 คือ Network Identifier และ 3.1 คือ Host Identifier ข้อเท็จจริงที่ 200.8 เป็น Network ID หมายถึง Addresses ทั้งหมดจาก 200.8.0.0 ถึง 200.8.255.255 อยู่ใน Network นี้

พิจารณา Addresses เพิ่มเติม:
(5) 200.2.13.5
(6) 200.8.21.6
ด้วย Prefix 16 Bits (2 Bytes) Address ไหนอยู่ Network เดียวกับ (4) (200.8.3.1/16)?
Address (5) (200.2.13.5) ไม่อยู่ Network นี้ เพราะ 16 Bits แรก 200.2 ต่างจาก 16 Bits แรกของ Example Address
Address (6) (200.8.21.6) อยู่ Network เดียวกับ Example Address

Real-world Example
ในทางปฏิบัติ ISP อาจได้ Block ใหญ่อย่าง 104.16.0.0/12 จาก RIR ให้ควบคุม Addresses ทั้งหมดจาก 104.16.0.0 ถึง 104.31.255.255 ISP แล้วจัดสรร Subnets เล็กให้ลูกค้า เช่น ธุรกิจเล็กได้ /24 Subnet 256 Addresses หรือบริษัทใหญ่ได้ /20 Subnet 4,096 Addresses
Subnet Masks
อีกวิธีแสดง Network Prefix คือ Subnet Mask เช่น:
255.255.0.0
แปลงเป็น Binary 255 Decimal = 8 1s Binary ทุก Bits On แปลง Mask เป็น Binary ได้:
11111111 11111111 00000000 00000000
คือ 16 Bits On = Network Prefix 16 Bits ทั้ง CIDR Notation และ Subnet Masks ใช้บ่อยมาก

ด้วย CIDR Address เดียวกันอาจอยู่ Network ต่างกันได้ ถ้า Prefix หรือ Subnet Masks ต่างกัน หาก Example Address เดียวกันแต่ Prefix 8 Bits Addresses เพิ่มเติมทั้งสองจะอยู่ Network เดียวกัน เพราะ Share First 8 Bits คือ 200
Network Prefix 8 Bits เป็น Subnet Mask ยังไง? ต้องการ First 8 Bits On = 255 Decimal Bits ที่เหลือ Off ได้ Subnet Mask:
255.0.0.0

ถ้า Network Prefix 24 Bits? ก่อนอื่นเป็น Subnet Mask ยังไง? ต้องการ 24 Bits On = 3 ครั้ง 8 Bits On ได้:
255.255.255.0

ตอนนี้ Addresses เพิ่มเติมทั้งคู่ไม่อยู่ Network เดียวกับ Example Address เพราะไม่ Share Network ID 200.8.3

Network Prefixes ไม่ต้องเป็น Full Bytes เช่น 12, 11, หรือ 22 Bits เมื่อ Prefix Length ไม่ใช่ Multiple ของ 8 Subnet Mask จะมีค่าไม่ใช่ 0 หรือ 255 ในตำแหน่งหนึ่ง
นี่แก้ปัญหา Startup ถ้า Startup มี 300 พนักงาน ต้องการ 23-bits Network ID เหลือ 9 Bits สำหรับ Hosts = 2^9 = 512 Addresses ควรเพียงพอ
Interim Summary – IPv4 Addresses
ใน Section นี้ คุณเรียนรู้ IPv4 Addresses IP Addresses เป็น Hierarchical, Logical Addresses 4 Bytes มี 2 ส่วน: Network Identifier สำหรับ Hosts ทั้งหมดใน Network และ Host Identifier ระบุ Host เฉพาะ
คุณสำรวจตัวเลือกต่างๆ สำหรับ Network ID และ Host ID:
Fixed-length approach – แข็งเกินไปและจำกัด
Classful addressing – ดีกว่าแต่ยัง Waste
CIDR (Classless Interdomain Routing) – ยืดหยุ่นและมีประสิทธิภาพ
CIDR ให้ Flexibility มากกว่ามาก และช่วยแก้ปัญหาขาดแคลน IPv4 Addresses อย่างมีนัยสำคัญ อย่างไรก็ตาม CIDR เป็นเพียงส่วนหนึ่งของการแก้ปัญหาขาด IPv4 Addresses โซลูชันอื่นๆ รวม NAT (Network Address Translation) และในที่สุด IPv6
Section ถัดไปจะสำรวจ Special IPv4 Addresses และตรวจสอบ IPv4 Packet Header
Test Yourself
ฝึก Concepts ที่เรียนรู้ ให้แน่ใจว่ารู้สึกสบายใจกับมัน
ลองตอบคำถามต่อไปนี้ก่อนเช็คคำตอบ
Converting Between Prefix Notation และ Subnet Masks
Network Prefix 16 Bits เขียน /16 แทนเป็น Subnet Mask ยังไง?
ต้องการ 16 Bits On 8 Bits On = 255 Decimal ดังนั้นใช้:
255.255.0.0

ด้วย Network Prefix นี้ Addresses นี้อยู่ Network เดียวกันไหม?

ใช่ เพราะ Share Same Most-Significant 16 Bits (2 Bytes)

Address นี้อยู่ Network เดียวกับ Addresses ก่อนหน้าไหม?

ใช่ อีกครั้ง Share Same Two Most-Significant Bytes

Address นี้ล่ะ? อยู่ Network เดียวกันไหม?

ไม่ เพราะ First Two Bytes ไม่ใช่ 42.31 — Network ต่างกัน Address นี้คือ Host 1.2 ใน Network 42.32

Working Backwards with Subnet Masks
ลองย้อนกลับ Subnet Mask นี้:
255.255.255.0
แสดงเป็น Network Prefix ยังไง?
มี 255 3 ครั้ง = 3 × 8 Bits On = 24 Bits On รวม เขียน /24 ได้ หมายถึง 3 Bytes

ด้วย Subnet Mask นี้ Addresses (1) และ (3) อยู่ Network เดียวกันไหม?

ใช่ ทั้งคู่มี Same Most-Significant 3 Bytes — Network 42.31.93

Addresses (1) และ (2) ล่ะ?

ด้วย Network Prefix นี้ ไม่อยู่ Network เดียวกัน Address แรก Network 42.31.93 Address ที่สอง Network 42.31.1

Non-Byte-Aligned Prefixes
Network Prefixes ไม่ต้อง Align ที่ 8 Bits หรือ Full Bytes สมมติ Network Prefix 14 Bits แปลงเป็น Subnet Mask ยังไง?
Byte แรกชัดเจน: 8 Bits On = Byte แรก 255 Byte ถัดไป?
ใน Binary ต้องการ 6 Additional 1s แล้ว 2 0s ใน Binary เขียน:
11111100
แปลง Decimal Binary นี้ = 252 Subnet Mask คือ:
255.252.0.0
วิธีแปลงอีกอย่าง: 8 1s Binary = 255 Decimal 11 Binary = 3 ลบ 3 จาก 255 ได้ 252

ลองย้อนกลับ Subnet Mask นี้:
255.255.224.0
Network Prefix กี่ Bits?
2 Bytes แรกชัดเจน: 16 Bits แปลง Byte ที่ 3 Binary: 224 Decimal = 11100000 Binary มี 3 Additional 1s เขียน Subnet Mask ด้านบนเป็น Prefix /19 Bits — 16 Bits สำหรับ 2 Bytes 255 และ 3 Additional Bits สำหรับ Byte 224

Determining Network Membership
พิจารณา Addresses:

อยู่ Network เดียวกันไหม? 🤔
ขึ้นอยู่กับ Subnet Mask
ถ้า Network Prefix /8 อยู่ Network เดียวกัน เพราะ Share Same Network ID

แต่ถ้า Network Prefix /16 Network IDs ต่างกัน ไม่อยู่ Network เดียวกัน แต่ Prefixes ระหว่างนั้นล่ะ? จะอยู่ Network เดียวกันสำหรับ Prefix /9? /14?
วิธีแก้: แปลง Byte ที่ 2 ของ Addresses เป็น Binary Address แรก Byte ที่ 2 คือ 24 Binary:
00011000
Address ที่สอง Byte ที่ 2 คือ 23 Binary:
00010111

เห็นว่า Most Significant 4 Bits ใน Byte ที่ 2 เหมือนกัน เพิ่ม First 8 Bits ของ Address Most Significant 12 Bits ของ Addresses เหล่านี้เหมือนกัน
ถ้า Network Prefix /11 อยู่ Network เดียวกันไหม?
ใช่ Most Significant 11 Bits เหมือนกัน
/13 ล่ะ?
ไม่ ด้วย Prefix นี้ ไม่ Share Same Network Identifier เพราะ 13th Bit ต่างกัน
การฝึกนี้ควรช่วยให้สบายใจกับ Subnet Masks และ Network Prefixes Section ถัดไปจะเรียน Special IP Addresses และตรวจสอบ IP Packet Header
Special IPv4 Addresses
ตอนนี้คุณคล่องกับ IP Addresses และ Subnet Masks แล้ว มาสำรวจ IP Addresses ที่มีความหมายพิเศษ
"This Host" Address: 0.0.0.0
Address 0.0.0.0 หมายถึง "This Host" ใช้ใน 2 สถานการณ์:
First: เมื่อ Machine Boot Up และยังไม่มี IP Address IP Addresses เป็น Logical Addresses ต้อง Assign ให้ Machine ก่อน Assignment อุปกรณ์ไม่มี IP Address เลย หากอุปกรณ์ต้อง Communicate ในขั้นนี้ อาจใช้ Special Address นี้ 0.0.0.0
Second: เขียน Network Applications ที่ต้อง Listen Incoming Connections บน Network Interfaces ทั้งหมด เช่น Machine มี 2 Interfaces — หนึ่ง IP 1.1.1.1 อีกอัน 2.2.2.2 Listen บน 0.0.0.0 หมายถึงยอมรับ Connections ไม่สนว่า Network Interface ไหน Receive
"This Network" Addresses
Special Addresses อีกประเภทคือ Addresses เริ่มต้นด้วย Zeros โดย Zeros หมายถึง "This Network"
เช่น Machine Address:
12.34.55.55
Network Prefix 16 Bits Machine นี้ส่ง Packet ไปอีก Device บน Network ด้วย Full Address เช่น 12.34.66.66 หรือใช้ Special Zeros Notation ส่งไป:
0.0.66.66
หมายถึง "ส่ง Packet ไป Host 66.66 บน This Network" Recipient ต้องรู้ Network Prefix ที่เกี่ยวข้องเพื่อ Interpret Address นี้ถูกต้อง
Broadcast Addresses
Address 255.255.255.255 ทุก Bits = 1 คือ Address ของ Hosts ทั้งหมดใน Local Network — Broadcast Address คล้าย Broadcast Address ใน Ethernet (FF:FF:FF:FF:FF:FF) ทั้งคู่ All Bits = 1
ใช้ Proper Network Identifier ที่ Host Identifier All 1s ส่ง Broadcast Packet ไป Remote Networks ได้ เช่น Network 12.34.0.0/16 และ Network อีกอัน Network ID 12.35.0.0/16 Machine ที่ 12.34.55.55 ส่ง Packet ไปทุก Device ใน Network อีกอัน ใช้ Destination Address: 12.35.255.255
แม้ RFC อนุญาต แต่ในทางปฏิบัติ Feature นี้มัก Disable เพราะสร้าง Security Vulnerabilities
Loopback Addresses: 127.0.0.0/8
Addresses ทั้งหมดใน Network 127.0.0.0/8 (เริ่มต้น 127) เป็น Loopback Addresses Packets ส่งไป Addresses ใดๆ ในนี้ ไม่ถูกวางบน Physical Network แต่ Process Locally ภายใน OS มีประโยชน์มากสำหรับ Development และ Debugging
ตัวอย่าง: พัฒนา Chat Program 簡単 ต้องการ 2 Clients แลกเปลี่ยน Data วิธีหนึ่งใช้ 2 Physical Computers แต่ลำบาก — เขียนข้อความบนคอมพิวเตอร์หนึ่ง เช็คอีกเครื่องว่ารับได้ แล้วเขียนบนเครื่องสอง กลับไปเครื่องแรก Validate
วิธีง่ายกว่า: ใช้ Loopback Address ทั้ง 2 Clients รันบน Machine เดียวกัน เชื่อมต่อกันได้ รัน 2 Client Programs บน Physical Computer เดียวกัน แลกข้อความระหว่างกันโดยไม่ต้องการเครื่องเพิ่ม
เช่น ใช้ Address 127.0.0.1 Client หนึ่ง Listen Port 1337 อีกอัน Port 1338 Client A ส่ง Packet ไป Client B Packet นี้ไม่เคยออก Network Card แต่อยู่ภายใน OS Client B รับ Packet จาก Loopback Interface กับมั่นได้เหมือนรับจาก Physical Network
หลัง Debug เสร็จ Client Code ไม่ต้องเปลี่ยน — แค่ต่างกันที่ Communicate ด้วย Real IP Addresses แทน Loopback Address

Summary of Special IPv4 Addresses
สรุป Special IPv4 Addresses ที่เรียนรู้:
| Special Address | Meaning | Usage |
|---|---|---|
0.0.0.0 | "This host" | ใช้ระหว่าง Boot หรือ Listen บน All Interfaces |
Addresses เริ่มต้น 0 | "This network" | ส่งไป Hosts บน Local Network |
255.255.255.255 | Broadcast | ส่งไปทุก Hosts บน Local Network |
| Network ID กับ All 1s ใน Host Part | Directed Broadcast | ส่งไปทุก Hosts บน Network เฉพาะ |
127.0.0.0/8 | Loopback | Testing/Debugging โดยไม่ใช้ Physical Network |
Section ถัดไปจะเรียน IPv4 Header Structure
ตอนนี้คุณเข้าใจ IP Addresses, Subnets และ Special Addresses แล้ว มาสำรวจ IPv4 Header Structure อย่างละเอียด

Diagram ข้างบนแสดง IPv4 Header ตาม RFC 791 มาตรวจสอบแต่ละ Field:
Version (4 Bits)

Header เริ่มด้วย Version Field 4 Bits สำหรับ IPv4 Packet Version คือ 4 Field นี้จะมีค่า 4 เสมอ (หรือ 0100 Binary)
❓ ทำไม Header เริ่มด้วย Version Field? 🤔
(Note — เริ่มประโยคด้วย ❓ = คำถามถามคุณ ลองตอบก่อนอ่านต่อ)
เพราะ Fields ที่เหลืออาจต่างกันตาม Version หาก Network Device อ่าน IP Packet และ Version Field = 4 มันคาดหวังว่า Packet เหลือจะ Follow IPv4 Structure หากค่าอื่น เช่น 6 Fields เหลือจะต่างไป ตาม IPv6

Field นี้บอกความยาวของ Header เอง
❓ ทำไมต้องระบุความยาว? 🤔
ต่างจาก Ethernet ที่ Header Size Fixed IPv4 Header Length อาจแตกต่างเพราะ Optional Fields ถ้า IP Packet ไม่มี Special Options Header ประกอบ 20 Bytes กรณีทั่วไปสุด
IHL Field ไม่ระบุความยาวเป็น Bytes โดยตรง แต่เป็น Units ของ 4-Byte Words ระบุ 20 Bytes ค่า = 5 (5 × 4 = 20) Encoding นี้ให้ Field ใช้ 4 Bits ระบุ Header Lengths ถึง 60 Bytes (เมื่อ IHL = 15)
IPv4 Packet ทั่วไปเริ่มต้น Byte 0x45 Hexadecimal หมายถึง Version 4 และ Header 20 Bytes
Type of Service (TOS) (8 Bits)

แนวคิดคือไม่ใช่ทุก Packets สำคัญเท่ากัน อาจต้องการ Priority บาง Packets มากกว่า
เช่น Packets ข้อมูล Real-time (Voice/Video Conferencing) Time-Sensitive มากกว่า Packets Email/File Downloads หาก Router High Load ควร Prioritize Time-Sensitive Packets
TOS Field ให้ Sender บอก Priority ของ Packets แต่บน Public Internet Field นี้มักถูก Routers Ignore เพราะ Sender ใดๆ ก็ Set Priority Value ใดๆ ได้ ในส่วนใหญ่ Field นี้ = 0
Total Length (16 Bits)

Field นี้ระบุ Total Length ของ IP Packet รวม Header และ Payload (Data)
❓ ทำไมต้องระบุความยาว? 🤔
น่าเสียดาย IP Layer ไม่จำเป็นต้องรู้ว่า Bytes บางส่วนใน Packet เป็น Padding ของ Layer 2 ผมอธิบายรายละเอียดใน Post ก่อนหน้า แสดงว่าใน Ethernet Protocol บางกรณี Receiving Ethernet Entity ไม่บอกได้ว่า Bytes ไหนเป็น Payload และ Bytes ไหนเป็น Padding เพียงอย่างเดียว IP Layer ต้องรู้ Bytes ไหนเป็น Actual Packet อย่างแม่นยำ จึงมี Total Length Field
❓ ขนาดสูงสุดของ IPv4 Packet คือเท่าไหร่? 🤔
Field นี้ 16 Bits IPv4 Packet อาจมี Max 2^16-1 Bytes = 65,535 Bytes รวม Header Minimum Size 20 Bytes แค่ Header โดยไม่มี Options หรือ Payload
Fragmentation Fields (32 Bits)

4 Bytes ถัดไป Dedicated สำหรับ Fragmentation Control จะครอบคลุมใน Section แยก เพราะ Topic ซับซ้อนสมควรได้ความสนใจพิเศษ
Time to Live (8 Bits)

แม้ชื่อว่า Time to Live แต่ Field นี้จริงๆ ไม่ได้วัดเวลา แต่วัด Maximum Number ของ Routing Hops ที่ Packet สามารถผ่านได้ก่อนถูก Discard
เข้าใจวัตถุประสงค์ พิจารณาสถานการณ์: Machine A ส่ง Packet ไป Machine B ผ่าน Routers หลายตัว แต่มี Routing Loop Router 2 ส่ง Router 3 ส่ง Router 4 ส่งกลับ Router 2 Packet อาจหมุนวนตลอดกาล ใช้ Bandwidth และไม่ถึง Destination

TTL Field ป้องกันนี้โดยตั้ง Limit Hops:
Sender ตั้ง Initial TTL Value (มัก
64หรือ128)Router แต่ละตัวที่ Handle Packet Decrement TTL ลง
1ถ้า Router รับ Packet TTL =
1Decrement เป็น0และ Discard PacketRouter ส่ง ICMP "Time Exceeded" กลับ Sender ต้นทาง
ไม่แก้ Root Cause ของ Routing Loops แต่ป้องกัน Packets หมุนวนตลอดกาล
ใน IPv6 Field นี้改名 "Hop Limit" ซึ่งอธิบาย Function ได้แม่นยำกว่า
Protocol (8 Bits)

Field นี้อธิบาย Payload ของ IPv4 Packet เช่น:
ค่า
6= Payload เป็น TCPค่า
17= Payload เป็น UDP
ช่วย Receiving System รู้ว่า Protocol Handler ไหนควร Process Packet Contents คล้าย Type Field ใน Ethernet ระบุ Protocol ของ Layer ที่ Encapsulated ใน Ethernet Frame
Header Checksum (16 Bits)

16-bit Checksum ใช้ Verify Validity ของ Header เท่านั้น (Exclude Payload) Sender คำนวณค่าจาก Header Fields Receiver คำนวณเช่นกัน Validate ว่า Header Received ถูกต้อง
❓ Checksum ต้อง Recalculate ทุก Router ทำไม? 🤔
เพราะ TTL Field เปลี่ยนทุก Hop เช่น Packet เริ่ม TTL = 7 Router แต่ละตัวจะ:
Verify Current Checksum ตาม TTL =
7Decrement TTL เป็น
6Calculate New Checksum ตาม TTL =
6Forward Packet ด้วย New Checksum
ถ้า Checksum Verification Fail Device Drop Packet ป้องกัน Packets ที่ Header Corrupt (อาจมี Destination Address ผิด) ถูก Forward
Source และ Destination Addresses (32 Bits แต่ละอัน)

Fields นี้มี Source และ Destination IPv4 Addresses ตามลำดับ แต่ละอัน 4 Bytes (32 Bits) ตามที่เรียนใน Sections IPv4 Addressing
Options (Variable Length)

IPv4 Packets ส่วนใหญ่ไม่มี Options แต่เมื่อมี สามารถให้ Additional Functionality:
Record Route: Router แต่ละตัวที่ Handle Packet เพิ่ม Address ของตัวเองใน Option นี้ สร้าง Trace ของ Packet Path
Source Routing: ให้ Sender ระบุ Route ที่ Packet ควรใช้:
Strict Source Routing: Route ทั้งหมดต้อง Follow อย่างเคร่งครัด
Loose Source Routing: ต้องผ่าน Routers บางตัว แต่ Path ระหว่างพวกเขา Flexible
Padding
บางกรณี Header จบด้วย Padding Bytes (มัก 0s)
❓ ทำไม IPv4 Header มี Padding? 🤔
เหมือนอธิบาย IHL Field ระบุ Header Length ใน 4-Byte Units ดังนั้น Total Header Length ต้องเป็น Multiple ของ 4 Bytes หาก Options ทำให้ Header Length ไม่หาร 4 ลงตัว Padding Bytes (มัก 0) เพิ่มเข้ามาเพื่อถึง Multiple ของ 4 ถัดไป
เช่น 3 Bytes Options ต้องการ 1 Byte Padding ทำให้ Total Header Length เป็น Multiple ของ 4 Bytes
คุณเรียนรู้ IPv4 Header Structure แล้ว ยกเว้น Fragmentation Fields จะครอบใน Section ถัดไป
IPv4 Header บรรจุ Routing และ Control Information ทั้งหมดที่จำเป็นในโครงสร้างกะทัดรัด ปกติ 20 Bytes (ไม่มี Options) Design นี้ทำให้ Routers Process ได้เร็ว พร้อม Flexibility สำหรับ Internet Communication น่าประหลาดใจว่า IPv4 ยังคงโดดเด่นมาก หลายทศวรรษหลังเผยแพร่
Section ถัดไปจะเรียน IPv4 Fragmentation
IPv4 Fragmentation
Section ก่อนเรียน IPv4 Header Structure ส่วนใหญ่ ยกเว้น 32 Bits สำหรับ Fragmentation Topic นี้สมควรได้ความสนใจพิเศษ เพราะเผยโปรงด้านสำคัญของ IP Packets การเดินทางข้าม Networks ต่างๆ

Why Fragmentation Is Needed
เข้าใจ Fragmentation คืออะไร และต้องการเพราะอะไร พิจารณา Network Scenario:

Diagram นี้มี 2 Networks ต่างๆ Machine A อยู่ Network หนึ่ง Machine B อีก Network Router Forward Packets ระหว่าง 2 Networks นี้
2 Networks นี้มี MTUs (Maximum Transmission Units) ต่างกัน MTU = Maximum Size ของ Frame ที่ Transmit ได้ใน Network เช่น:
Machine B เชื่อมต่อ Ethernet Network MTU
1500BytesMachine A เชื่อมต่อ Network อื่น MTU
2000Bytes
MTUs ต่างกันมาจาก Protocols และ Hardware ต่างๆ ของ Networks ต่างๆ Ethernet MTU 1500 Bytes ขนาด Max นี้เลือกเพราะ RAM แพงตอนปลาย 1970s วางแผน Ethernet Receiver ต้องการ RAM มากขึ้นถ้า Frame ใหญ่กว่า Networks อื่นๆ ถูกคิดค้นช่วงเวลาที่ราคา RAM ต่ำกว่า หรือมี Considerations อื่นๆ ส่งผลต่อ MTU
พิจารณา: Machine A ส่ง Packet ไป Machine B Packet ยาว 1800 Bytes จากมุมมอง A ไม่มีปัญหา Network รองรับ Size นี้ A Transmit Packet
Router รับ Packet เผชิญปัญหา: ไม่สามารถ Forward Packet ไป Network ของ B ได้ เพราะ Packet ใหญ่เกิน MTU ของ Network Router ต้อง Fragment Packet — แยกเป็น Chunks เล็กกว่า ≤ 1500 Bytes ซึ่งจะ Reassemble โดย Machine B
How Fragmentation Works in IP
Router ต้องการ IP Packet 1800 Bytes แยกเป็น 2 Fragments แต่ละอัน ≤ 1500 Bytes หาก Machine A ส่ง Packet 1800 Bytes อีก Router แยกอีกครั้ง — ได้ 4 Fragments ต่างกัน Reassemble เป็น 2 Packets แยกกัน

Machine B รับ Fragments ต้องมั่นใจว่า Reassemble Fragment #1 กับ #2 ของ Packet A และ Fragment #1 กับ #2 ของ Packet B — ไม่ใช่ Fragment #1 ของ Packet A กับ Fragment #2 ของ Packet B ต้อง Reassemble เรียงลำดับถูกต้อง — Structure Packet เป็น #1#2 ไม่ใช่ #2#1

Identification Field
Focus ก่อน: ให้ Machine B Reassemble Fragments ของ Packet เดียวกัน (เช่น Fragment #1 และ #2 ของ Packet A แทน Fragment #1 ของ A และ Fragment #2 ของ B) ทำได้ด้วย Identification Field ของ IPv4 Fragments ของ Packet เดียวกันจะมี Identification Value เดียวกัน เช่น Fragments ทั้ง 2 ของ Packet A อาจมี Identification = 100 และ Fragments ทั้ง 2 ของ Packet B มี Identification = 200

สำคัญ: Sharing Identification Values เพียงอย่างเดียวไม่พอสำหรับ Fragments ที่จะเป็น Packet เดียวกัน Fragments ของ Packet เดียวกันต้อง Share อีก:
Same Source IP Address
Same Destination IP Address
Same Protocol Value (ระบุว่า Payload เป็น TCP, UDP, ฯลฯ)
Fragment Offset
IP เป็น Connectionless Protocol ไม่รับประกัน Fragments จะถึง Machine B เรียงลำดับถูกต้อง Fragment #2 ของ Packet A อาจถึงก่อน Fragment #1 จัดการ Issue นี้ แต่ละ Fragment มี Offset Field บอก Offset จากต้นทางของ Original Packet
Offset Field 13 Bits = ค่า 0 ถึง 8191 (2^13-1) ปัญหา: Max IP Packet Size 65,535 Bytes (Total Length Field 16 Bits)
แก้ไข: ค่าใน Offset Field คูณ 8 (2^3) หมายถึง Minimum Fragment Size 8 Bytes ยกเว้น Last Fragment
❓ ทำไม IP Packets ใช้ Offset เป็น Bytes หาร 8 แทน Fragment Number ตามลำดับ? 🤔
Sequence Numbers อาจดูง่าย แต่สร้างปัญหาเมื่อ Packets ต้อง Fragment หลายครั้ง
เช่น Computer A ส่ง Packet ไป Router แรก Fragment เป็น 1480 และ 320 Bytes ส่งไป Router ที่สอง ต้อง Fragment อีกเป็นชิ้นเล็กกว่า จะ Number ยังไง?
Byte Offsets โซลูชันตรงไปตรงมา — Fragment แรก Offset 0 ถัดไป 1480 หากแยกเป็น Max 800-Byte Fragments จะได้:
Fragment แรก:
800Bytes Offset0Fragment ที่สอง:
680Bytes Offset800Fragment ที่สาม:
320Bytes Offset1480
More Fragments และ Don't Fragment Flags
Machine B รับ Fragment ต้องรู้ว่าเป็น Entire Packet เอง หรือคาดหวัง Fragments เพิ่ม เพื่อนี้ แต่ละ IP Fragment มี More Fragments (MF) Bit = 1 สำหรับทุก Fragment ที่ไม่ใช่ Last Fragment ของ Packet สำหรับ Last Fragment = 0
กรณี Packet เป็น Single Fragment — MF Bit = 0 และ Offset Field = 0 (13 Bits ของ 0s)
Bit อีกตัวเกี่ยว Fragmentation คือ Don't Fragment (DF) Bit เมื่อ Flag เปิด Intermediate Devices ควรไม่ Fragment Original Packet แม้เกิน MTU ควร Drop และมักส่ง ICMP "Fragmentation Needed" กลับ Source
ใน Example หาก Machine A Set DF Bit = 1 Router จะ Drop Packet และ Notify Machine A
สังเกต: หลัง Identification Field ก่อน DF Flag มี Reserved Bit = 0 Reserved ไว้กรณีต้องการในอนาคต เหตุผลไม่ทราบโดย Original Authors ของ IPv4
Fragmentation Example
Example เดิม — Machine A Network MTU 2000 Machine B Network MTU 1500 Machine A ส่ง Packet 1800 Bytes
❓ คุณกรอกค่าใน Tables นี้ได้ไหม?
First Fragment:
| Total Length | Identification | Don't Fragment | More Fragments | Offset |
|---|
Second Fragment:
| Total Length | Identification | Don't Fragment | More Fragments | Offset |
|---|
สำหรับ Example ข้างต้น ค่า Fragmentation Fields ใน IP จะเป็น:
First Fragment:
Total Length:
1500(รวม20Bytes IP Header =1480Bytes Payload)Identification:
1337(ค่า Arbitrary)Don't Fragment Bit:
0(Off อนุญาต Fragment เพิ่มได้)More Fragments Bit:
1(On ไม่ใช่ Last Fragment)Offset:
0(Fragment แรก)
Second Fragment:
Total Length:
340(รวม20Bytes IP Header =320Bytes Payload — รวม Fragment แรกได้1800Bytes Payload)Identification:
1337(Same as First Fragment แสดงว่าเป็นคู่)Don't Fragment Bit:
0(Off อนุญาต Fragment เพิ่มได้)More Fragments Bit:
0(Off เป็น Last Fragment)Offset:
185(1480/8 = 185 หรือ0xB9Hex)
IPv4 Fragmentation – Summary
คุณเรียนรู้ส่วนสุดท้ายของ IPv4 Header: Fragmentation Fragmentation จำเป็นเพื่อให้ IPv4 Packets เดินทางข้าม Networks ที่ MTUs ต่างกัน IPv4 Header มี Fields เฉพาะสำหรับ Fragmentation:
Identification (16 Bits): ระบุ Fragments ไหนเป็นคู่กัน
Flags (3 Bits): รวม "More Fragments" และ "Don't Fragment" Flags
Fragment Offset (13 Bits): บอกว่า Fragment นี้อยู่ที่ไหนใน Original Packet
ด้วยความรู้นี้ คุณเข้าใจทุก Bit และ Byte ของ IPv4 Header และ IP Packets เดินทางข้าม Networks ที่มี Characteristics ต่างๆ ได้อย่างไร
Summary – IPv4
ในคู่มือ IPv4 ครบวงจรนี้ คุณเรียนรู้ Fundamental Building Blocks ของ Internet Communications สรุป Key Concepts:
Addressing and Network Structure
IPv4 Addresses = 32-bit Numbers เขียน Dotted Decimal Notation ปกติ
Networks ระบุได้หลายวิธี:
Fixed-length approach (Historically)
Classful addressing (Classes A, B, C, D, E)
CIDR (Modern Approach อนุญาต Network Sizes ยืดหยุ่น)
Special Addresses เป้าหมายเฉพาะ:
0.0.0.0สำหรับ "This Host"127.0.0.0/8สำหรับ Loopback255.255.255.255สำหรับ Broadcast
Header มี Fields สำคัญสำหรับ Packet Routing และ Processing:
Version และ IHL สำหรับ Header Interpretation
Type of Service สำหรับ Traffic Prioritization
Total Length สำหรับ Packet Size
Fields ต่างๆ สำหรับ Fragmentation Control
TTL ป้องกัน Infinite Routing Loops
Protocol ระบุ Encapsulated Protocol
Checksum สำหรับ Error Detection
Source และ Destination Addresses
Fragmentation
อนุญาต IPv4 Packets เดินทางข้าม Networks ที่ MTUs ต่างกัน
ใช้ 3 Key Fields:
Identification จับคู่ Fragments
Flags ควบคุม Fragmentation
Fragment Offset Reassemble Packets
Final Words
แม้ IPv4 มี Limitations โดยเฉพาะ Address Space Constraints แต่ Design ที่ขำลึกและ Features ที่แข็งแกร่งทำให้มันยังคงเป็น Backbone ของ Internet มากว่า 4 ทศวรรษ การเข้าใจ IPv4 ให้ Context สำคัญสำหรับทำงานกับ Modern Networks และช่วย Transition ไป Protocols ใหม่อย่าง IPv6
About the Author
Omer Rosenbaum เป็น CTO ของ Swimm เขาเป็น Author ของ Brief YouTube Channel ยังเป็น Cyber Training Expert และ Founder ของ Checkpoint Security Academy เขาเขียน Gitting Things Done (ภาษาอังกฤษ) และ Computer Networks (ภาษาฮีบรู) หาเขาได้ที่ Twitter
Additional References
- Computer Networks Playlist - บน Brief Channel
เรียนรู้เขียนโค้ดฟรี หลักสูตรโอเพนซอร์สของ freeCodeCamp ช่วยให้ผู้คนมากกว่า 40,000 คนได้งานเป็นนักพัฒนา เริ่มต้นได้เลย