Tớ viết bài này khi tớ đang tìm hiểu về hạ tầng mạng của một số hệ thống mà mình tham gia xây dựng. Nó note lại một số điểm mà cảm thấy cần lưu ý khi tìm hiểu về những vấn đề này nên nó chỉ đề cập đến một số vấn đề mấu chốt mà t quan tâm. Nếu bạn muốn biết đầy đủ thì hãy đọc tài liệu hoặc bài báo chính thức của các giao thức này ở một nguồn tin cậy hoặc chính tác giả của giao thức này.
TCP là gì ?
Đơn giản nó là 1 giao thức mạng, định nghĩa cách mà mạng gửi và nhận gói tin
- TCP nằm ở tầng thứ 4(tầng giao vận)
Trong mô hình mạng nổi tiếng 7 tầng OSI:
Tầng giao vận cung cấp một số dịch vụ chuyên dụng để chuyển dữ liệu giữa các người dùng tại đầu cuối(end point), nhờ đó các tầng trên không phải quan tâm đến việc cung cấp dịch vụ truyền dữ liệu đáng tin cậy và hiệu quả. Tầng giao vận kiểm soát độ tin cậy của một kết nối được cho trước. Một số giao thức có định hướng trạng thái và kết nối (state and connection orientated). Có nghĩa là tầng giao vận có thể theo dõi các gói tin và truyền lại các gói bị thất bại. Một ví dụ điển hình của giao thức tầng 4 là TCP. Tầng này là nơi các thông điệp được chuyển sang thành các gói tin TCP hoặc UDP. (Có thể bạn sẽ quan tâm đến UDP được ứng dụng rất nhiều trong các ứng dụng theo dõi vị trí thời gian thực giống như Uber hoặc Grab, hoặc trong game online thời gian thực như LOL (liên minh huyền thoại), hoặc các dịch vụ stream video như netflix).
- Hoạt động của giao thức:
- Thiết lập kết nối
- Truyền dữ liệu
- Kết thúc kết nối
Cấu trúc của gói tin TCP
Để có thể lập trình được thì bạn cần quan tâm đến cấu trúc của gói tin TCP
Cấu trúc gồm 2 phần
- Header 20 Byte đầu tiên
- Data những byte còn lại
Header TCP có độ dài là 20 Byte = 160 bit
- Source port
Số hiệu của cổng tại máy tính gửi.
- Destination port
Số hiệu của cổng tại máy tính nhận.
- Sequence number
Trường này có 2 nhiệm vụ. Nếu cờ SYN bật thì nó là số thứ tự gói ban đầu và byte đầu tiên được gửi có số thứ tự này cộng thêm 1. Nếu không có cờ SYN thì đây là số thứ tự của byte đầu tiên.
- Acknowledgement number
Nếu cờ ACK bật thì giá trị của trường chính là số thứ tự gói tin tiếp theo mà bên nhận cần.
- Data offset
Trường có độ dài 4 bít quy định độ dài của phần header (tính theo đơn vị từ 32 bít). Phần header có độ dài tối thiểu là 5 từ (160 bit) và tối đa là 15 từ (480 bít).
- Reserved
Dành cho tương lai và có giá trị là 0.
- Flags (hay Control bits)
Bao gồm 6 cờ:
- URG
Cờ cho trường Urgent pointer
- ACK
Cờ cho trường Acknowledgement
- PSH
Hàm Push
- RST
Thiết lập lại đường truyền
- SYN
Đồng bộ lại số thứ tự
- FIN
Không gửi thêm số liệu
- Window
Số byte có thể nhận bắt đầu từ giá trị của trường báo nhận (ACK)
- Checksum
16 bít kiểm tra cho cả phần header và dữ liệu. Phương pháp sử dụng được mô tả trong RFC 793:
16 bít của trường kiểm tra là bổ sung của tổng tất cả các word 16 bít trong gói tin. Trong trường hợp số octet (khối 8 bít) của header và dữ liệu là lẻ thì octet cuối sẽ được bổ sung với các bít 0. Các bít này không được truyền. Khi tính tổng, giá trị của trường kiểm tra và được thay thế bằng 0,
Nói một cách khác, tất cả các từ 16 bít sẽ được cộng với nhau. Kết quả thu được sau khi đảo giá trị từng bít được điền vào trường kiểm tra. Về mặt thuật toán, điều này giống với IPv4.
Điểm khác nhau chỉ ở chỗ dữ liệu dùng để tính tổng kiểm tra.
Các địa chỉ nguồn và cả đích là các địa chỉ IPv4. Giá trị của trường protocol là 6 (giá trị dành cho TCP: Danh sách số hiệu giao thức IPv4). Giá trị của trường TCP length field là độ dài của toàn bộ phần header và dữ liệu của gói TCP.
- Urgent pointer
Nếu cờ URG bật thì giá trị trường này chính là số từ 16 bít mà số thứ tự gói tin (sequence number) cần dịch trái.
- Options
Đây là trường tùy chọn. Nếu có thì độ dài là bội số của 32 bít.
- Dữ liệu
Trường cuối cùng không thuộc về header. Giá trị của trường này là thông tin dành cho các tầng trên (trong mô hình 7 lớp). Thông tin về giao thức của tầng bên trên không được chỉ rõ trong phần header mà nó phụ thuộc vào cổng được chọn.
Nguồn: wiki