Ở bài trước của Series Nhập môn mạng máy tính, chúng ta đã tìm hiểu về tổng quan của tầng Ứng dụng trong mô hình TCP/IP. Trong bài này chúng ta sẽ bắt đầu đi sâu vào tìm hiểu về các thành phần của Tầng Ứng dụng. Đầu tiên là về HTTP.
Kết nối bền vững và không bền vững là gì?
Giao thức Hypertext Transfer Protocol (HTTP) là một giao thức tầng ứng dụng sử dụng TCP làm phương tiện truyền tải cơ bản và thường chạy trên cổng 80. HTTP là một giao thức không trạng thái, tức là máy chủ không lưu trữ thông tin về các yêu cầu trước đây của máy khách.
Kết nối HTTP gồm có 2 loại:
- Không bền vững (HTTP 1.0)
- Bền vững (HTTP 1.1)
Trước khi bắt đầu với kết nối HTTP bền vững và không bền vững, chúng ta sẽ bắt đầu với một số khái niệm cơ bản trước.
Web và giao thức HTTP
Trước những năm đầu thập niên 1990, giới nghiên cứu, giáo dục, và sinh viên chủ yếu sử dụng Internet để truy cập vào các thiết bị từ xa, truyền tập tin, nhận và gửi tin tức hoặc thư điện tử. Mặc dù các ứng dụng này khá đắc dụng, nhưng Internet vẫn ít được bên ngoài biết đến. Từ năm 1991, một ứng dụng mới xuất hiện, gọi là World Wide Web.
Web là ứng dụng Internet đầu tiên thu hút sự quan tâm công chúng. Nó đã thay đổi một cách sâu sắc và vẫn đang tiếp tục thay đổi, cách thức con người tương tác với bên trong và bên ngoài môi trường làm việc của họ. Nó đã nâng Internet trở thành mạng quan trọng nhất trong tất cả các mạng máy tính đang tồn tại.
Điểm hấp dẫn nhất của Web là đáp ứng theo yêu cầu. Người dùng nhận được cái họ cần, vào thời điểm họ muốn. Điểm này không giống như vô tuyến truyền thanh hay vô tuyến truyền hình, khi người ta muốn nghe hoặc xem thì phải mở đài vào lúc chương trình được phát, và chỉ nhận được nội dung nhà đài phát. Mọi người đều có thể xuất bản thông tin lên Web với chi phí rất thấp.
Tổng quan về HTTP
HyperText Transfer Protocol (HTTP), giao thức tầng ứng dụng của Web, là thành phần trung tâm của Web. Được mô tả trong RFC 1945, RFC 2616 và RFC 7540, HTTP được triển khai ở hai chương trình: chương trình khách và chương trình chủ. HTTP định nghĩa cấu trúc của các thông điệp, và cách thức mà máy chủ và máy khách sẽ trao đổi thông điệp với nhau. Trước khi giải thích chi tiết về giao thức HTTP, chúng ta cần xem qua các thuật ngữ Web.
Trang web (web page) bao gồm nhiều đối tượng (objects). Đơn giản, một đối tượng được chứa trong một tập tin – như tập tin định dạng HTML, tập tin ảnh định dạng JPEG, tập tin chứa Java Applet, hay tập tin chứa một đoạn phim – tập tin này có thể được định vị bằng một URL (viết tắt của Universal Resource Locator). Đa số các trang web bao gồm một tập tin HTML cơ sở và tham chiếu đến nhiều đối tượng.
Ví dụ, nếu một trang web chứa văn bản định dạng HTML và năm ảnh định dạng JPEG, thì trang web này gồm sáu đối tượng: tập tin HTML cơ sở và năm tập tin ảnh. Tập tin HTML cơ sở tham chiếu đến các đối tượng khác bằng các địa chỉ URL đến các đối tượng. Mỗi địa chỉ URL có hai thành phần: tên của máy tính chứa đối tượng và đường dẫn của đối tượng. Ví dụ, địa chỉ URL: http://www.someSchool.edu/someDepartment/picture.gif
Với www.someSchool.edu là tên thiết bị chủ và /someDepartment/ là đường dẫn đến thư mục chứa tập tin ảnh picture.gif.
Sự tương tác giữa chương trình khách và chương trình chủ tổng quát được minh họa trong hình sau đây.
Giao thức HTTP sử dụng TCP như một giao thức truyền thông nền. Trước tiên, chương trình khách khởi tạo một kết nối TCP đến trình chủ Web. Khi kết nối TCP đã được thiết lập, tiến trình của chương trình khách và tiến trình của trình chủ Web gửi/nhận dữ liệu nhờ kết nối TCP thông qua socket tương ứng ở mỗi tiến trình. Đặc tính TCP là cung cấp một dịch vụ truyền dữ liệu đáng tin cậy cho HTTP.
Ưu điểm của kiến trúc phân tầng được thể hiện ở đây là HTTP không cần quan tâm đến việc mất dữ liệu hoặc cách TCP phục hồi dữ liệu đã mất hay sắp xếp lại trật tự các gói tin. Đó là việc của TCP và các giao thức ở các tầng thấp hơn trong chồng giao thức.
Tiến trình chủ gửi các tập tin được yêu cầu đến các tiến trình khách, mà không lưu lại bất kì thông tin trạng thái nào của tiến trình khách. Nếu một tiến trình khách nào đó yêu cầu nhận cùng một đối tượng lần thứ hai trong vòng vài giây, thì tiến trình chủ vẫn gửi lại các đối tượng đó, bởi nó không biết trước đây nó đã từng làm những gì. Vì tiến trình chủ không quản lý bất kỳ thông tin nào về các tiến trình khách, giao thức HTTP được gọi là một giao thức phi trạng thái (stateless protocol).
Kết nối bền vững và không bền vững
Trong các ứng dụng Internet, tiến trình khách và tiến trình chủ truyền thông với nhau theo từng chập, trong đó tiến trình khách phát ra một chuỗi các yêu cầu và tiến trình chủ đáp ứng lại các yêu cầu này. Tùy loại ứng dụng và cách thức ứng dụng được dùng, chuỗi yêu cầu từ tiến trình khách có thể được thực hiện liên tiếp nhau, định kỳ, hoặc không liên tục.
Khi tương tác khách – chủ diễn ra trên nền giao thức TCP, người phát triển ứng dụng cần đưa ra một quyết định quan trọng: mỗi cặp yêu cầu/phản hồi sẽ sử dụng một kết nối TCP riêng, hay tất cả các yêu cầu và phản hồi sẽ sử dụng chung một kết nối TCP.
Theo cách đầu tiên, ứng dụng được cho là dùng kết nối không bền vững (non-persistent connections), còn theo cách sau thì ứng dụng được cho là sử dụng kết nối bền vững (persistent connections). Để hiểu sâu về điểm thiết kế này, phần sau sẽ khảo sát về những thuận lợi và bất lợi của cách kết nối trong giao thức HTTP. Mặc dù HTTP sử dụng cách kết nối bền vững làm mặc định, nhưng các chương trình khách và chủ có thể lựa chọn cách kết nối không bền vững để thay thế.
Round-trip time – RTT
Round-trip time hay RTT là thời gian mà một gói tin nhỏ đi từ tiến trình khách đến tiến trình chủ và quay ngược lại tiến trình khách. Được tính bằng công thức sau:
RTT= 2*propagation time
(propagation time = thời gian lan truyền gói tin)
HTTP và các giao thức không bền vững
Phần này xem xét việc truyền một trang Web từ máy chủ đến máy khách, sử dụng kết nối không bền vững. Giả sử có một trang web cần được truyền từ máy chủ đến máy khách, và trang web này chứa một tập tin HTML và 10 ảnh JPEG, cả 11 đối tượng này cùng được lưu trên cùng một server. Giả sử trang web cần truy cập có địa chỉ:
http://www.someSchool.edu/someDepartment/home.index
Sau đây là quá trình thực hiện từng bước:
- Tiến trình khách khởi tạo một kết nối TCP đến máy chủ
www.someSchool.edu
đang chờ tại cổng 80, đó là số hiệu cổng mặc định cho ứng dụng web dùng HTTP. Liên kết với kết nối TCP này là một socket ở phía tiến trình chủ và một socket ở phía tiến trình khách. - Tiến trình khách gửi một thông điệp yêu cầu đến tiến trình chủ qua socket của nó (tức tiến trình khách). Thông điệp yêu cầu chứa đường dẫn
/someDepartment/home.index
(chi tiết thông điệp yêu cầu sẽ được trình bày chi tiết ở bên dưới). - Tiến trình chủ nhận được thông điệp yêu cầu từ socket của nó, lấy tập tin
/someDepartment/home.index
đang được lưu trong không gian lưu trữ (trên RAM hoặc trên đĩa cứng), đóng gói tập tin này vào thông điệp phản hồi, và gửi thông điệp phản hồi đến tiến trình khách thông qua socket của tiến trình chủ. - Tiến trình chủ yêu cầu TCP đóng kết nối TCP (TCP sẽ đợi cho đến khi tiến trình khách nhận toàn bộ thông điệp phản hồi).
- Tiến trình khách nhận thông điệp phản hồi. Kết nối TCP được hủy bỏ. Thông điệp xác định đối tượng được đóng gói kèm theo nó là một tập tin HTML. Tiến trình khách tách nội dung HTML từ thông điệp phản hồi thành tập tin HTML, kiểm tra tập tin HTML này, và tìm các tham chiếu đến 10 đối tượng ảnh JPEG.
- Bốn bước đầu được lặp lại cho mỗi đối tượng ảnh JPEG.
Khi trình duyệt nhận được trang Web, nó sẽ hiển thị trang đó cho người dùng. Các trình duyệt khác nhau có thể diễn giải (nghĩa là hiển thị cho người dùng) một trang Web theo những cách hơi khác nhau. HTTP không liên quan gì đến cách một trang Web được hiển thị trên chương trình khách. Các đặc tả kỹ thuật HTTP (RFC 1945 và RFC 7540) chỉ định nghĩa giao thức làm việc giữa chương trình HTTP máy khách và HTTP chương trình máy chủ.
Còn một vấn đề làm rõ ở trên là 10 tập tin JPEG sẽ được truyền trên 10 kết nối TCP nối tiếp nhau, hay có vài kết nối kết nối TCP song hành. Thực ra người dùng có thể điều chỉnh cấu hình cho trình duyệt để thiết đặt mức độ cho phép kết nối song hành. Trong chế độ mặc định, đa số các trình duyệt cho phép mở từ 5 đến 10 kết nối TCP song hành, mỗi một kết nối này xử lý một giao dịch yêu cầu – phản hồi.
Người dùng vẫn có thể thiết đặt số kết nối song hành tối đa thành một, nghĩa là các kết nối TCP được thực hiện nối tiếp nhau nhưng việc dùng các kết nối song hành giúp rút ngắn thời gian phản hồi.
Trước khi tiếp tục, hãy ước lượng thời gian tiêu tốn từ khi tiến trình khách gửi yêu cầu cho đến khi nó nhận được toàn bộ tập tin HTML cơ sở. Gọi RTT (round-trip time) là thời gian mà một gói tin nhỏ đi từ tiến trình khách đến tiến trình chủ và quay ngược lại tiến trình khách. Xét các sự việc xảy ra khi người dùng nhấn chọn một liên kết trên web.
Như ở hình sau, trình duyệt khởi tạo một kết nối TCP giữa nó và máy chủ web, quá trình này thực hiện một thủ tục “bắt tay ba bước” đó là tiến trình khách gửi một phân đoạn TCP (TCP segment) đến cho tiến trình chủ để xin thiết lập kết nối; sau đó tiến trình chủ xác nhận lại (sự cho phép thiết lập kết nối TCP) bằng một gói tin TCP khác gửi ngược về tiến trình khách; và cuối cùng tiến trình khách xác nhận lại (đã biết tin) với tiến trình chủ.
Hai bước đầu trong quá trình “bắt tay ba bước” chiếm một RTT. Sau khi hai bước này hoàn tất, tiến trình trình duyệt thực hiện bước cuối kết hợp với việc gửi một thông điệp yêu cầu của HTTP. Khi thông điệp yêu cầu đến tiến trình chủ, tiến trình chủ gửi tập tin HTML vào kết nối TCP. Lần yêu cầu/phản hồi này của HTTP chiếm thêm một RTT nữa. Tổng thời gian phản hồi là hai RTT cộng thêm thời gian tiến trình chủ truyền tập tin HTML về tiến trình trình duyệt.
total = 2RTT+transmit time
HTTP và các giao thức bền vững
Kết nối không bền vững có điểm bất tiện. Đầu tiên là phải thiết lập và duy trì kết nối mới cho mỗi đối tượng được yêu cầu. Với mỗi kết nối, hệ điều hành phải cấp phát bộ nhớ đệm cho kết nối TCP và bộ nhớ cho các biến của TCP ở cả tiến trình khách và tiến trình chủ. Khi có hàng trăm tiến trình khách đồng thời kết nối đến tiến trình chủ, bộ nhớ cần cấp phát này là một gánh nặng đối với máy chủ web. Thứ hai là mỗi đối tượng làm tiêu tốn 2 RTT, một cho thiết lập kết nối TCP và một cho yêu cầu và nhận lại đối tượng.
Với cách kết nối bền vững, tiến trình chủ vẫn giữ lại kết nối TCP sau khi gửi xong thông điệp phản hồi. Các thông điệp yêu cầu và phản hồi tiếp đến của cùng cặp tiến trình khách và chủ này sẽ được gửi trên chính kết nối này. Cụ thể toàn bộ trang web (ở ví dụ trên, một tập tin HTML và 10 tập tin ảnh) có thể được gửi trên một kết nối TCP bền vững. Hơn nữa, nếu có nhiều trang web trên một máy chủ cần được gửi đến cùng một tiến trình khách thì có thể sử dụng cùng một kết nối TCP bền vững.
Ở phía tiến trình khách, các thông điệp yêu cầu có thể được phát ra hàng loạt, mà không cần phải chờ phản hồi của các yêu cầu đã phát ra trước đó (lối này gọi là pipelining). Thông thường, tiến trình chủ sẽ quyết định đóng kết nối TCP một khi kết nối đó không được sử dụng trong một khoảng thời gian nhất định (có thể thiết đặt thông số khoảng thời gian này cho chương trình chủ web). Mặc định, HTTP sử dụng cách kết nối bền vững kết hợp với lối phát ra thông điệp yêu cầu hàng loạt mà không cần đợi phản hồi.
Tổng kết
Phần này đã khép lại cùng với kiến thức về Kết nối bền vững và không bền vững trong HTTP. Phần sau chúng ta sẽ tìm hiểu về các thành phần khác của HTTP.