Khi máy chủ web gửi một trang, tại sao họ không gửi tất cả CSS, JS và hình ảnh cần thiết mà không được hỏi?


45

Khi một trang web chứa một tệp CSS và một hình ảnh, tại sao các trình duyệt và máy chủ lại lãng phí thời gian với tuyến đường tốn thời gian truyền thống này:

  1. trình duyệt gửi yêu cầu GET ban đầu cho trang web và chờ phản hồi của máy chủ.
  2. trình duyệt gửi một yêu cầu GET khác cho tệp css và chờ phản hồi của máy chủ.
  3. trình duyệt gửi một yêu cầu GET khác cho tệp hình ảnh và chờ phản hồi của máy chủ.

Thay vào đó, khi nào họ có thể sử dụng tuyến đường ngắn, trực tiếp, tiết kiệm thời gian này?

  1. Trình duyệt gửi yêu cầu GET cho một trang web.
  2. Máy chủ web phản hồi với ( index.html theo sau là style.cssimage.jpg )

2
Bất kỳ yêu cầu không thể được thực hiện cho đến khi trang web được tìm nạp tất nhiên. Sau đó, các yêu cầu được thực hiện theo thứ tự khi HTML được đọc. Nhưng điều này không có nghĩa là chỉ có một yêu cầu được thực hiện tại một thời điểm. Trong thực tế, một số yêu cầu được thực hiện nhưng đôi khi có sự phụ thuộc giữa các yêu cầu và một số yêu cầu phải được giải quyết trước khi trang có thể được vẽ đúng. Các trình duyệt đôi khi tạm dừng vì một yêu cầu được thỏa mãn trước khi xuất hiện để xử lý các phản hồi khác khiến cho mỗi yêu cầu được xử lý một yêu cầu. Thực tế là nhiều hơn về phía trình duyệt vì họ có xu hướng sử dụng nhiều tài nguyên.
Closnoc

20
Tôi ngạc nhiên không ai đề cập đến bộ nhớ đệm. Nếu tôi đã có tập tin đó, tôi không cần nó gửi cho tôi.
Corey Ogburn

2
Danh sách này có thể dài hàng trăm thứ. Mặc dù ngắn hơn thực tế gửi các tập tin, nó vẫn còn khá xa so với một giải pháp tối ưu.
Corey Ogburn

1
Trên thực tế, tôi chưa bao giờ truy cập một trang web có hơn 100 tài nguyên độc đáo ..
Ahmed

2
@AhmedElsoobky: trình duyệt không biết tài nguyên nào có thể được gửi dưới dạng tiêu đề tài nguyên được lưu trong bộ nhớ cache mà không cần truy xuất trang trước. Nó cũng sẽ là một cơn ác mộng về quyền riêng tư và bảo mật nếu truy xuất một trang cho máy chủ biết rằng tôi có một trang khác được lưu trong bộ nhớ cache, có thể được kiểm soát bởi một tổ chức khác với trang gốc (trang web nhiều người thuê).
Lie Ryan

Câu trả lời:


63

Câu trả lời ngắn gọn là "Bởi vì HTTP không được thiết kế cho nó".

Tim Berners-Lee không thiết kế một giao thức mạng hiệu quả và có thể mở rộng. Mục tiêu thiết kế của anh là sự đơn giản. (Giáo sư của lớp học mạng của tôi ở trường đại học nói rằng anh ta nên giao việc cho các chuyên gia.) Vấn đề mà bạn phác thảo chỉ là một trong nhiều vấn đề với giao thức HTTP. Ở dạng ban đầu:

  • Không có phiên bản giao thức, chỉ là một yêu cầu cho một tài nguyên
  • Không có tiêu đề
  • Mỗi yêu cầu yêu cầu kết nối TCP mới
  • Không có nén

Giao thức sau đó đã được sửa đổi để giải quyết nhiều vấn đề sau:

  • Các yêu cầu đã được phiên bản, bây giờ các yêu cầu trông giống như GET /foo.html HTTP/1.1
  • Tiêu đề đã được thêm cho thông tin meta với cả yêu cầu và phản hồi
  • Các kết nối được phép sử dụng lại với Connection: keep-alive
  • Phản hồi chunked đã được giới thiệu để cho phép các kết nối được sử dụng lại ngay cả khi kích thước tài liệu không được biết trước.
  • Nén Gzip đã được thêm vào

