# I. Transmission Control Protocol (TCP)

## 1. **What is Transmission Control Protocol (TCP)?**

Giao thức TCP là giao thức mạng cung cấp khả năng truyền dữ liệu ổn định và đáng tin cậy giữa các ứng dụng. Theo mô hình OSI, nó nằm ở lớp thứ 4.

## **2. The Features of TCP Protocol**

* Đảm bảo việc truyền dữ liệu giữa hai ứng dụng.&#x20;
* Cho phép nhiều kết nối.&#x20;
* Không có chuyển dữ liệu trước khi kết nối được thiết lập.&#x20;
* Các định nghĩa ưu tiên và bảo mật có thể được thực hiện cho dữ liệu được gửi.&#x20;
* Thực hiện kiểm soát lỗi.&#x20;
* Cung cấp flow control.

## **3. Establishing the TCP Connection (Three-way Handshake)**

Kết nối TCP phải được thiết lập để truyền dữ liệu qua giao thức TCP.&#x20;

Việc thiết lập kết nối TCP cho biết cả người gửi và người nhận đều sẵn sàng truyền dữ liệu.&#x20;

Kết nối TCP được thiết lập trước khi truyền dữ liệu được gọi là "Bắt tay ba bước".&#x20;

Three-Way Handshake bao gồm các bước sau:&#x20;

* Bên gửi muốn thiết lập kết nối TCP sẽ gửi TCP segment được đặt thành "SYN" flag tới phía người nhận.&#x20;
* Sau khi nhận được segment này, bên nhận sẽ truyền TCP segment được đặt thành "SYN" và "ACK" flags cho người gửi.&#x20;
* Ở giai đoạn cuối cùng, phần người gửi của segment này sẽ gửi  TCP segment được đặt  "ACK" flag lại cho người nhận và kết nối được thiết lập.&#x20;

Hình ảnh bên dưới cho thấy cách thiết lập kết nối TCP giữa người gửi và người nhận:

<figure><img src="/files/hWbndsVb51oHDZiKSnFH" alt=""><figcaption></figcaption></figure>

Lưu ý: SYN and ACK Flags are 1 bit areas within the TCP protocol Header.

## **4. TCP Data Flow and Transmission Reliability**

Các phân đoạn được gửi trong giao thức TCP ở dạng dữ liệu 8 bit.&#x20;

Giao thức TCP theo dõi từng bit được gửi và nhận bằng cách đánh dấu nó.&#x20;

Nó chờ phản hồi từ người nhận đối với từng phần dữ liệu nó gửi bằng cách đánh dấu.&#x20;

Sau phản hồi từ người nhận, phần dữ liệu tiếp theo sẽ được gửi và theo cách tương tự, người nhận sẽ nhận được phản hồi cho phần dữ liệu tiếp theo được gửi.&#x20;

Với hệ thống đánh dấu này, giao thức TCP đảm bảo độ tin cậy truyền dẫn và truyền dữ liệu một cách đầy đủ và tuần tự.

Giao thức TCP đặt một số ngẫu nhiên trong quá trình thiết lập kết nối. Số này được gọi là "**Initial Sequence Number (ISN)**". Số này được sử dụng cho lần truyền dữ liệu đầu tiên trên kết nối TCP.&#x20;

Sau đó, các số mới được tạo bằng cách **cộng số byte được gửi trên số này**.&#x20;

Mỗi số mới xuất hiện này được gọi là "**Sequence Number**". Giao thức TCP biết liệu người nhận có nhận được phân đoạn hay không theo các số này.&#x20;

Ví dụ: trong hình ảnh bên dưới, nó được đặt là "ISN=0". Sau khi gửi segment kích thước byte "1024", xác nhận phân đoạn được truyền đến người gửi với số ACK từ người nhận và giá trị số thứ tự được cập nhật.&#x20;

Nếu segment có số ACK 1024 không đến từ người nhận, việc truyền dữ liệu sẽ không tiếp tục và phân đoạn TCP đã gửi trước đó sẽ được gửi lại và phân đoạn có số ACK 1024 dự kiến ​​sẽ đến.

<figure><img src="/files/gXI6zKT1OFN8BZvhIolz" alt=""><figcaption></figcaption></figure>

Giao thức TCP là giao thức mạng cung cấp đường truyền đáng tin cậy. Bắt tay ba bước được mô tả trong chủ đề trước là một trong những cơ chế đảm bảo độ tin cậy truyền trong giao thức TCP.&#x20;

