TCP Header Lenght Analysis

Giới thiệu
Trường tiếp theo mà tôi muốn giới thiệu chính là TCP Header Length. Thật sự không có nhiều vấn đề để nói về Header Length ngoài việc giải thích nó đại diện cho cái gì và làm thế nào để giải thích được giá trị của nó. Nhưng thực sự trường này cũng là 1 trường rất quan trọng và bạn sẽ thấy được điều đó.
Bạn cũng có thể thấy Header Length cũng giống như trường Data Offset trong Packet Sniffer hay Application (là 1 cái tên khác nhưng thực chất cũng chính là Header Length).

Phân tích Header Length


Nếu bạn đã đọc bất kì 1 cuốn sách nào về Networking có nói về TCP Header, bạn hầu như sẽ tìm thấy mô tả cho trường này như sau: "Một số nguyên xác định độ dài của Segment Header là bội số của 32 bits". Nhưng khi nhìn vào gói tin, thì ta sẽ phải băn khoăn suy nghĩ điều đó chính xác muốn nói về cái gì?
Tôi sẽ giải thích cho các bạn hiểu rõ hơn theo từng bước một.


Bước 1 - "Header Length" là gì?
Trước khi chúng ta đi sâu vào phân tích ý nghĩa của các giá trị được sử dụng trong trường này, mà đối với mỗi gói tin thì lại có những giá trị khác nhau, chúng ta cần hiểu "Header Length" là gì?


Nhìn vào hình, phần màu xanh cho ta thấy những trường nào được tính vào trong giá trị của Header Length. Trong ví dụ này giá trị đó là 28 bytes (tổng chiều dài của phần màu xanh là 28 bytes).
Trường Header Length là rất cần thiết, vì trong TCP Header còn có cả trường TCP Options, trong trường TCP Options đó có các tùy chọn khác nhau mà có thể được sử dụng hoặc là không. Nói một cách khác, nếu không có Options nào được sử dụng thì giá trị của Header Length sẽ nhỏ hơn.
Nhìn vào ví dụ trên, ta có thể thấy TCP Options có giá trị là 'Yes', nghĩa là có nhiều tùy chọn ở trong trường này có thể được sử dụng trong kết nối hiện tại. Chi tiết hơn, chúng ta có thể nhìn thấy được các TCP Options được sử dụng, ở đây là 'Max Segment' và 'SACK OK'. Tôi sẽ phân tích rõ hơn về phần này ở bài khác, còn hiện tại, mức độ quan tâm của chúng ta sẽ chỉ dừng ở TCP Options có được sử dụng hay là không?
Khi việc nhận gói tin kết thúc, người nhận có thể biết được vị trí chính xác phần dữ liệu bắt đầu từ đâu qua việc đọc trường Header Length.
Trong trường hợp này, chúng ta thấy Data = 0 byte. Điều này là bình thường vì đây là gói tin bắt đầu của quá trình bắt tay 3 bước (cờ SYN = 1).

Bước 2 - Phân tích giá trị Header
Nhìn vào hình ở trên, ta có thể thấy trường Header Length trong gói tin mà ta bắt được có giá trị là 7 (hex) và nó có giá trị 28 bytes. Để tính ra được 28 bytes, ta lấy (7x32) / 8 = 28. Bây giờ thì câu nói ở đầu bài (Một số nguyên xác định độ dài của Segment Header là bội số của 32 bits) đã rõ ràng hơn rồi.
Dưới đây là ảnh chụp 1 gói tin được sniffer. Ở bên trái khung là phần TCP Header có chứa trường Header Length. Bên phải khung là nội dung của gói tin ở dạng hex.


Khi chúng ta chọn trường Header Length ở cột bên trái, chương trình sẽ tự động đánh dấu tương ứng với giá trị hex của Header Length ở khung bên phải. Giá trị hex '70' chính là giá trị của trường Header Length.
Xem lại hình vẽ đầu tiên của bài này, chúng ta thấy hình vẽ đó có đề cập đến độ dài của trường Header Length là 4 bits. Điều đó có nghĩa là khi xem giá trị của Header Length chúng ta sẽ chỉ thấy được 1 chữ số hoặc 1 ký tự được đánh dấu (tô màu), nhưng trong hình vẽ trên gói tin sniffer lại đánh dấu cả '7' và '0', làm chúng ta tưởng chừng như trường này có độ dài 8 bits.
Chú ý: Với hex, mỗi ký tự (ví dụ như '7') đại diện cho 4 bits. Điều này có nghĩa là ở khung bên phải, khi biểu diễn trường Header Length nên chỉ có ký tự '7' được đánh dấu, không phải là '70'.

Tổng kết
Trường Header Length rất đơn giản, nó cho phép bên nhận tính toán số lượng byte trong TCP Header. Đồng thời nó là bắt buộc vì không có nó thì chúng ta không thể xác định được vị trí của phần dữ liệu bắt đầu từ đâu.
Nói một cách logic, thì bất cứ nơi nào mà TCP Header kết thúc, thì đó chính là nơi dữ liệu bắt đầu. Vì vậy, nếu bạn muốn tìm nơi mà phần dữ liệu bắt đầu, bạn hãy đọc giá trị của trường Header Length ở trong TCP Header và bạn có thể tìm chính xác nơi dữ liệu bắt đầu từ đâu.

Lược dịch từ bài gốc: Click Here

Bài tiếp theo: TCP Flag Options





Không có nhận xét nào:

Đăng nhận xét