Tại thời điểm này, HTTP đã được sử dụng hết mức có thể mà không phá vỡ tính tương thích ngược.

Bạn không phải là người đầu tiên đề xuất rằng một trang và tất cả các tài nguyên của nó nên được đẩy đến máy khách. Trên thực tế, Google đã thiết kế một giao thức có thể thực hiện được gọi là SPDY .

Ngày nay, cả Chrome và Firefox đều có thể sử dụng SPDY thay vì HTTP cho các máy chủ hỗ trợ nó. Từ trang web SPDY, các tính năng chính của nó so với HTTP là:

  • SPDY cho phép máy khách và máy chủ nén các tiêu đề yêu cầu và phản hồi, giúp giảm mức sử dụng băng thông khi các tiêu đề tương tự (ví dụ: cookie) được gửi đi gửi lại cho nhiều yêu cầu.
  • SPDY cho phép nhiều yêu cầu đa kênh đồng thời qua một kết nối duy nhất, tiết kiệm cho các chuyến đi khứ hồi giữa máy khách và máy chủ và ngăn chặn các tài nguyên ưu tiên thấp chặn các yêu cầu ưu tiên cao hơn.
  • SPDY cho phép máy chủ chủ động đẩy tài nguyên đến máy khách mà khách hàng biết rằng máy khách sẽ cần (ví dụ: tệp JavaScript và CSS) mà không cần chờ máy khách yêu cầu chúng, cho phép máy chủ sử dụng hiệu quả băng thông không sử dụng.

Nếu bạn muốn phục vụ trang web của mình với SPDY cho các trình duyệt hỗ trợ nó, bạn có thể làm như vậy. Ví dụ: Apache có mod_spdy .

SPDY đã trở thành nền tảng cho HTTP phiên bản 2 với công nghệ đẩy máy chủ.


2
Dang tốt và thông báo câu trả lời! Các trình duyệt web được nối tiếp theo bản chất và các yêu cầu có thể được thực hiện khá nhanh chóng. Nhìn vào một tệp nhật ký sẽ cho thấy rằng các yêu cầu tài nguyên được thực hiện khá nhanh sau khi HTML được phân tích cú pháp. Đó là những gì nó được. Không phải là một hệ thống tồi, chỉ là không có mã / tài nguyên hiệu quả như nó có thể.
Closnoc

6
Chỉ để ghi lại, SPDY không phải là chén thánh. Nó làm một số điều tốt, nhưng giới thiệu các vấn đề khác. Đây là một bài viết có chứa một số điểm nói lại SPDY.
Jost

3
Tôi đặc biệt khuyên mọi người quan tâm đến vấn đề này hãy đọc những lời chỉ trích trong liên kết của @Jost. Nó cho bạn một gợi ý về sự phức tạp liên quan đến việc tìm ra cách thực hiện một việc được thực hiện rất phổ biến không chỉ tốt hơncòn tốt hơn nhiều đến mức mọi người bắt đầu sử dụng nó . Thật dễ dàng để nghĩ về một cải tiến làm cho mọi thứ có phần tốt hơn cho một tập hợp con tương đối lớn của các trường hợp sử dụng. Để làm cho mọi thứ tốt hơn theo cách mà mọi người bắt đầu sử dụng giao thức mới của bạn bởi vì nó tốt hơn nhiều đến mức đáng để chi phí thay đổi là một vấn đề hoàn toàn khác, và không dễ thực hiện.
msouth

11
anh ta nên giao việc cho các chuyên gia : Nếu anh ta làm điều đó, họ sẽ mất sáu năm để đưa ra một tiêu chuẩn đã lỗi thời vào ngày nó xuất hiện, và chẳng mấy chốc, một tá tiêu chuẩn cạnh tranh sẽ xuất hiện. Bên cạnh đó, các chuyên gia có cần sự cho phép từ ai đó không? Tại sao họ không tự làm điều đó?
Chainu Tiwari

