Sunday 9 June 2013

HTTP transaction overview

Requests

Gõ địa chỉ URL như sau vào browser : http://hypothetical.ora.com:80/
Browser sẽ phân tích URL như sau:
http:// Sử dụng HTTP (Hypertext Transfer Protocol)
hypothetical.ora.com Hostname của server sẽ liên hệ
:80 Kết nối vào port 80. Port range từ 1-65535, mặc định nếu không ghi rõ :port theo sau thì browser sẽ sử dụng port 80
Đường dẫn thư mục
Do đó browser sẽ kết nối đến hypothetical.ora.com port 80 sử dụng giao thức HTTP. Request header sẽ như sau:
1.     GET / HTTP/1.1
2.     Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
3.     Accept-Language: en-us
4.     Accept-Encoding: gzip, deflate
5.     User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)
6.     Host: hypothetical.ora.com
7.     Connection: Keep-Alive

Dòng 1: Sử dụng phương thức GET (còn nhiều phương thức khác nữa) để yêu cầu lấy document tại / , version của giao thức HTTP mà browser sử dụng.
Dòng 2: Loại tài liệu nào sẽ được browser chấp nhận.
Dòng 3: Chỉ ra ngôn ngữ sử dụng (ở đây là English). Có thể khai báo nhiều loại ngôn ngữ nếu trên server có cùng một loại tài liệu mà có nhiều ngôn ngữ khác nhau.
Dòng 4: Xác định thuật toán compress nào mà client có thể hiểu khi nhận response của server
Dòng 5: Thông tin về client, browser.
Dòng 6: nói với server rằng client ngĩ host name của server là như zậy. Header này bắt buộc trong HTTP 1.1, nhưng tùy chọn trong HTTP 1.0. Vì server có thể có nhiều hostname, client cần phải xác định hostname nào sẽ nhận được request. Trong trường hợp này web server có thể có nhiều cây tài liệu khác nhau cho mỗi hostname. Nếu client không xác định hostname thì server không thể xác định cây tài liệu nào sử dụng.
Dòng 7: nói với server giữ kết nối cho đến bảo ngắt kết nối thì thôi (đây là mặc định trong HTTP 1.1). Đối với HTTP 1.0 kết nối sẽ được đóng lại ngay sau khi client requeset.

Responses

Với request yêu cầu như trên, server sẽ tìm kiếm resource có liên quan đến “/” và trả nó về cho browser, resource liên quan đến URL phụ thuộc vào cách server được implemented. Đó có thể là file static hoặc dynamic. Ví dụ server trả về response như sau:
1.           HTTP/1.1 200 OK
2.           Date: Mon, 06 Dec 1999 20:54:26 GMT
3.           Server: Apache/1.3.6 (Unix)
4.           Last-Modified: Fri, 04 Oct 1996 14:06:11 GMT
5.           ETag: "2f5cd-964-381e1bd6"
6.           Accept-Ranges: bytes
7.           Content-length: 327
8.           Connection: close
9.           Content-type: text/html
10.          
11.         <title>Sample Homepage</title>
12.         <img src="/images/oreilly_mast.gif">
13.         <h1>Welcome</h1>
14.         Hi there, this is a simple web page.  Granted,
15.         it may not be as elegant as some other web
16.         pages you've seen on the net, but there are
17.         some common qualities:
18.          
19.         <ul>
20.         <li> An image,
21.         <li> Text,
22.         <li> and a <a href="/example2.html"> hyperlink. </a>
23.         </ul>
Từ dòng 1-9 là response header, phần còn lại là body (hay còn gọi là body of entity  hay entity-body)
Dòng 1: Giao thức HTTP mà server sử dụng. Theo sau là status code, ở đây là 200 cho biết tài liệu được tìm thấy và trả về cho client.
Dòng 2: Thời gian hiện tại của server, theo định dạng GMT
Dòng 3: Cho biết loại phần mêm nào server sử dụng, ở đây là Apache version 1.3.6 chạy trên Unix
Dòng 4: xác định thời gian chỉnh sửa gần nhất của tài liệu được request bởi client. Mục đích modification time là phục vụ cho việc caching, browser sẽ không cần request toàn bộ file đó nếu modification time của nó không thay đổi.
Dòng 5: xác định entity tag. Cái này cung cấp cho web client một số định danh duy nhất cho server resource. Rất khó cho 2 server resource khác nhau có cùng một entity tag. Đây là cơ chế mạnh mẽ cho việc caching.
Dòng 6: cho browser biết server có khả năng trả về một một phần (subsection) của tài liệu, thay vì trả về toàn bộ document mỗi khi được request. (This is useful for retrieving records in a document, which may be useful for database and streaming multimedia applications.) server cho biết khoảng chấp nhận request cho một resource (to indicate its acceptance of range request for a resource). Origin servers that accept byte-range request MAY send : Accept-Ranges: bytes
Dòng 7: cho client biết body kích thước bao nhiêu byte.
Dòng 8: xác định kết nối sẽ đóng sau khi server response. Nếu client muốn gửi một request khác thì nó phải mở một kết nối khác đến server.
Dòng 9: cho client biết loại tài liệu nào server trong response của nó. Ở đây là HTML.
Figure 1.1. A simple transaction

Structure of HTTP Transactions

Tổng quát hóa header của request và response, ta có 2 hình sau:
Figure 1.2. Structure of a client request

HTTP transaction không cần sử dụng hết tất cả các header. Có thể suy ra ta có thể thực hiện HTTP request mà không cần điền bất kì thông tin header nào cả. Ví dụ, trường hợp đơn giản nhất, request GET / HTTP/1.0 không cần bất kì header nào cũng đủ cho hầu hết các server hiểu được client.
HTTP requests thành phần tổng quát sau:
Dòng đâu tiên chỉ ra method mà client sử dụng, loại tài liệu (entity) được áp dụng lên, HTTP version mà client đang dùng. Method trong HTTP 1.1 có thể là GET, POST, HEAD, PUT, LINK, UNLINK, DELETE, OPTIONS, and TRACE. HTTP 1.0 không hỗ trợ OPTIONS và TRACE Không phải tất cả method đều được hỗ trợ bở server.
General message headers là optional headers được sử dụng cả trong client request và server response. Xác định những thông tin chung như thời gian hiện tại.
Request headers cho server biết thêm thông tin về client.
Entity headers được sử dụng khi một tài liệu (entity) được gửi đi. Nó chỉ ra những thông tin về entity như encoding scheme, length, type và origin.
Figure 1.3. Structure of a server response

Trong server response, general header và entity header giống với những gì được sử dụng trong client request. Entity-body giống trong client request, chỉ khác ở chỗ nó được sử dụng để response.
Dòng đầu tiên chỉ ra version HTTP mà server sử dụng. Server sẽ có gắng để phù hợp với version tương thích nhất của HTTP mà client đang dùng, status code chỉ ra kết quả của request, và reason-phrase là human-readable description của status code.