Vì Ethernet sử dụng địa chỉ MAC để liên lạc, tôi có thể tạo một mạng Ethernet trong đó các thiết bị sẽ không có địa chỉ IP, chỉ là địa chỉ MAC không?
Nếu bạn đã viết tất cả phần mềm của riêng bạn từ đầu, thì bạn chắc chắn có thể làm điều này. Chỉ cần phần mềm chấp nhận địa chỉ MAC ở bất cứ nơi nào mà đối tác bình thường của chương trình đó sẽ chấp nhận địa chỉ IP. Sử dụng tất cả các cuộc gọi hệ thống để gửi các gói ethernet thô thay vì địa chỉ IP và nó sẽ hoạt động - nhưng nó sẽ là một rắc rối lớn.
Nói chung, địa chỉ MAC trên mạng của bạn không theo bất kỳ mẫu nào. Chúng được đốt vào phần cứng bởi nhà sản xuất. Chúng dài và cồng kềnh. Của tôi ngay bây giờ là C8-60-00-CA-4B-9A. Máy tính bên cạnh tôi là 00-40-F4-48-1B-88.
Để các máy có thể nói chuyện với nhau, bạn có thể cung cấp cho mỗi máy một danh sách mã hóa cứng của tất cả các địa chỉ MAC của tất cả các máy khác trên mạng để biết nơi gửi gói tin. Đây là rất nhiều lỗi dễ bị gõ và bất cứ khi nào bạn thay đổi bất kỳ phần cứng mạng nào, bạn sẽ phải đi xung quanh và thay đổi tất cả các danh sách để phản ánh các địa chỉ MAC mới.
Đây là một rắc rối lớn, vì vậy có lẽ bạn sẽ tìm ra cách để các máy trên mạng tự động khám phá địa chỉ MAC của nhau bằng các gói phát sóng. Sau đó, bạn cung cấp cho họ cách nhận dạng chính mình bằng một số địa chỉ có ý nghĩa để bạn phải nhập các lệnh như "telnet C8-60-00-CA-4B-9A".
Hóa ra đây chính xác là những gì IP thực hiện - đó là một cách sử dụng các số có ý nghĩa để giải quyết các máy chủ lưu trữ trên mạng thay vì các địa chỉ MAC mã hóa cứng. Thêm DNS vào đầu IP và bạn có thể gõ lệnh như "máy chủ web telnet".
Ethernet không thể sử dụng địa chỉ IP để gửi tin nhắn? Tôi không nói là nên, tôi chỉ hỏi liệu nó có thể chọn làm như vậy không.
Địa chỉ MAC là 6 byte thông tin và địa chỉ IP chỉ có 4 byte, vì vậy bạn không thể thực hiện bất kỳ loại ánh xạ 1 đến 1 nào. Bạn cần một số cách tìm địa chỉ MAC (để đặt gói) từ địa chỉ IP (được cung cấp bởi phần mềm muốn liên lạc với máy chủ khác trên mạng).
Một cách (lõi cứng) để làm điều này là đi vào mọi máy trên mạng và thay đổi địa chỉ MAC phần cứng của nó thành giống như một địa chỉ IP bằng cách làm cho hai byte trên cùng là số không (hoặc một số số cố định khác giống nhau cho mọi máy trên mạng) và đặt bốn byte dưới cùng thành "địa chỉ IP" mà bạn muốn chúng có trên mạng. (Hầu hết các thẻ mạng sẽ cho phép bạn truy cập và sửa đổi địa chỉ MAC được chỉ định của nhà cung cấp)
Để làm cho điều này thực sự hoạt động, tiếp theo bạn cũng sẽ phải hack mã trong ngăn xếp mạng của bạn để thực sự sử dụng hệ thống này. Về cơ bản, bạn sẽ loại bỏ mọi thứ phải làm với ARP (phương thức IP sử dụng để dịch địa chỉ IP thành địa chỉ MAC). Bạn sẽ tách ra các phần xây dựng / đọc các tiêu đề IP. Thay vào đó, bạn sẽ thay thế tất cả bằng mã rất đơn giản, được cung cấp một gói IP được gửi đến máy chủ tại địa chỉ wxyz, xây dựng khung ethernet với địa chỉ DEST được đặt thành 00-00-wxyz.
Bạn cũng sẽ cần một cách để chỉ ra cho người nhận gói tin có giao thức (UDP, TCP). Bạn có thể có thể dán cái này ở đâu đó trong tiêu đề ethernet bằng cách ghi đè một trường hiện có. Có thể sử dụng một trong hai byte trên cùng của địa chỉ nguồn? Điều này sẽ không ảnh hưởng đến khả năng nhận của máy đích, nhưng có thể làm rối một số công tắc. Bạn cũng có thể thêm giao thức vào đầu hoặc cuối khung Ethernet và tăng kích thước tải trọng lên một - nhưng điều đó bắt đầu có mùi giống như một tiêu đề IP.
Vì vậy, tất cả những gì công việc này sẽ mua cho bạn?
Đầu tiên, nó sẽ giúp bạn tiết kiệm chi phí tra cứu trong bảng ARP trên mỗi gói gửi đi. Điều này có lẽ là theo thứ tự chỉ micro giây.
Bạn lưu công việc tính toán tổng kiểm tra tiêu đề IP và bộ nhớ cần thiết để giữ chúng. Điều này có lẽ không đáng kể trên phần cứng hiện đại.
Bạn lưu 16 byte trong mỗi gói trên mạng vì sẽ không có tiêu đề IP. Điều này có thể thêm lên tùy thuộc vào ứng dụng.
Lợi ích lớn nhất là bạn sẽ không phải thực hiện bất kỳ yêu cầu ARP nào. Gửi gói IP tiêu chuẩn đến máy chủ mới sẽ kích hoạt trao đổi ARP có thể mất một phần nghìn giây và không thể đoán trước. Đây có thể là một lợi ích rất lớn cho một số ứng dụng rất nhạy cảm với độ trễ và jitter.
Đối với một số ứng dụng rất chuyên biệt, điều này thực sự có ý nghĩa để làm. Tôi đã từng làm việc với một hệ thống thời gian thực, chỉ sử dụng các gói UDP phát sóng cho tất cả các liên lạc giữa các máy chủ với lý do duy nhất là nó tránh được các chuỗi ARP đó khởi động và không thể đoán trước được sự chậm trễ và jitter. Tôi cũng đã từng làm việc trên một hệ thống nhúng giới hạn tài nguyên, hoạt động bằng cách gửi trực tiếp tải trọng UDP bên trong các gói IP (không có tiêu đề IP) vì nó đã lưu tất cả sự phức tạp và bộ nhớ cần thiết để thực hiện tất cả ARP và netmask và công cụ kiểm tra thêm.