2
Thành thật mà nói, không có chuyên gia có trình độ trở lại sau đó. Không ai biết làm thế nào để xây dựng một thế giới web, bởi vì chưa ai từng xây dựng một trang web. Khái niệm hypermedia không được phát minh bởi Tim, anh đã có kinh nghiệm với hệ thống hypermedia khác nhau ở địa phương mười năm trước khi anh viết đề xuất về "Quản lý thông tin" để giải quyết vấn đề "mất thông tin" tại CERN.
Lie Ryan

14

Trình duyệt web của bạn không biết về các tài nguyên bổ sung cho đến khi nó tải xuống trang web (HTML) từ máy chủ, nơi chứa các liên kết đến các tài nguyên đó.

Bạn có thể tự hỏi, tại sao máy chủ không phân tích HTML của chính nó và gửi tất cả các tài nguyên bổ sung cho trình duyệt web trong yêu cầu ban đầu cho trang web? Đó là bởi vì các tài nguyên có thể được trải rộng trên nhiều máy chủ và trình duyệt web có thể không cần tất cả các tài nguyên đó vì nó đã có một số trong số chúng được lưu trong bộ nhớ cache hoặc có thể không hỗ trợ chúng.

Trình duyệt web duy trì bộ đệm tài nguyên để không phải tải xuống cùng một tài nguyên từ các máy chủ lưu trữ chúng. Khi điều hướng các trang khác nhau trên một trang web sử dụng cùng một thư viện jQuery, bạn không muốn tải xuống thư viện đó mỗi lần, chỉ lần đầu tiên.

Vì vậy, khi trình duyệt web lấy một trang web từ máy chủ, nó sẽ kiểm tra những tài nguyên được liên kết mà nó KHÔNG có trong bộ đệm, sau đó thực hiện các yêu cầu HTTP bổ sung cho các tài nguyên đó. Khá đơn giản, rất linh hoạt và mở rộng.

Một trình duyệt web thường có thể thực hiện song song hai yêu cầu HTTP. Điều này không giống với AJAX - cả hai đều là phương pháp không đồng bộ để tải trang web - tải tệp không đồng bộ và tải nội dung không đồng bộ. Với tính năng duy trì , chúng tôi có thể thực hiện một số yêu cầu bằng một kết nối và với đường ống, chúng tôi có thể thực hiện một số yêu cầu mà không phải chờ phản hồi. Cả hai kỹ thuật này đều rất nhanh vì hầu hết chi phí thường đến từ việc mở / đóng kết nối TCP:

cố sống đi

đường ống

Một chút lịch sử web ...

Các trang web bắt đầu dưới dạng email văn bản đơn giản, với các hệ thống máy tính được thiết kế xoay quanh ý tưởng này, tạo thành một nền tảng giao tiếp miễn phí cho tất cả mọi người; máy chủ web vẫn là độc quyền tại thời điểm đó. Sau đó, nhiều lớp được thêm vào "thông số email" dưới dạng các loại MIME bổ sung, chẳng hạn như hình ảnh, kiểu, tập lệnh, v.v ... Sau tất cả, MIME là viết tắt của Tiện ích mở rộng thư Internet đa mục đích . Sớm hay muộn chúng ta đã có những gì chủ yếu là giao tiếp email đa phương tiện, máy chủ web được tiêu chuẩn hóa và các trang web.

HTTP yêu cầu dữ liệu được truyền trong ngữ cảnh của các thư giống như email, mặc dù dữ liệu thường không thực sự là email.

Khi công nghệ như thế này phát triển, nó cần cho phép các nhà phát triển kết hợp dần dần các tính năng mới mà không phá vỡ phần mềm hiện có. Ví dụ: khi một loại MIME mới được thêm vào thông số kỹ thuật - giả sử JPEG - sẽ mất một thời gian để các máy chủ web và trình duyệt web thực hiện điều đó. Bạn không đột nhiên buộc JPEG vào thông số kỹ thuật và bắt đầu gửi nó tới tất cả các trình duyệt web, bạn cho phép trình duyệt web yêu cầu các tài nguyên mà nó hỗ trợ, giúp mọi người luôn vui vẻ và công nghệ tiến lên. Trình đọc màn hình có cần tất cả các JPEG trên một trang web không? Chắc là không. Bạn có nên buộc phải tải xuống một loạt các tệp Javascript nếu thiết bị của bạn không hỗ trợ Javascript? Chắc là không. Googlebot có cần tải xuống tất cả các tệp Javascript của bạn để lập chỉ mục trang web của bạn đúng không? Không.

