Xưởng · 1.735 từ · 7 phút đọc

Nguyên tắc đầu cuối: Tại sao internet ngu một cách có chủ đích

Bài báo năm 1984 của Saltzer, Reed, và Clark hình thức hóa quyết định thiết kế đã làm internet hoạt động — đặt trí thông minh ở các rìa, giữ phần giữa ngu ngốc, và nhìn nó tồn tại lâu hơn mọi mạng thông minh hơn đã cạnh tranh với nó.

#TL;DR

Năm 1984, ba nhà nghiên cứu MIT — Jerome Saltzer, David Reed, và David Clark — xuất bản một bài báo gọi là “End-to-End Arguments in System Design.” Nó hình thức hóa một lựa chọn thiết kế mà TCP/IP đã làm một thập kỷ trước đó: đừng đặt trí thông minh trong mạng; đặt nó ở các điểm cuối. Bài báo lập luận rằng các tính năng như độ tin cậy, mã hóa, và nén nói chung nên sống ở các rìa, vì chỉ các điểm cuối biết đủ để triển khai chúng đúng. Nguyên tắc duy nhất này giải thích tại sao IP tối thiểu, tại sao TCP phục hồi từ mất, tại sao TLS mã hóa đầu-đến-đầu, và tại sao mọi mạng đã cố “thông minh hơn IP” cuối cùng đã thua nó.

#Lập luận

Tuyên bố cốt lõi của bài báo đơn giản hơn tên của nó:

Một chức năng nên được triển khai trong mạng chỉ khi nó có thể được triển khai đúng ở đó. Nếu các điểm cuối phải triển khai nó dù sao — vì mạng không thể đảm bảo nó — thì làm nó trong mạng là dư thừa và đắt.

Ví dụ kinh điển trong bài báo là chuyển tệp đáng tin cậy. Giả sử bạn muốn sao một file từ máy A sang máy B, và bạn muốn sự chắc chắn đầu-đến-đầu rằng B có file còn nguyên vẹn. Bạn có thể cố xây một mạng đáng tin cậy — nơi mọi bước nhảy checksum mọi gói, phát lại khi mất, và hứa giao hàng bit-hoàn hảo.

Sẽ không đủ.

Ngay cả với một mạng hoàn toàn đáng tin cậy, file có thể bị hỏng:

  • Bởi một lỗi trong code đọc file của A.
  • Bởi các lỗi bộ nhớ trên một trong hai máy.
  • Bởi một lỗi trong chương trình làm sao chép.
  • Bởi hỏng đĩa giữa khi B nhận dữ liệu và khi B hoàn tất ghi nó.

Cách duy nhất để chắc chắn file đến nguyên vẹn là A gửi một checksum và B xác minh checksum sau khi ghi lên đĩa. Đó là một kiểm tra đầu-đến-đầu. Và một khi bạn đang làm kiểm tra đó, độ tin cậy bước-qua-bước của mạng không mua cho bạn nhiều. Bạn sẽ bắt các lỗi dù sao đi nữa.

Kết luận của bài báo: các tính năng phải tồn tại ở các điểm cuối không nên được nhân bản trong mạng. Để mạng làm tối thiểu. Đặt trí thông minh ở nơi nó thực sự có thể xác minh nó đang hoạt động.

#Nó trông như thế nào trong thực tế

TCP/IP hiện thân nguyên tắc trong phân tầng của nó. IP, tầng mạng, gần như không làm gì. Nó chuyển tiếp các gói dựa trên một địa chỉ đích. Nó không xác minh giao hàng, không sắp xếp lại, không phát lại, thậm chí không quan tâm gói có đến hay không. Mô tả công việc của router vừa trong một dòng: nhìn đích, chuyển tiếp về phía nó, quên bạn đã từng thấy nó.