Cơ chế chính đảm bảo độ tin cậy truyền của giao thức TCP dựa trên cấu trúc xác nhận xem mỗi phân đoạn TCP đã được gửi hay chưa.&#x20;

Nhờ việc gửi phân đoạn có hệ thống này, nếu có một phân đoạn TCP không thể gửi được vì bất kỳ lý do gì thì phân đoạn đó sẽ được gửi lại và giao cho bên nhận.&#x20;

Ví dụ: hình ảnh sau đây cho thấy giao thức TCP hoạt động như thế nào trong trường hợp có lỗi truyền tải:

<figure><img src="/files/lSPQaWOtMc7AtWDsoSr0" alt=""><figcaption></figcaption></figure>

## **5. Terminating TCP Connections**

Việc chấm dứt kết nối TCP diễn ra theo 4 bước:&#x20;

1. Bên muốn chấm dứt kết nối TCP sẽ gửi TCP segment có "FIN" flag được đặt cho thiết bị đích.&#x20;
2. Sau khi nhận được TCP segment , thiết bị đích sẽ thấy cờ "FIN" được đặt và gửi phân đoạn TCP có cờ "ACK" được đặt để phản hồi.&#x20;
3. Thiết bị đích gửi TCP segment có cờ "FIN" được đặt cho thiết bị muốn chấm dứt kết nối.&#x20;
4. Bước cuối cùng, thiết bị muốn chấm dứt kết nối sẽ gửi phân đoạn TCP có cờ "ACK" được đặt để phản hồi TCP segment đến và kết nối TCP bị chấm dứt.

<figure><img src="/files/abHEcNiqNXZAJFnCz91n" alt=""><figcaption></figcaption></figure>

Lưu ý: Cờ **FIN** và **ACK** là các trường 1 bit trong tiêu đề giao thức TCP. Các kết nối TCP cũng có thể được chấm dứt bằng cờ "**RST**". Kết nối TCP bị chấm dứt bằng cờ **RST** là kết nối chấm dứt ngay lập tức và một chiều. Nói cách khác, cờ "RST" được sử dụng để đặt lại kết nối.

## **6. TCP Connections**

Kết nối TCP thường được sử dụng bởi các ứng dụng truyền tải dựa trên TCP trên thiết bị. Một số thông tin về giao thức được sử dụng để các ứng dụng có thể kết nối với giao thức TCP. Mỗi kết nối TCP bao gồm thông tin "**Source IP Address-Source Port Number**", "**Destination IP Address-Destination Port Number**".

### **a. What is Port?**

Port là điểm giao tiếp mà các ứng dụng sử dụng để liên lạc với nhau.&#x20;

Nhiều dịch vụ có thể tồn tại trên một máy chủ cùng một lúc.&#x20;

Port numbers giúp làm rõ các yêu cầu gửi đến và cho chúng tôi biết chúng thuộc về dịch vụ nào.&#x20;

Port về cơ bản là một số có thể nhận giá trị trong khoảng "0-65535".&#x20;

Some port numbers được một số giao thức sử dụng theo mặc định. Số port và địa chỉ IP tạo thành một socket address.&#x20;

Ví dụ: biểu thức "192.168.5.100:8080"(IP\_Address:Port\_Number) chứa hai phần thông tin riêng biệt được phân tách bằng "**:**"&#x20;

* Địa chỉ IP&#x20;
* Port Number

### **b. Default TCP Ports**

Dưới đây là ví dụ về các cổng mặc định cho các giao thức phổ biến nhất:

* FTP : 21
* SSH : 22
* Telnet : 23
* SMTP : 25
* DNS : 53
* HTTP : 80
* POP3 : 110
* SMB : 445

Default Ports: <https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers>

## 7. **TCP Protocol Header**

Có rất nhiều data fields cụ thể của giao thức trong phần header của giao thức TCP. Những trường dữ liệu này chứa tất cả thông tin cần thiết cho giao thức TCP.&#x20;

Hình ảnh dưới đây hiển thị header và các trường của giao thức TCP.

<figure><img src="/files/e8vbDPaydgNQDSTpAv3c" alt=""><figcaption></figcaption></figure>