Nguồn: Tôi đã phát triển một máy chủ web dựa trên sự kiện như Node.js. Nó được gọi là máy chủ nhanh .

Người giới thiệu:

Đọc thêm:


Vâng, thực tế, chúng tôi có thể chăm sóc của tất cả những phụ vấn đề (những thứ như: Cache, Content-Type header..etc), có cách giải quyết để giải quyết những vấn đề này. Và như tôi đã đề xuất trong các nhận xét về bài đăng ở trên, Chúng tôi có thể sử dụng một cái gì đó giống như tiêu đề này> Bộ nhớ cache-Tài nguyên: image.jpg; style.css; để giải quyết vấn đề lưu trữ .. (Nếu bạn có thời gian, thì bạn có thể xem các ý kiến ​​trên ..)
Ahmed

Vâng, ý tưởng đó đã xuất hiện trong đầu tôi, nhưng nó đơn giản là quá nhiều chi phí cho HTTP và nó không giải quyết được thực tế là tài nguyên có thể được trải rộng trên nhiều máy chủ. Hơn nữa, tôi không nghĩ rằng phương pháp tiết kiệm thời gian được đề xuất của bạn sẽ thực sự tiết kiệm thời gian vì dữ liệu sẽ được gửi dưới dạng luồng bất kể bạn nhìn nó như thế nào và với 100 yêu cầu HTTP đồng thời về cơ bản trở thành 1 yêu cầu. Công nghệ và khả năng mà bạn đề xuất dường như đã tồn tại theo một cách nào đó. Xem en.wikipedia.org/wiki/HTTP_persistent_connection
perry

@perry: Bạn nghĩ gì về ý tưởng thay thế https://cho việc gửi các tệp phân phối công khai lớn cần được xác thực nhưng không được giữ bí mật: bao gồm trong URL một hàm băm của một số phần của tiêu đề trả lời hợp pháp, có thể lần lượt bao gồm chữ ký hoặc hàm băm của tải trọng dữ liệu và các trình duyệt có xác thực dữ liệu nhận được so với tiêu đề không? Thiết kế như vậy không chỉ tiết kiệm một số bước bắt tay SSL, mà quan trọng hơn là cho phép các proxy lưu trữ. Nhận URL thông qua liên kết SSL và dữ liệu có thể được cung cấp từ mọi nơi.
supercat

11

Bởi vì họ không biết những tài nguyên đó là gì. Các tài sản mà một trang web yêu cầu được mã hóa thành HTML. Chỉ sau khi trình phân tích cú pháp xác định những tài sản đó là gì thì tác nhân người dùng mới có thể yêu cầu.

Ngoài ra, một khi các tài sản đó được biết đến, chúng cần được phục vụ riêng lẻ để các tiêu đề thích hợp (nghĩa là loại nội dung) có thể được phục vụ để tác nhân người dùng biết cách xử lý.


2
Đặc biệt là nếu bạn sử dụng một cái gì đó như allow.js. Trình duyệt chỉ yêu cầu những gì nó cần. Hãy tưởng tượng bạn phải tải tất cả mọi thứ cùng một lúc ...
Aran Mulholland

2
Đây là câu trả lời đúng và một câu hỏi mà hầu hết các nhà bình luận dường như đang thiếu - để máy chủ chủ động gửi tài nguyên, nó cần biết chúng là gì, có nghĩa là máy chủ sẽ phải phân tích cú pháp HTML.

1
Nhưng câu hỏi hỏi tại sao máy chủ web không gửi tài nguyên, không phải tại sao khách hàng không thể yêu cầu chúng cùng một lúc. Thật dễ dàng để tưởng tượng một thế giới nơi các máy chủ có một gói các tài sản liên quan được gửi cùng nhau mà không dựa vào phân tích HTML để xây dựng gói.
David Meister

