- Gnutella gần như là một giao thức chia sẻ tệp đã bị lãng quên, nhưng nó từng là một ví dụ thực tế khi hàng triệu người dùng không hề có ý thức về công nghệ phi tập trung đã giải quyết vấn đề tải MP3
- Giai đoạn 2000–2001, tỷ lệ phổ cập Internet tại Mỹ đạt 50%, máy nghe nhạc MP3 trở nên rẻ hơn, streaming còn nhiều giới hạn, và văn hóa tự quản lý tệp trực tiếp đã thúc đẩy việc tiếp nhận
- Nhờ cấu trúc không máy chủ và không có điểm lỗi đơn, nó trở nên khó đảo ngược ngay cả sau khi AOL hủy bỏ dự án, và vẫn tiếp tục hoạt động qua nhiều năm bị tìm cách ngăn chặn
- Cấu trúc cơ bản là sự kết hợp giữa truyền tệp qua HTTP và giao thức gossip TCP, trong đó PING/PONG, QUERY/QUERYHIT và PUSH đảm nhiệm tìm kiếm, phản hồi và vượt tường lửa
- Lý do nó biến mất khỏi dòng chính không phải vì thất bại kỹ thuật tức thời, mà vì môi trường người dùng của thời đó đã biến mất; mạng lưới vẫn tiếp tục tồn tại ở quy mô thu nhỏ
Vì sao Gnutella sống sót lâu như vậy
- Gnutella là một giao thức chia sẻ tệp mà nhiều người đã quên, nhưng nó là ví dụ về việc hàng triệu người dùng phổ thông không cố hiểu công nghệ phi tập trung vẫn dùng nó để giải quyết một vấn đề thực tế
- Người dùng tham gia mạng Gnutella không phải vì động cơ như giá trị token tăng, mà vì tải MP3; mạng lưới tăng trưởng bùng nổ rồi duy trì giai đoạn ổn định gần 10 năm, sau đó tiếp tục tồn tại rất lâu với mức sử dụng giảm dần
- Gnutella là công nghệ nền ẩn dưới những dự án nổi bật hơn như LimeWire, và do mô hình walled garden của các nền tảng hiện đại, giờ đây còn có nhiều người dùng Internet thậm chí không nhớ tới chính hệ thống tệp
- Dự án Gnutella bắt đầu khi một bản demo nội bộ bị AOL hủy bỏ đã bị rò rỉ ra công khai, và do thiết kế phi tập trung không máy chủ, một khi đã phát hành thì rất khó thu hồi
- Gnutella vẫn hoạt động suốt nhiều năm bất chấp các nỗ lực ngăn chặn, và bản sao
Gnutella.exe gốc vẫn có thể tìm thấy trên archive.org
- Có lý do rõ ràng để khó coi nó là một giao thức thất bại
- Nó đã mở rộng tới hàng triệu người dùng hoạt động đồng thời và phát triển mạnh như một trường hợp sử dụng dòng chính trong khoảng 10 năm
- Lý do nó biến mất khỏi dòng chính không phải là sự thất bại tức thời của bản thân giao thức, mà vì môi trường người dùng đã sinh ra Gnutella không còn nữa
- Ngay cả ngày nay, nó vẫn tiếp tục vận hành ở quy mô thu nhỏ
Những điều kiện lịch sử tạo ra việc tiếp nhận
- Vào khoảng 2000–2001, tỷ lệ phổ cập Internet của người tiêu dùng Mỹ đã đạt 50%, và Internet đang chuyển từ công cụ dành cho dân đam mê sang hạ tầng thường nhật
- Có nhiều điều kiện cùng lúc khiến việc chia sẻ tệp nhạc trở nên phổ biến
- Ngành công nghiệp âm nhạc không thích nghi được với sự thay đổi trong sở thích tiêu dùng
- Máy nghe nhạc MP3 và bộ nhớ thể rắn trở nên rẻ hơn và phổ biến rộng rãi
- Với Internet quay số tốc độ thấp, streaming nhạc là điều không thực tế
- Việc tự quản lý dung lượng đĩa, thư mục, bản sao lưu và các tệp tải về vẫn là điều chấp nhận được ngay cả với người dùng máy tính phổ thông thời đó
- Những điều kiện này tạo nên thời kỳ hoàng kim của chia sẻ tệp kéo dài tới đầu những năm 2010, và LimeWire trở thành cái tên tiêu biểu cho trải nghiệm khi ấy
- Gnutella khó bị triệt hạ vì không có điểm lỗi đơn, và giao thức cơ bản tuy đơn giản nhưng có thể mở rộng dễ dàng nhờ các phần mở rộng tùy chọn trong đặc tả
Bản chất cơ bản của giao thức
- Với đa số người dùng, Gnutella là công cụ truyền tệp, nhưng về cốt lõi nó gần với một công cụ tìm kiếm P2P cho blob hơn
- Về nguyên lý, nó cũng có thể dùng như một DNS đơn giản, một bảng tra cứu metadata khóa/giá trị toàn cục, hay dịch vụ ghép trận cho Unreal Tournament, nhưng trong lịch sử thực tế nó được nhớ đến như công cụ tải các tệp khớp với từ khóa tìm kiếm, đặc biệt là MP3
- Bản thảo đặc tả Gnutella 0.6 nêu rằng tài nguyên được chia sẻ có thể là bất cứ thứ gì: ánh xạ tới tài nguyên khác, khóa mã hóa, mọi định dạng tệp, hay metadata của tài nguyên có thể chỉ định bằng khóa
- Luồng sử dụng điển hình như sau
- Chạy một client Gnutella như LimeWire, BearShare hoặc GTK-Gnutella
- Client kết nối tới một vài peer ở đâu đó trên Internet
- Người dùng nhập từ khóa tìm kiếm như
LinkinPark.mp3.exe
- Truy vấn lan dần từ peer này sang peer khác ra phía ngoài mạng
- Kết quả từ các máy tính ngẫu nhiên trên khắp thế giới chậm rãi quay trở lại
- Người dùng nhìn tên tệp để đoán có phải hàng giả hay không, so sánh tốc độ kết nối và hy vọng tệp không có virus
- Khi chọn một tệp, client tải trực tiếp từng phần qua HTTP từ máy tính của người dùng khác
- Trong quá trình nhận nhầm tệp, người dùng cũng có thể tình cờ khám phá nội dung mới hoặc nhận phải mã độc; kiểu tìm kiếm và nhặt nhạnh có tính khám phá này đã biến mất cùng với sự xuất hiện của các công cụ gợi ý
- Client thường cung cấp bốn chức năng chính
- Trình quản lý truy vấn: xử lý các tìm kiếm lan chậm qua hàng nghìn peer
- Trình quản lý tệp: chỉ định thư mục hoặc đường dẫn sẽ chia sẻ và nơi lưu tệp tải về
- Trình quản lý truyền tải: xử lý việc tiếp tục, chia nhỏ và quản lý truyền tệp hai chiều
- Chức năng bổ sung: có thể gồm chat IRC, bảng tin, giám sát truy vấn tìm kiếm, khám phá host cụ thể, nhưng phần lớn không thuộc bản thân giao thức
- Hệ sinh thái Gnutella có những bên dẫn đầu thị trường như LimeWire, nhưng nhiều client cùng tồn tại, và nhà phát triển độc lập cũng có thể tự viết client từ đầu
- Trong quá trình triển khai Gnutella Bun Client, có rất nhiều phần không nằm trong đặc tả, tính năng không được tài liệu hóa và các khả năng nằm rải rác ở những đặc tả bổ sung; giao thức đã tiến hóa một cách hữu cơ
Sự kết hợp giữa HTTP và giao thức gossip
- Có vẻ như chỉ cần chạy một HTTP server trên máy cá nhân và công bố địa chỉ IP là đã có thể chia sẻ tệp, nhưng ngày nay điều đó khó hơn do NAT, tường lửa và chính sách ISP gia đình khiến việc mở cổng TCP inbound trở nên khó khăn
- Cách đây 20 năm, việc chạy một HTTP server nhỏ trên máy cục bộ và để nó lộ ra bằng IP công khai phổ biến hơn nhiều so với bây giờ
- Gnutella tận dụng môi trường đó để cho phép mỗi bên tham gia host tệp trong một mesh gồm các peer gossip với nhau
- Giai đoạn truyền tải khi tải tệp bằng LimeWire khá giống với việc lấy tệp bằng
curl hoặc wget
- Chỉ riêng HTTP server thì chưa thể tạo thành mạng chia sẻ tệp P2P
- Ngay thời đó, ISP thường cũng không cung cấp IP tĩnh ổn định
- Địa chỉ IP dùng hôm nay có thể đổi vào ngày mai
- Một URL ngẫu nhiên như
http://74.6.231.21:4000 nhiều khả năng không được công cụ tìm kiếm lập chỉ mục, và khi đóng laptop thì nó cũng offline
- Client Gnutella chạy giao thức gossip dựa trên TCP song song với HTTP server
- Nó thông báo sự hiện diện của mình trong một mesh các peer cung cấp thư mục chia sẻ qua HTTP cho những bên tham gia Gnutella khác
- Thông tin như địa chỉ peer, băng thông, độ trễ và truy vấn tìm kiếm di chuyển qua mesh đó
- Cũng có công cụ để xử lý tường lửa, nhưng về sau cần thêm các mở rộng để giải quyết vấn đề NAT hiện đại
- Một node Gnutella về cơ bản có ba vai trò
- Truyền tệp cho bất kỳ ai muốn qua HTTP server cục bộ
- Tìm kiếm và thông báo về các tệp sẵn có qua các thông điệp gossip
- Trong một số trường hợp, dùng kỹ thuật vượt tường lửa
- Vì Gnutella không có điểm vào trung tâm hay sổ đăng ký người dùng, một khi đã tham gia mesh thì node sẽ bắt đầu phát hiện peer mới, truy vấn tìm kiếm inbound và các loại lưu lượng mạng khác
Bootstrapping
- Bootstrapping là quá trình tìm một vài peer khởi đầu để lần đầu bước vào mesh P2P khi bạn không được mời và cũng không có cổng chính
- Mạng Gnutella toàn cục là một hỗn hợp các địa chỉ IP của người tham gia, và chỉ cần kết nối tới một peer đáng tin cậy đang gắn với mạng chính là đã có thể bắt đầu nhìn thấy lưu lượng mạng của một tập người dùng lớn
- Theo thời gian, node tìm thêm peer qua các thông điệp PONG, và danh sách peer được lưu xuống đĩa để tái kết nối sau này
- Do IP thay đổi hoặc node offline, danh sách peer đã lưu sẽ dần có những mục không còn hoạt động, và client sẽ lần lượt thử cho tới khi tìm được peer hợp lệ
- Khi mới tham gia mạng hoặc quay lại sau thời gian dài không kết nối, chỉ danh sách đã lưu có thể là không đủ, nên cần bootstrapping
- Cách phổ biến nhất là Gnutella Web Cache (GWebCache)
- Đây là liên minh các web server độc lập do tình nguyện viên vận hành, thường là các ứng dụng web nhỏ dạng CGI hoặc PHP
- Nó ghi nhận địa chỉ IP của những bên tham gia Gnutella tự nguyện cung cấp thông tin
- Nó ghi lại IP hoặc domain của các server GWebCache khác để dự phòng nếu server hiện tại ngừng hoạt động
- Nó cung cấp danh sách các server GWebCache thay thế
- Nó cung cấp danh sách các địa chỉ IP của những bên tham gia mạng Gnutella hiện được biết đến
- Một số client Gnutella tự động kết nối tới cache server, số khác yêu cầu người dùng chép IP vào tệp cấu hình hoặc menu thiết lập
- Sau khi kết nối được với các peer ban đầu, client sẽ gián tiếp thu thập thêm peer từ chính các thông điệp trong mạng, nên mức phụ thuộc vào cache giảm đi
- GWebCache không phải là điểm nghẽn trung tâm
- Có nhiều server GWebCache không liên quan với nhau
- Cũng có nhiều cách bootstrapping client mà không cần GWebCache
- Ngay cả khi không có GWebCache, Gnutella vẫn có thể sống sót theo cách kém thuận tiện hơn
- Ví dụ yêu cầu danh sách bootstrap như sau
- Thêm
?get=1&client=TEST&version=1 vào cuối URL là có thể lấy danh sách, nhưng nếu yêu cầu quá nhiều sẽ nhanh chóng bị giới hạn tốc độ
http://cache.jayl.de/g2/gwc.php
http://gweb.4octets.co.uk/skulls.php
http://midian.jayl.de/g2/bazooka.php
http://p2p.findclan.net/skulls.php
http://skulls.gwc.dyslexicfish.net/skulls.php
H|106.107.193.27:23459|88579
H|182.233.59.26:23464|88581
U|http://bj.ddns.net/skulls/skulls.php|208999
U|http://scissors.gwc.dyslexicfish.net:3709/|341201
- Các mục bắt đầu bằng
H là peer, còn các mục bắt đầu bằng U là cache server dự phòng có thể dùng về sau
Các loại thông điệp cốt lõi
- Gnutella là giao thức dựa trên TCP, và khi kết nối tới một peer chấp nhận kết nối inbound thì đầu tiên sẽ diễn ra bắt tay
- Client gửi
GNUTELLA CONNECT/0.4 hoặc GNUTELLA CONNECT/0.6; nếu phía bên kia trả lời xác nhận tích cực thì kết nối được thiết lập và các thông điệp Gnutella dạng nhị phân bắt đầu lưu chuyển
- Mọi thông điệp nhị phân đều bắt đầu bằng header 23 byte
- Header chứa ID thông điệp, loại payload, TTL, số hop và độ dài payload
- TTL là thời gian sống còn lại của thông điệp, còn hop là quãng đường nó đã đi
TTL + Hops biểu thị phạm vi tiếp cận ban đầu mà thông điệp được thiết kế để vươn tới
- Có năm loại thông điệp cốt lõi thực sự quan trọng
- PING: khám phá peer đang sống, loại payload
0x00
- PONG: phản hồi PING, chứa địa chỉ IP, cổng và thống kê chia sẻ, loại payload
0x01
- QUERY: yêu cầu tìm kiếm do người dùng khởi tạo hoặc do peer gần đó khởi tạo, loại payload
0x80
- QUERYHIT: phản hồi dương tính cho QUERY, gồm các bản ghi kết quả tệp và thông tin kết nối để tải về, loại payload
0x81
- PUSH: biện pháp lách cho uploader nằm sau tường lửa, yêu cầu chủ sở hữu tệp kết nối ngược lại về phía downloader, loại payload
0x40
- Cũng có thông điệp
BYE, nhưng không bắt buộc nghiêm ngặt
- Các thông điệp giao thức hỗ trợ trường dữ liệu mở rộng, cho phép client bổ sung tính năng mà không làm hỏng toàn bộ mạng lưới
- GTK-Gnutella hỗ trợ các tính năng như TLS, IPv6 và UDP, vốn không có trong giao thức lõi nhỏ gọn ban đầu
Mở rộng giao thức
- Có thể bạn vẫn tạo được một client Gnutella hoạt động chỉ với năm loại thông điệp trên, nhưng đặc tả đó gần 30 năm tuổi và hệ sinh thái chưa từng đứng yên
- Gnutella để lại khoảng trống để nhét các ý tưởng mới vào trong các gói tin cũ
- GGEP (Gnutella Generic Extension Protocol) cung cấp một không gian tổng quát để đặt dữ liệu mở rộng bên trong các thông điệp thông thường
- HUGE (Hash/URN Gnutella Extensions) cho phép client nhận diện tệp bằng mã băm SHA thay vì chỉ tìm theo tên tệp
- Cũng có nhắc tới hỗ trợ payload mở rộng XML, nhưng đặc tả nói về nó như chuyện quá khứ và nó không được quan sát thấy trong lưu lượng mạng hiện đại
- Thiết kế ban đầu tuy nhỏ nhưng đủ linh hoạt để tiếp tục phát triển
Cách tìm kiếm và truyền tải hoạt động
- Các thông điệp PING/PONG đóng vai trò nhịp tim giữa các node
- PING không có payload bắt buộc ngoài header 23 byte tiêu chuẩn, nhưng có thể chứa dữ liệu mở rộng GGEP tùy chọn
- PONG chứa cổng, địa chỉ IPv4, số lượng tệp được chia sẻ và tổng số kilobyte được chia sẻ của servent phản hồi
- Node thu thập thông tin IP/cổng gắn với PONG để trở thành thành viên được kết nối tốt hơn trong mesh, và lưu thông tin đó cho các phiên sau
- QUERY/QUERYHIT hoạt động tương tự PING/PONG, nhưng thay vì quảng bá peer thì chúng mang lưu lượng tìm kiếm
- QUERY chứa trường tốc độ tối thiểu, tức băng thông truyền tải, rồi theo sau là chuỗi tìm kiếm kết thúc bằng NUL
- Ví dụ:
beethoven.mp3
- Thông điệp QUERY lan như lũ từ phía người gửi ra ngoài, còn QUERYHIT sẽ quay ngược trở lại phía người gửi nếu có kết quả
- QUERYHIT chứa địa chỉ IP, cổng, tốc độ và tập kết quả của bên phản hồi
- Mỗi kết quả gồm chỉ mục tệp, kích thước tệp, tên tệp và metadata hoặc mở rộng tùy chọn
- Chỉ mục tệp sẽ được dùng sau đó khi yêu cầu tệp qua HTTP
- Do đặc tính flood routing của Gnutella, kết quả đến chậm và đôi khi phải mất vài phút mới hoàn tất
- Các kỹ sư LimeWire đã nghĩ ra định tuyến truy vấn động để xử lý việc này theo cách có khả năng mở rộng hơn
- Họ dùng bloom filter và cấu trúc topology mạng khéo léo
- Nhờ cấu hình nâng cao đó, hệ thống có thể mở rộng tới hàng triệu người dùng mà không vướng vấn đề của flood routing
- Đến nay hầu hết các client dòng chính vẫn triển khai hệ thống này
PUSH và tường lửa
- Thông điệp PUSH là một biện pháp lách giúp một số HTTP server thoát khỏi hạn chế tường lửa, nhưng không giải quyết được mọi trường hợp
- Thay vì client kết nối tới server như HTTP thông thường, cơ chế này gần giống với việc yêu cầu server kết nối ngược trở lại phía client
- Thông điệp PUSH chứa định danh servent và các định danh khác cần thiết để uploader tìm được downloader
- Vì client không thể kết nối trực tiếp, nó gửi yêu cầu để phía bên kia kết nối lại và gửi tệp
- Chi tiết có thể xem trong đặc tả Gnutella
- Client hiện đại dùng thêm các kỹ thuật khác và các mở rộng UDP để xử lý vấn đề này một cách tự nhiên hơn
Ý nghĩa còn lại và tài liệu tham khảo
- Gnutella nhờ thiết kế ban đầu tốt đã mở rộng tới hàng triệu người dùng đồng thời, né được việc bị chặn và duy trì trạng thái online hàng chục năm mà không cần trợ giúp bên ngoài
- Việc đây không phải là một mạng sụp đổ ngay khi có lưu lượng thực, mà là một phần của văn hóa Y2K vẫn chưa biến mất, cho thấy độ vững chắc của thiết kế
- Kết luận gần như là: lý do thực sự khiến Gnutella mờ nhạt đi là vì nó đã sống lâu hơn cả thế giới đã tạo ra nó
- Bản thân mạng lưới còn tồn tại lâu hơn cả các website từng host tài liệu liên quan tới giao thức
-
Liên kết tham khảo
1 bình luận
Ý kiến trên Lobste.rs
Tôi nhớ Gnutella là thứ giúp tải dễ dàng rất nhiều tệp khớp với từ khóa tìm kiếm, thường là MP3, nhưng cũng có cả “những thứ khác”
Thật vui vì nó gợi lại cảm giác hoài niệm, và cũng tiếc là web ngày nay đã biến thành một con quái vật
Ký túc xá đại học vào giữa những năm 2000 là một mạng phẳng, và iTunes cực kỳ phổ biến, chia sẻ nhạc với bất kỳ ai trên mạng
Chỉ trong một tuần, tôi đã lấp đầy chiếc laptop HP 64-bit mới mua ở Circuit City bằng Evanescence và Green Day, và cảm thấy mình không còn cần Columbia House CD Club nữa
Vài năm sau khi tôi tốt nghiệp, có người lỡ nhắc chuyện đó trước mặt nhầm người, khiến IT chính thức biết đến, và cuối cùng họ phải đóng nó lại
Sau này nhìn lại mới thấy ý ở đây không phải là “mạng phẳng” của các nút chia sẻ tệp dựng trên mạng đại học, mà là bản thân mạng đã là mạng phẳng rồi
Dù sao thì thời đại học đúng là quãng thời gian vui để làm những chuyện như vậy
Soulseek vẫn còn khá sống khỏe và chạy tốt
Điều buồn cười nhất về Gnutella là nó chẳng liên quan gì đến dự án GNU, chỉ là họ thấy GNU trông ngầu nên đưa vào tên
Tôi thường tự hỏi có thể tái sử dụng đến mức nào các kỹ thuật cốt lõi của Gnutella cho việc khám phá nội dung trên small-web mới hơn hoặc thứ gì đó giống Gemini
Nói rằng nó “thất bại” là chưa đầy đủ. Nói chung, một thứ không tự nhiên là thành công hay thất bại; nó chỉ có thể thành công hoặc thất bại khi đối chiếu với một mục tiêu nào đó
Có hai lý do lớn khiến người dùng Gnutella không còn tồn tại nữa, và cả hai đều có thể xem là thất bại
Thứ nhất, Gnutella và nhiều phần mềm của nó đã không bảo vệ đủ quyền riêng tư cho người dùng, khiến họ đối mặt với rủi ro thực tế và cả rủi ro do nhận thức
Thứ hai, nó rất tốt như một hệ thống phân phối tệp media, nhưng không thể đưa ra mức cân bằng chất lượng/giá cả đủ để làm hài lòng đa số người dùng. Nó cho người dùng thứ họ muốn là quyền truy cập không giới hạn, nhưng không đảm bảo đó là nội dung thật, còn Spotify thì cung cấp được cả hai
Theo nghĩa đó, người dùng Gnutella vẫn còn tồn tại, chỉ là giờ họ dùng thứ khác
Tôi từng nghĩ đến việc tạo một kho lưu trữ các tệp
*.gmivà cho phép tìm kiếm chúng bằng một phần mở rộng của Gnutella, cùng với một hệ thống con trỏ để mọi người có thể ký và xuất bản tài liệu gemtextBản thân ý tưởng này không mới, nhưng tổ hợp phân phối Gemtext + Gnutella có vẻ mới: https://github.com/RickCarlino/gnutella-bun-client/…
Bài viết đó là kết quả của một buổi brainstorm qua lại với GPT-5.4, được tôi chôn lại để dành cho sau này nên chưa định chia sẻ, vì vậy xin xem một cách thận trọng
Tôi rất muốn nghe xem bạn có suy nghĩ gì trong không gian Gemini + Gnutella; tôi khá dễ tìm trên Linkedin, Reddit, Fediverse, v.v. và trên blog cũng có thông tin liên hệ
OnionShare cũng khá thú vị: https://onionshare.org/
Nó có thể trở thành một phần của DaRkWeB
Đọc tài liệu thì có vẻ nó gần với một công cụ truyền tệp kết nối trực tiếp hơn
Có vẻ bài viết đã bỏ sót một lý do khiến Gnutella tồn tại lâu trong bối cảnh thời đó: gần như không có động cơ thực tế để spam tìm kiếm P2P
Về sau thì spam tìm kiếm P2P thực sự đã xuất hiện
Việc IRC ngày nay gần như không có spam có vẻ cũng vì lý do tương tự
Điều thú vị là nhiều phần của giao thức này tin tưởng client
GUID lẽ ra phải là ngẫu nhiên, nhưng vì người dùng kiểm soát nên mọi người hoàn toàn có thể đặt GUID là
0000. Nếu làm lại Gnutella theo kiểu hiện đại, rất có thể người ta sẽ thêm một hệ thống trao đổi khóa phức tạp và danh tính dựa trên khóa ED25519Số lượng tệp được quảng bá, băng thông và các thứ tương tự về cơ bản cũng được xây dựng trên niềm tin rằng người dùng đang nói thật. Nếu giao thức phức tạp hơn, có lẽ nó đã cố xác minh các tuyên bố như vậy trong thực tế
Nếu nhồi quá nhiều chữ ký khóa hay quản lý danh tiếng vào, việc triển khai có thể đã trở nên quá phức tạp, và có khi chính sự đơn giản mới là lý do nó thành công. Client Gnutella thực sự có thể được tạo ra
Tôi thấy nhiều dự án P2P hiện đại bỏ lỡ điểm này. Ngay cả Secure Scuttlebutt, một dự án tôi thích, cũng có cảm giác đã cố làm ra thứ gần như hoàn hảo bằng cách tính đến đủ loại thất bại và tình huống bị lạm dụng, để rồi cuối cùng hệ sinh thái chỉ còn một client hoạt động do chính tác giả đặc tả làm ra
Ví dụ tương tự cũng áp dụng cho
gemini://. Nó không phải P2P mà là một giao thức liên hợp, nhưng dù đặc tả có nhiều vấn đề và lỗ hổng, rốt cuộc mọi người vẫn thực sự làm ra client, và bất chấp các vấn đề đó, hệ sinh thái vẫn có khá nhiều triển khai đa dạngGnutella bùng lên vào đúng thời điểm đó phần lớn nhờ vai trò của Gene Kan và Spencer Kimball, những thành viên của Berkeley XCF
Về sau Spencer đã làm rất nhiều công việc kỹ thuật xuất sắc ở Google, và hiện là CEO của công ty cơ sở dữ liệu Cockroach Labs
Gene đạt được thành công sớm khi bán công ty tìm kiếm của mình cho Sun, nhưng đáng buồn là anh đã qua đời một cách bi thảm vào năm 2002 khi còn quá trẻ