Độ tin cậy là mối quan tâm của TCP. TCP sống ở các điểm cuối — hai máy đang có cuộc trò chuyện. Chúng theo dõi số thứ tự, ACK những gì chúng nhận, phát lại những gì chúng không, và che giấu tất cả điều đó khỏi ứng dụng.

  Ứng dụng                              Ứng dụng
  ───────────                          ───────────
      │                                    │
  ┌───┴───┐                            ┌───┴───┐
  │  TCP  │ ◄── độ tin cậy ở đây ──►   │  TCP  │
  └───┬───┘                            └───┬───┘
      │                                    │
  ┌───┴───┐   ┌─────┐   ┌─────┐   ┌────────┴───┐
  │  IP   │──►│  IP │──►│  IP │──►│     IP     │
  └───────┘   └─────┘   └─────┘   └────────────┘
                                         


              "router ngu" — chuyển tiếp và quên

Router ở giữa có thể chết, được thay bằng một model khác, là một công nghệ liên kết hoàn toàn khác — và các điểm cuối sẽ không nhận ra, vì các điểm cuối là những người chịu trách nhiệm làm cho cuộc trò chuyện hoạt động.

#Tại sao ngu thắng

Có một nửa thứ hai của bài báo thường bị bỏ qua. Saltzer, Reed, và Clark không chỉ lập luận rằng các điểm cuối nên sở hữu độ tin cậy — họ lập luận rằng các mạng cố gắng làm nhiều hơn chuyển tiếp các gói có xu hướng mắc kẹt. Lý do:

  • Mọi tính năng mạng đều có chi phí, ngay cả khi bạn không sử dụng nó. Nếu tầng mạng cung cấp giao hàng đáng tin cậy, mỗi gói trả tổn phí, bao gồm những gói không cần nó (các khung video bạn muốn bỏ hơn trì hoãn, các truy vấn DNS rẻ hơn để thử lại hơn ACK).
  • Một mạng “thông minh” già đi tệ. Các tính năng được nung vào các router khó thay đổi. Internet đã tiến hóa điều khiển tắc nghẽn TCP, TLS, QUIC, và HTTP/3 ở các điểm cuối mà không chạm lõi mạng — điều đó chỉ có thể vì lõi tối thiểu.
  • Các ứng dụng mới cần các đảm bảo khác nhau. Giọng nói thời gian thực muốn độ trễ thấp và chịu đựng mất. Chuyển tệp muốn thông lượng số lượng lớn. Một mạng thông minh phải chọn một. Một mạng ngu để mỗi ứng dụng chọn cho mình.

Đây là lý do bảy tầng của mô hình tham chiếu OSI — với các tính năng như quản lý phiên và mã hóa trình bày bên trong mạng — đã thua stack mỏng hơn nhiều của TCP/IP. TCP/IP dễ tiến hóa hơn chính xác vì nó hứa ít hơn.

#Nơi nguyên tắc bị vi phạm

Một khi bạn học nguyên tắc, bạn bắt đầu thấy các vi phạm của nó ở mọi nơi. Chúng thường có thể bảo vệ trong ngắn hạn và đáng tiếc trong dài hạn:

  • NAT (Network Address Translation). Một router viết lại các địa chỉ trên các gói phá vỡ mô hình đầu-đến-đầu — các điểm cuối không còn chia sẻ một góc nhìn mạch lạc về các địa chỉ của chính chúng. NAT tồn tại vì IPv4 đã hết địa chỉ, và nó giải vấn đề đó. Nó cũng làm các ứng dụng peer-to-peer khó xây dựng hơn trong hai mươi năm và yêu cầu các giao thức như STUN, TURN, và ICE để che lấp.
  • Kiểm tra gói sâu. Các ISP và doanh nghiệp thường xuyên kiểm tra các tải trọng gói để phân loại lưu lượng, thực thi chính sách, hoặc chặn. Mã hóa (TLS khắp nơi) một phần là phản ứng với điều này.
  • Caching trong suốt. Các proxy web chặn HTTP và phục vụ các bản sao được cache trông như tối ưu hóa hiệu năng. Chúng cũng là một vi phạm — giờ “điểm cuối” mà client nghĩ nó đang nói chuyện không phải nguồn thực tế. TLS đã giết hầu hết những thứ này vì một lý do.
  • CGNAT và middlebox “cấp nhà mạng”. Các mạng di động hiện đại định tuyến mọi khách hàng qua các tầng NAT ở phía nhà mạng. Điện thoại không ở trên internet — nó ở trên một mạng đằng sau một mạng, với các hộp của nhà mạng chấm dứt và khởi động lại các kết nối.
  • Xương hóa giao thức. Các extension TCP được thêm nhiều năm trước đôi khi vẫn không thể sử dụng trên internet công cộng vì một số middlebox sẽ từ chối các gói nó không hiểu. Đây là lý do QUIC chạy trên UDP — tầng duy nhất mà middlebox vẫn để yên.