@DavidMeister Bởi vì máy chủ không phải lúc nào cũng biết khách hàng muốn gì - một người lập trình web cho công cụ tìm kiếm có thể không quan tâm đến CSS / JS và có nhiều tài nguyên khác được liên kết trong một tài liệu ngoài những tài liệu đó - không cần phải gửi toàn bộ Nguồn cấp dữ liệu RSS trong gói xuống trình duyệt web (hầu hết nội dung có thể đã có trong HTML), trong khi trình đọc nguồn cấp dữ liệu có thể phân tích thành <head>phần tìm kiếm các liên kết thay thế RSS để tìm ra - khách hàng có thể gửi danh sách những gì nó quan tâm, nhưng sau đó nó cần phải biết những gì có sẵn và chúng tôi trở lại từ đầu
Zhaph - Ben Duguid

@ Zhaph-BenDuguid Tôi đang nói về một thế giới khác, để làm nổi bật rằng câu trả lời có liên quan nhiều đến cách thức giao thức hoạt động như mọi thứ khác. Ngoài ra, máy chủ có thể gửi tất cả dữ liệu cùng một lúc nhanh hơn ngay cả khi không cần thiết. Về cơ bản, bạn đang giao dịch với các vấn đề về độ trễ đối với việc sử dụng băng thông.
David Meister

8

Bởi vì, trong ví dụ của bạn, máy chủ web sẽ luôn gửi CSS và hình ảnh bất kể máy khách đã có chúng hay chưa, do đó làm lãng phí rất nhiều băng thông (và do đó làm cho kết nối chậm hơn , thay vì nhanh hơn bằng cách giảm độ trễ, có lẽ là ý định của bạn). Lưu ý rằng các tệp CSS, JavaScript và hình ảnh thường được gửi với thời gian hết hạn rất dài vì chính xác lý do đó (vì khi bạn cần thay đổi chúng, bạn chỉ cần thay đổi tên tệp để buộc bản sao mới sẽ được lưu vào bộ nhớ cache trong một thời gian dài).

Bây giờ, bạn có thể cố gắng khắc phục sự lãng phí băng thông đó bằng cách nói " OK, nhưng máy khách có thể chỉ ra rằng nó đã có một số tài nguyên đó, vì vậy máy chủ sẽ không gửi lại ". Cái gì đó như:

GET /index.html HTTP/1.1
Host: www.example.com
If-None-Match: "686897696a7c876b7e"
Connection: Keep-Alive

GET /style.css HTTP/1.1
Host: www.example.com
If-None-Match: "70b26618ce2c246c71"

GET /image.png HTTP/1.1
Host: www.example.com
If-None-Match: "16d5b7c2e50e571a46"

Và sau đó chỉ nhận các tệp chưa thay đổi được gửi qua một kết nối TCP (sử dụng đường ống HTTP qua kết nối liên tục). Và đoán xem? Đó là cách nó đã hoạt động (bạn cũng có thể sử dụng If-Modified-Because thay vì If-none-Match ).


Nhưng nếu bạn thực sự muốn giảm độ trễ bằng cách lãng phí nhiều băng thông (như trong yêu cầu ban đầu của bạn), bạn có thể thực hiện điều đó ngay hôm nay bằng cách sử dụng HTTP / 1.1 tiêu chuẩn khi thiết kế trang web của mình. Lý do hầu hết mọi người không làm điều đó là vì họ không nghĩ rằng nó đáng giá.

Để làm điều đó, bạn không cần phải có CSS ​​hoặc JavaScript trong tệp riêng biệt, bạn có thể đưa chúng vào tệp HTML chính bằng cách sử dụng <style><script>thẻ (bạn có thể không cần phải làm thủ công, công cụ mẫu của bạn có thể tự động làm điều đó) . Bạn thậm chí có thể bao gồm hình ảnh trong tệp HTML bằng URI dữ liệu , như thế này:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

Tất nhiên, mã hóa base64 làm tăng mức sử dụng băng thông một chút, nhưng nếu bạn không quan tâm đến việc lãng phí băng thông, thì đó không phải là vấn đề.