* **Source Port Number** là trường bao gồm port number của người gửi. Nó dài "16 bit".
* **Destination Port Number** là trường bao gồm port number của người nhận. Nó dài "16 bit".
* **Sequence Number** là số được sử dụng để theo dõi việc truyền các TCP segment. Nếu cờ "SYN" được đặt trong TCP segment thì số này là giá trị "**Initial Sequence Number**". Nó dài "32 bit".
* **Acknowledgement Number** là một giá trị cho biết việc truyền các segment đã gửi được thực hiện đến byte nào. Nó dài "32 bit".
* **Header Length** là trường chứa giá trị độ dài tiêu đề TCP. Nó dài "4 bit".
* **Reserved -** Đây là trường được dành riêng để sử dụng trong tương lai. Nó dài "3 bit".
* **Control Flags -** là trường lưu giữ các giá trị của các cờ. Mỗi cờ dài "1 bit". Đặt cờ có nghĩa là nó nhận giá trị "1" ở dạng nhị phân. Tổng cộng, trường này dài "9 bit"
  * **SYN**: Đây là cờ được sử dụng để bắt đầu kết nối TCP.&#x20;
  * **ACK**: Đây là cờ xác nhận cho biết các gói đã được truyền đi. Nó cũng cho biết để xác nhận thiết lập kết nối.&#x20;
  * **FIN**: Đây là cờ được sử dụng để chấm dứt kết nối TCP theo cách được kiểm soát.&#x20;
  * **RST**: Đây là cờ được sử dụng để chấm dứt kết nối TCP một cách đơn phương và đột ngột. Nó được sử dụng để thiết lập lại kết nối.&#x20;
  * **PSH**: Đây là cờ được đặt trong các gói nơi dữ liệu được gửi đến ứng dụng đích.&#x20;
  * **URG**: Đây là cờ dùng để thông báo có dữ liệu khẩn cấp và ưu tiên.
* **Window Size** là nơi xác định kích thước dữ liệu tối đa trong dung lượng bộ đệm của người nhận. Nó dài "16 bit".
* **Checksum -** là trường kiểm soát xem tính toàn vẹn của TCP segment có còn nguyên vẹn trong quá trình truyền hay không. Nó có giá trị thập lục phân và dài "16 bit".
* **Urgent Pointer -**  là một giá trị cho biết byte khẩn cấp là dữ liệu nào. Nó cho biết byte khẩn cấp là dữ liệu nào. Để sử dụng trường này, cờ "URG" phải được đặt. Nó dài "16 bit".
* **Options -** là trường được tạo để sử dụng các tính năng bổ sung khác nhau của giao thức TCP. Không có nghĩa vụ phải sử dụng. Nó không có chiều dài cố định.

## 8. Establishing a TCP Connection with Netcat

Có thể thiết lập kết nối TCP giữa các thiết bị thông qua dòng lệnh bằng công cụ "**Netcat**".&#x20;

Công cụ Netcat là một công cụ được cài đặt sẵn trên hệ thống Linux và được sử dụng với lệnh "**nc**".&#x20;

Ví dụ: hãy thiết lập kết nối TCP:&#x20;

* Lưu ý: Trong ví dụ này, cổng 5555 được sử dụng, số cổng khác có thể được sử dụng tùy chọn.
* Trước hết chúng ta mở công cụ netcat ở chế độ “listen” để nghe các gói tin đến cổng TCP 5555:

<figure><img src="/files/1UHlrOrHboDC6zQaLHIL" alt=""><figcaption></figcaption></figure>

Như đã thấy trong hình trên, mục tiêu mà chúng ta sẽ thiết lập kết nối TCP bằng lệnh "**sudo nc -lvp 5555**" đã được đưa vào chế độ nghe thành công. Ý nghĩa của các tham số được áp dụng trong lệnh như sau:

<figure><img src="/files/olj0ZU9aXP4x7lukbiIj" alt=""><figcaption></figcaption></figure>

**Command** : sudo nc 192.168.216.128 5555

<figure><img src="/files/GGz2XunUrVubdsaOAfRI" alt=""><figcaption></figcaption></figure>

Kết nối sẽ được thiết lập thành công sau khi bạn áp dụng lệnh trên trừ khi có vấn đề về giao tiếp mạng.

Sau khi kết nối được thiết lập, mỗi ký tự hoặc từ được gõ sẽ được truyền đến mục tiêu. Ví dụ: hãy gửi nó bằng cách nhập "Hello My Friend":

<figure><img src="/files/0AiAYBZQGjGTeBAMPwUy" alt=""><figcaption></figcaption></figure>

Như trong hình trên, thông báo đã được truyền đến hệ thống đích và hiển thị trên dòng lệnh như trong hình bên dưới.

<figure><img src="/files/SIFUtrzN5LtGWbTiQcR9" alt=""><figcaption></figcaption></figure>

## 9. TCP Protocol Review with Wireshark

<figure><img src="/files/AoTVcDbcM4em6BF6661D" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/soc-and-dfir/network/network-protocols/i.-transmission-control-protocol-tcp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
