French Cafe: Samba đã được viết ra như thế nào

alt text
Lời tựa: Bài viết rất thú vị là này của một LTV người Úc mà tôi rất khâm phục: Andrew Tridgell, tác giả trực tiếp của Samba, rsync... (và gián tiếp Git). Lần đầu đọc được cách đây khoảng gần 10 năm, lúc đó không hiểu lắm vẫn thấy hay hay. Nay đọc lại thì vẫn ko hiểu gì =)), nhưng lại thấy rất hay. Xin dịch lại cho mọi người cùng thưởng thức.


Andrew Tridgell

Tháng 8 năm 2003

Phương pháp 1:

Trước hết, có một số tài liệu có sẵn công khai về giao thức CIFS / SMB. Các tài liệu này không đầy đủ và rải rác khắp nơi lại thường không chính xác, tuy nhiên chúng là một điểm khởi đầu rất hữu ích. Có lẽ tài liệu hữu ích nhất là "draft-leach-cifs-v1-spec-02.txt" từ năm 1997 đó là một đặc tả giao thức được phát hành bởi SNIA và phần lớn là Microsoft viết ra (với rất nhiều đóng góp quan trong từ nhiều người khác, bao gồm cả bản thân tôi). Tài liệu này đã hết hạn dưới tư cách bản nháp của IETF và Microsoft cũng tử bỏ nỗ lực để khiến CIFS được chấp nhận là tiêu chuẩn IETF, nhưng tài liệu vẫn tồn tại đâu đó nếu bạn chịu khó mày mò với một công cụ search. Có rất bhiều các đặc tả kỹ thuật công khai khác cho các phần khác nhau của giao thức vẫn còn tồn tại. Tôi duy trì một bộ sưu tập những cái tôi biết ở địa chỉ này http://samba.org/ftp/samba/specs/

Phương pháp 2:

Tôi gọi phương pháp này là "Kỹ Thuật Quán Cafe Pháp". Hãy tưởng tượng bạn muốn học tiếng Pháp, tuy nhiên lại không có sách, khóa học, v.v. để dạy bạn. Bạn có thể quyết định học bằng cách bay thẳng đến Pháp và ngồi trong 1 quán Cafe Pháp và chỉ việc lắng nghe những cuộc trò chuyện xung quanh bạn. Bạn ghi chép đầy đủ về những gì khách hàng nói với người phục vụ và những món ăn nào được mang ra. Bằng cách đó, cuối cùng bạn học được những từ như "bánh mì", "cà phê", v.v.
Chúng ta sử dụng một kỹ thuật tương tự để tìm hiểu về những bổ trong sung giao thức mà Microsoft tạo ra. Chúng ta dùng một dạng phần mềm gọi là network sniffer để lắng nghe những trao đổi qua lại giữa máy khách và máy chủ của Microsoft và theo thời gian chúng ta tìm hiểu được những "từ" như "kích thước tệp", "datestamp" khi chúng ta quan sát những gì được gửi qua lại cho mỗi truy vấn.
Bây giờ thì lại tồn tại một vấn đề với kỹ thuật "Quán Cafe Pháp" là bạn chỉ có thể học những từ mà khách hàng sử dụng. Nếu bạn muốn học các từ khác thì sao? Ví dụ bạn muốn học chửi thề bằng tiếng Pháp?
Hãy thử gọi món gì đó ở quán cà phê, sau đó thì thử dẫm lên chân hay chọc vào mắt người phục vụ đưa đồ ăn cho bạn. Trong lúc bị đuổi ra ngoài bạn hãy ghi chú thật nhanh và nhiều những từ mà anh ta sử dụng. Cái tương đương với "từ chửi thề" trong giao thức mạng là "các gói tin lỗi" ("error
packets"). Khi viết ra Samba, chúng ta cần biết cách để phản ứng với các điều kiện bị lỗi. Để giải quyết vấn đề này, chúng ta viết một chương trình cố tình truy cập một tệp không tồn tại hoặc sử dụng bộ đệm quá nhỏ hoặc truy cập tệp mà chúng ta không sở hữu. Sau đó chúng ta xem mã lỗi gì được trả về cho mỗi điều kiện và ghi chú lại.

Phương pháp 3:

Phương pháp 3 là một biến thể được mở rộng rất nhiều của kỹ thuật "lời chửi thề" mà tôi đã đề cập lúc trước. Nó liên quan đến việc viết một thứ được gọi là "protocol scanner" (‘máy qyét giao thức’). Một protocol scanner là một chương trình thử tất cả "từ" có thể trong phần nào của giao thức và sử dụng phản hồi để tự động suy luận thông tin mới về giao thức. Nó giống như kỹ thuật Quán Cafe Pháp nhưng lại đối với một người phục vụ cực kì kiên nhẫn.
Ví dụ: một số phần của giao thức có thể chứa 16 bit "từ lệnh" ("command word") cho máy chủ biết thao tác nào cần thực hiện. Có đến 64 nghìn từ lệnh có thể xảy ra, vì vậy chúng ta thử tất cả chúng và lưu ý đến cái nào cung cấp mã lỗi khác ngoài "không được thực hiện" (""not implemented"). Sau đó chúng ta cần phải tìm ra bao nhiêu dữ liệu đi kèm mà mỗi từ lệnh cần, vì vậy chương trình sẽ thử 1 byte dữ liệu trống, sau đó 2 byte rồi 3 byte,v.v cho đến khi máy chủ thay đổi phản ứng của nó theo một cách nào đó. Khi mà phản ứng đã thay đổi thì bạn sẽ biết (với một mức độ tự tin khá cao) rằng bạn đang sử dụng đúng lượng dữ liệu cần thiết. Sau đó bạn hãy thử dùng dữ liệu không trống nữa: đặt tên tệp hoặc tên thư mục hoặc tên người dùng cho đến khi máy chủ thay đổi phản hồi của nó một lần nữa. Sau một số lượng lớn lần thử, cuối cùng chương trình cũng tìm thấy sự kết hợp của dữ liệu mà không gây ra mã lỗi nào cả - máy chủ đã chấp nhận yêu cầu của chúng tôi! Chúng ta vừa phát hiện ra một cụm từ mới trong "tiếng Pháp".
Khi máy chủ đã chấp nhận yêu cầu mới, chúng ta cần tìm ra yêu cầu đó thực sự làm việc gì. Chúng ta biết đó là một lệnh hợp lệ, nhưng những gì nó làm mới là quan trọng. Để xác định được điều đó chúng ta gửi một câu lệnh mới, sau đó chúng ta tiếp tục với một loạt các lệnh đã được hiểu rõ ràng để hỏi máy chủ một loạt thông tin chi tiết về các tập tin mà nó có. Kích thước một tệp đã thay đổi? Một ngày đã đổi thay? Một tập tin đã thổi đay tên của nó? Cuối cùng chúng ta sẽ hiểu được những gì câu lệnh làm.

Phương pháp 4:

Phương pháp cuối cùng đáng để mô tả ở đây là kỹ thuật "vi phân"(“differential”).
Nó được sử dụng để khám phá ra sự tương tác giữa các từ lệnh khác nhau. Sử dụng ví dụ tương tự về Quán Cafe Pháp (bây giờ đã khá là xa vời cách mạng), ta có thể hiểu nógiống như cố gắng tìm ra rằng bạn có nên dùng một từ khác để gọi cà phê nếu bạn đang dùng nó với chiếc bánh quy thay vì với bánh ngọt. Nó là như thế này.
Bạn sử dụng kiến thức mới có được về tiếng Pháp để viết ra một người phục vụ ảo. Một chương trình cần phải hành xử như một người phục vụ Pháp thực sự. Sau đó bạn viết một chương trình khác gửi một loạt các cụm từ tiếng Pháp ngẫu nhiên lần lượt đến người phục vụ thực và người phục vụ ảo của bạn. Chương trình của bạn sau đó sẽ kiểm tra các câu trả lời một cách cẩn thận và ghi nhận bất kỳ sự khác biệt nào trong cách mà hai người phục vụ trả lời. Bạn ghi chép lại một cách cẩn thận.
Khi hai người phục vụ trả lời lại khác nhau thì bạn hãy nhìn vào ghi chú của mình và thử lại cùng một chuỗi các cụm từ, lần này loại một cụm trong số chúng ra. Bây giờ hãy xem hai người phục vụ có hành xử giống nhau không? Nếu họ có thì bạn sẽ biết rằng cụm từ đó rất là quan trọng đối với sự khác biệt giữa hai người phục vụ, nếu ngược lại thì không. Bằng cách này bạn có thể nhanh chóng xác định được tập hợp tối thiểu các cụm từ khiến hai người phục vụ phản hồi khác nhau. Một khi bạn có tập tối thiểu này rồi thì xin nhìn chăm chú vào nó và sử dụng các phương pháp được mô tả trước đó để xem xét có gì sai với người phục vụ ảo của mình.
Sau đó bạn sửa nó rồi thử lại, và tiếp tục thử cho đến khi phục vụ thật hành xử giống như người phục vụ ảo. Bây giờ hãy tưởng tượng bằng cách sử dụng tất cả các kỹ thuật trên (cộng với một số cái tương tự khác mà tôi chưa đi sâu vào đây) trong một khoảng thời gian là 12 năm.
Samba đã được viết ra như thế đấy!
https://www.samba.org/ftp/tridge/misc/french_cafe.txt

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

VMHung

1 bài viết.
5 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
5 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!