Hypertext Transfer Protocol
- Số cổng: 80
- Tầng giao thức: application
- Hình thức tấn công: MitM.
HTTP (Hypertext Transfer Protocol) là một giao thức thuộc tầng application giúp trao đổi các tệp siêu văn bản (Hyper text, chẳng hạn như HTML). Nó là nền tảng của bất kỳ sự trao đổi dữ liệu nào trên web do các tệp siêu văn bản có thể chứa tất cả các loại dữ liệu có thể có, chẳng hạn như hình ảnh, video, mp3, …
Giao thức này hoạt động dựa trên kiến trúc client-server.

Các phiên bản HTTP thấp hơn 3.0 đều sử dụng giao thức TCP, còn HTTP/3.0 trở lên sử dụng giao thức UDP.
Giả sử client yêu cầu một trang web, nếu HTTP sử dụng TCP, client sẽ khởi tạo một kết nối TCP đến server.

Sau khi server chấp nhận kết nối TCP từ client, giao thức HTTP sẽ được hoạt động (xảy ra các cặp yêu cầu - cung cấp trang web, xem thêm web site).
Khi HTTP hoạt động xong thì TCP sẽ đóng kết nối.
HTTP không duy trì việc lưu giữ các dữ liệu của client, vì vậy mà nó được gọi là stateless protocol.
Type of Connections
Non-persistent HTTP
Chỉ cho phép một đối tượng sử dụng một kết nối TCP, tức là khi client yêu cầu nhiều đối tượng thì sẽ cần phải mở nhiều kết nối TCP.

Toàn bộ thời gian phản hồi của giao thức HTTP cho mỗi đối tượng bao gồm:
- Một RTT để khởi tạo kết nối TCP.
- Một RTT cho HTTP request và vài byte đầu của HTTP response khi trả về.
- Thời gian vận chuyển.
Với RTT (Round Trip Time) là thời gian tính từ lúc gửi request cho đến lúc nhận được response.

Công thức tính thời gian phản hồi của giao thức HTTP thuộc loại non – persistent:

Persistent HTTP
Cho phép tải về nhiều đối tượng trên cùng một kết nối TCP (multiplexing - ghép kênh). Server sẽ cần phải phản hồi hết tất cả các yêu cầu thì mới được đóng kết nối.
Persistent HTTP còn có tên gọi khác là HTTP Keep-Alive.

Để tối ưu việc trao đổi dữ liệu, giao thức HTTP có thể gửi cùng lúc nhiều yêu cầu để nhận lại các phản hồi liên tiếp. Cách làm này được gọi là pipeline.

Persistent và pipeline chỉ có ở phiên bản HTTP/1.1 trở lên.
Ở phiên bản HTTP/2.0, client có thể sắp xếp thứ tự ưu tiên cho các tài nguyên cần tải về và cho phép server đẩy các tài nguyên quan trọng đến máy của client kể cả khi client chưa yêu cầu chúng.
HTTP Request Message
Cấu trúc gói tin request của giao thức HTTP được chia làm hai phần: header và body. Giữa header và body luôn có một dòng trống (đối với HTTP/1.1 trở xuống).
Mỗi dòng header đại diện cho một field khác nhau.
Trừ dòng đầu tiên thì tất cả các dòng header đều có thể đảo lộn thứ tự.

Dòng đầu tiên được gọi là request line, bao gồm:
- Tên phương thức (GET, POST, PUT, PATCH, DELETE, …).
- Có thể chứa URL của trang web.
- Phiên bản HTTP.
Request Methods
Với GET, thông tin gửi đi được nối trực tiếp vào sau URL (sử dụng query string). Còn với POST, thông tin nhận được sẽ được đặt trong phần body của response.
Phương thức PUT được dùng để sửa cả bộ dữ liệu (thay thế), phương thức PATCH để sửa từng thuộc tính đơn lẻ trong một bộ dữ liệu.
HTTP Response Message
Gói tin response cũng có hai phần, dòng đầu của header là status line, chứa status code. Ví dụ bên dưới có status code là 200.

Sau status line là các header line, tương tự request thì thứ tự giữa các field có thể đảo lộn.
Status Codes
Một số status code thường gặp:
- 1xx: response chỉ chứa thông tin, không phải là trang web.
- 2xx: thành công.
- 3xx: điều hướng, có thể xảy ra đối với các trang web có dùng cache.
- 4xx: lỗi phía client.
- 5xx: lỗi phía server.
Thông thường, ở lần request đầu tiên thì server sẽ phản hồi các mã 2xx. Sau đó, khi trang web được áp dụng Web Cache, mã phản hồi sẽ chuyển thành 3xx.
Carriage Return Line Feed
This is significant because CRLF sequences are used to separate headers and other elements in HTTP protocol.
The name “CRLF” comes from the special characters used to denote the end of a line in many text formats, specifically Carriage Return (CR, or \r) and Line Feed (LF, or \n).