Mỗi điều này là trường hợp nơi ai đó quyết định mạng nên làm nhiều hơn chuyển tiếp các gói. Mỗi cái tạo ra một lớp lỗi mà sẽ không thể trong một hệ thống đầu-đến-đầu nghiêm ngặt.

#Nguyên tắc là một mặc định, không phải một luật

Saltzer, Reed, và Clark cẩn thận. Bài báo không nói mọi chức năng phải ở các điểm cuối — nó nói gánh nặng bằng chứng nằm ở ai muốn đặt một chức năng trong mạng. Có các trường hợp nơi một tính năng tầng mạng được biện minh:

  • Tối ưu hóa hiệu năng không yêu cầu đảm bảo tính đúng đắn. Các checksum tầng liên kết ổn — chúng bắt các lỗi phổ biến mà không hứa gì.
  • Công bằng và quản lý tài nguyên. Điều khiển tắc nghẽn có các thành phần điểm cuối (TCP) và các thành phần mạng (xếp hàng, ECN) vì không bên nào có thể làm nó một mình.
  • Những thứ các điểm cuối thực sự không thể làm. DNS phải là một dịch vụ mức-mạng. Bạn không thể tra cứu một cái tên bạn chưa giải.

Nguyên tắc là một thiên hướng thiết kế, không phải một quy tắc tuyệt đối. Khi bạn có thể đẩy một tính năng đến các điểm cuối, làm nó — vì đó là cách hệ thống vẫn có thể tiến hóa. Khi bạn không thể, ít nhất hãy trung thực rằng bạn đang thỏa hiệp.

#Điều này có nghĩa gì bây giờ

Năm mươi năm sau khi Cerf và Kahn phác thảo TCP trong một sảnh khách sạn, nguyên tắc đầu-đến-đầu vẫn giải thích gần như mọi tính chất thú vị của internet:

  • Mã hóa khắp nơi — TLS và các kế vị của nó mã hóa dữ liệu giữa các điểm cuối, vì chỉ các điểm cuối biết các khóa. Mạng không thể giải mã, không thể kiểm tra, không thể nói dối về nội dung. Đây là một kết quả thiết kế có chủ ý: vi phạm nguyên tắc đầu-đến-đầu, và mã hóa vỡ.
  • Sự bùng nổ của các mạng overlay — CDN, các hệ thống peer-to-peer, Tor, Tailscale — tất cả chạy trên internet công cộng và bỏ qua mạng ở giữa. Chúng hoạt động vì mạng đủ ngu để cho phép chúng.
  • QUIC và sự phục hưng UDP — thế hệ tiếp theo của các giao thức truyền chuyển sang UDP cụ thể vì UDP là bề mặt cuối cùng nơi nguyên tắc đầu-đến-đầu vẫn giữ vững.

Bài viết TCP/IP mô tả tuệ giác sảnh khách sạn là “mạng ngu, điểm cuối thông minh.” Bài báo năm 1984 là thứ biến lựa chọn chiến thuật đó thành một nguyên tắc có thể được tranh luận và áp dụng ở nơi khác. Mỗi khi một thảo luận thiết kế hệ thống đi đến câu hỏi điều này có nên xảy ra ở điểm cuối hay ở giữa? — ai đó trong phòng đang tái phái sinh Saltzer, Reed, và Clark từ các nguyên tắc đầu tiên. Thường không biết.