Bây giờ, nếu bạn thực sự quan tâm, bạn thậm chí có thể làm cho các tập lệnh web của mình đủ thông minh để tận dụng tốt nhất cả hai thế giới: theo yêu cầu đầu tiên (người dùng không có cookie), gửi mọi thứ (CSS, JavaScript, hình ảnh) chỉ được nhúng trong một HTML duy nhất tệp như được mô tả ở trên, thêm thẻ liên kết rel = "prefetch" cho các bản sao bên ngoài của tệp và thêm cookie. Nếu người dùng đã có cookie (ví dụ: anh ta đã truy cập trước đó), thì hãy gửi cho anh ta một HTML thông thường <img src="example.jpg">, <link rel="stylesheet" type="text/css" href="style.css">v.v.

Vì vậy, trong lần truy cập đầu tiên, trình duyệt sẽ chỉ yêu cầu một tệp HTML và nhận và hiển thị mọi thứ. Sau đó, nó sẽ (khi nhàn rỗi) tải trước CSS, JS, hình ảnh bên ngoài. Lần tới khi người dùng truy cập, trình duyệt sẽ yêu cầu và chỉ nhận tài nguyên thay đổi (có thể chỉ là HTML mới).

Dữ liệu hình ảnh CSS + JS + bổ sung sẽ chỉ được gửi hai lần, ngay cả khi bạn nhấp vào hàng trăm lần trên trang web. Tốt hơn nhiều so với hàng trăm lần như đề xuất giải pháp của bạn đề xuất. Và nó sẽ không bao giờ (không phải lần đầu tiên, cũng không phải lần sau) sử dụng nhiều hơn một chuyến đi khứ hồi tăng độ trễ.

Bây giờ, nếu điều đó nghe có vẻ quá nhiều công việc và bạn không muốn đi với một giao thức khác như SPDY , thì đã có các mô-đun như mod_pagespeed cho Apache, có thể tự động thực hiện một số công việc đó cho bạn (hợp nhất nhiều tệp CSS / JS thành một, tự động nội tuyến CSS nhỏ và thu nhỏ chúng, tạo các điểm giữ chỗ nhỏ trong khi chờ tải bản gốc, tải hình ảnh lười biếng, v.v.) mà không yêu cầu bạn sửa đổi một dòng trang web của bạn.


3
Tôi nghĩ rằng đây là những câu trả lời đúng.
el.pescado

7

HTTP2 dựa trên SPDY và ​​thực hiện chính xác những gì bạn đề xuất:

Ở mức cao, HTTP / 2:

  • là nhị phân, thay vì văn bản
  • được ghép hoàn toàn, thay vì ra lệnh và chặn
  • do đó có thể sử dụng một kết nối cho song song
  • sử dụng nén tiêu đề để giảm chi phí
  • cho phép các máy chủ chuyển đổi các câu trả lời của chủ động vào các bộ đệm của khách hàng

Nhiều hơn có sẵn trên HTTP 2 Faq


3

Bởi vì nó không cho rằng những điều này thực sự cần thiết .

Giao thức không xác định bất kỳ xử lý đặc biệt nào cho bất kỳ loại tệp hoặc tác nhân người dùng cụ thể nào. Nó không biết sự khác biệt giữa, giả sử, tệp HTML và hình ảnh PNG. Để thực hiện những gì bạn yêu cầu, máy chủ Web sẽ phải xác định loại tệp, phân tích nó để tìm ra các tệp khác mà nó tham chiếu và sau đó xác định các tệp khác thực sự cần thiết, dựa trên những gì bạn định làm các tập tin . Có ba vấn đề lớn với điều này.

