Làm thế nào để tôi thực hiện giao thức nhận biết tên máy chủ?


10

Đây là một câu hỏi kinh điển về nhận thức và ủy quyền tên máy chủ.

Tôi biết rằng một số giao thức được nhận biết tên máy chủ; nghĩa là, khi tôi kết nối với máy chủ HTTP, www.example.comnó biết rằng tôi muốn www.example.comdịch vụ HTTP, chứ không phải www.example.net, mặc dù chúng ở trên cùng một địa chỉ IP. Làm thế nào tôi có thể làm điều này cho giao thức foo ?

(Lưu ý tạm thời: câu hỏi này xuất hiện theo thảo luận meta này .)

Câu trả lời:


14

Để hiểu những gì đang xảy ra, bạn cần biết một chút về DNS.

Khi khách hàng muốn kết nối với một dịch vụ trên một máy chủ nhất định, nó sẽ tìm tên máy chủ thông qua cơ sở hạ tầng DNS cục bộ và nhận được địa chỉ IP để phản hồi. Sau đó, nó kết nối với địa chỉ IP đó và yêu cầu dịch vụ theo cách được quy định bởi Procotol mà nó được xây dựng để thực hiện.

Trong một số trường hợp, một phần của Procotol đó liên quan đến việc gửi tên máy chủ thứ hai được tra cứu ban đầu, trong trường hợp này được gửi đến máy chủ thay vì cơ sở hạ tầng DNS. Trong trường hợp HTTP, điều này đã được thêm vào như một phần của HTTP / 1.1, trong RFC 2616 ; trong trường hợp HTTPS, điều này đã được triển khai dưới dạng Chỉ định tên máy chủ (SNI) trong RFC 4366 ; và trong trường hợp của FTP, điều này đã được thêm vào bởi HOSTlệnh, trong RFC 7151 (nhưng xem cảnh báo sau). Nếu việc gửi thứ hai như vậy không xảy ra, máy chủ không có cách nào để biết tên máy chủ mà khách hàng đã cung cấp cho DNS cục bộ của mình để lấy địa chỉ IP của máy chủ.

Lưu ý rằng trong mọi trường hợp, cần phải thay đổi giao thức để thực hiện việc gửi thứ hai này và do đó làm cho tên máy chủ tương tác giữa máy khách và máy chủ nhận biết. Sau khi giao thức được thay đổi, mã máy chủ phải được cập nhật để thực hiện nó. Và cuối cùng, các máy khách phải được cập nhật để nói về giao thức mới với các máy chủ. Bước cuối cùng đó có thể đặc biệt chậm; trong trường hợp SNI, Internet Explorer trên Windows XP không bao giờ triển khai nó, vì vậy giao thức không thể dựa vào trong khi vẫn còn một số lượng đáng kể người dùng IE-on-XP và phải mất khoảng mười năm để họ có đủ chết đi và / hoặc nhận các bản nâng cấp mà SNI có thể triển khai một cách đáng tin cậy.

Vì vậy, đó là những gì nó cần để làm cho một giao thức nhận biết tên máy chủ không nhận biết tên máy chủ. Nó không phải là một thiết lập cờ đơn giản hoặc thay đổi cấu hình. Chúng tôi có một số câu trả lời dành riêng cho giao thức liên quan đến tình trạng và các biện pháp giảm thiểu có thể có, cụ thể là cho giao thức đó: cho SSH (và cả SFTP) và cho FTP (chỉ ra rằng HOSThỗ trợ cho FTP hiện đang trong tình trạng chắp vá giai đoạn hỗ trợ, và do đó không thể dựa vào).

Câu trả lời ngắn gọn là nếu giao thức của bạn hiện không triển khai nhận thức về tên máy chủ, với sự hỗ trợ tốt giữa cả máy khách và máy chủ, hãy quên nó đi: đó không phải là điều bạn có thể làm.


6
Tôi nghĩ rằng tôi sẽ tiết lộ câu trả lời này với thực tế là một số giao thức dành cho các sản phẩm hoàn toàn mới hoặc đủ cục bộ để một công ty sẽ kiểm soát tất cả các phiên bản của máy chủ và máy khách. Trong những trường hợp đó, chỉ cần thêm các lệnh hoặc gói tên máy chủ là rất đơn giản và rất dễ thực hiện. Bạn mô tả sự khó khăn trong việc thêm bất kỳ tính năng mới nào vào một giao thức hiện có đã được nhiều nhà cung cấp sử dụng rộng rãi.
JPhi1618

4
@ JPhi1618 Tôi nghe thấy bạn, nhưng theo tôi, bất kỳ "giao thức" nào được tạo và thực hiện bởi một công ty duy nhất và không được nhúng trong RFC, hoàn toàn không phải là một giao thức; đó chỉ là một quyết định kỹ thuật nội bộ và tôi không có hứng thú với các sản phẩm độc quyền như vậy. Như bạn chỉ ra, nhà cung cấp có thể ngay lập tức thay đổi mọi thứ để triển khai nhận thức về tên máy chủ nếu nó chọn; nhưng vì không ai khác ngoài nhà cung cấp có thể làm điều đó, tôi không thấy OP quan tâm đến mức độ nào.
MadHatter

Tôi nghĩ rằng câu hỏi liên quan là liệu bạn đang thiết kế một giao thức mới hay hỏi cách thay đổi một giao thức hiện có.
Barmar

Một giao thức độc quyền vẫn là một giao thức.
Barmar

@Barmar có lẽ không phải là một cuộc thảo luận tốt để vào đây. Câu hỏi này là về việc thay đổi các giao thức hiện có, và như tôi đã lưu ý trước đó, nếu quyết định / giao thức kỹ thuật độc quyền bazchỉ có thể được thay đổi bởi chủ sở hữu và người thực hiện duy nhất của nó, thì cách duy nhất để làm cho nó nhận biết tên máy chủ là phải khiếu nại chủ sở hữu. Điều đó không tạo ra một câu trả lời SF thú vị, và hơn nữa không phải là (theo suy nghĩ của tôi) về chủ đề. " Làm thế nào để tôi thiết kế một giao thức nhận biết tên máy chủ " là một câu hỏi khác hoàn toàn, và không phải là một câu hỏi mà tôi quan tâm.
MadHatter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.