Vấn đề đầu tiên là không có cách tiêu chuẩn, mạnh mẽ để xác định các loại tệp ở cuối máy chủ . HTTP quản lý thông qua cơ chế Kiểu Nội dung, nhưng điều đó không giúp ích gì cho máy chủ, mà phải tự mình tìm ra công cụ này (một phần để nó biết phải đưa gì vào Loại Nội dung). Phần mở rộng tên tệp được hỗ trợ rộng rãi, nhưng dễ vỡ và dễ bị lừa, đôi khi vì mục đích xấu. Siêu dữ liệu hệ thống tập tin ít dễ vỡ hơn, nhưng hầu hết các hệ thống không hỗ trợ nó rất tốt, vì vậy các máy chủ thậm chí không bận tâm. Việc đánh hơi nội dung (như một số trình duyệt và filelệnh Unix cố gắng thực hiện) có thể mạnh mẽ nếu bạn sẵn sàng làm cho nó đắt tiền, nhưng việc đánh hơi mạnh mẽ là quá đắt đối với phía máy chủ và việc đánh hơi giá rẻ không đủ mạnh.

Vấn đề thứ hai là phân tích một tệp rất tốn kém, nói theo cách tính toán . Điều này liên quan đến phần đầu tiên, theo đó bạn cần phân tích tệp theo một loạt các cách tiềm năng khác nhau nếu bạn muốn đánh hơi nội dung một cách mạnh mẽ, nhưng nó cũng áp dụng sau khi bạn xác định loại tệp, bởi vì bạn cần để tìm ra những gì các tài liệu tham khảo là. Điều này không tệ lắm khi bạn chỉ thực hiện một vài tệp cùng một lúc, giống như trình duyệt, nhưng một máy chủ Web phải xử lý hàng trăm hoặc hàng nghìn yêu cầu cùng một lúc. Điều này cộng lại, và nếu nó đi quá xa, nó thực sự có thể làm mọi thứ chậm lại hơn nhiều yêu cầu. Nếu bạn đã từng truy cập một liên kết từ Slashdot hoặc các trang web tương tự, chỉ để thấy rằng máy chủ đang hoạt động chậm do sử dụng nhiều, bạn đã thấy nguyên tắc này hoạt động.

Vấn đề thứ ba là máy chủ không có cách nào để biết bạn định làm gì với tệp . Một trình duyệt có thể cần các tệp được tham chiếu trong HTML, nhưng nó có thể không, tùy thuộc vào bối cảnh chính xác mà tệp đang được thực thi. Điều đó đủ phức tạp, nhưng có nhiều thứ hơn với Web ngoài các trình duyệt: giữa các trình thu thập dữ liệu, trình tổng hợp nguồn cấp dữ liệu và các bản hòa trộn quét trang, có nhiều loại tác nhân người dùng không cần các tệp được tham chiếu trong HTML : chúng chỉ quan tâm đến bản thân HTML. Gửi các tệp khác này cho các tác nhân người dùng như vậy sẽ chỉ lãng phí băng thông.

Điểm mấu chốt là việc tìm ra các phụ thuộc này ở phía máy chủ có nhiều rắc rối hơn giá trị của nó . Vì vậy, thay vào đó, họ để cho khách hàng tìm ra những gì nó cần.


Nếu chúng ta sẽ phát triển một giao thức mới hoặc sửa một giao thức đã tồn tại, chúng ta có thể xử lý tất cả các vấn đề này bằng cách này hay cách khác! Và máy chủ web sẽ phân tích các tệp chỉ một lần và sau đó nó có thể phân loại chúng tùy thuộc vào các quy tắc được xác định để có thể ưu tiên các tệp nào sẽ gửi trước..vv và máy chủ web không phải biết tôi dự định làm gì với các tệp đó, bạn chỉ cần biết phải gửi gì, Khi nào nên làm và tùy thuộc vào quy tắc nào .. (bot web và trình thu thập dữ liệu không phải là vấn đề, hành vi sẽ khác với chúng - chúng có các tiêu đề tác nhân người dùng duy nhất- ..)
Ahmed

@AhmedElsobky: Những gì bạn đang nói về âm thanh giống như một triển khai cụ thể hơn là một giao thức mạng. Nhưng nó thực sự phải biết bạn định làm gì với các tệp trước khi có thể xác định những gì sẽ gửi: nếu không chắc chắn nó sẽ gửi các tệp mà nhiều người dùng không muốn. Bạn không thể tin tưởng các chuỗi Tác nhân người dùng, vì vậy bạn không thể sử dụng chúng để xác định mục đích của người dùng là gì.
Chiếc thìa ngon nhất
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.