TCP – UDP
- TCP (Transmission Control Protocol)
- UDP (User Datagram Protocol)
- TCP là giao thức tin cậy (reliable protocol).
- UDP là giao thức không tin cậy (unreliable protocol) hay là best-effort protocol.
TCP | UDP | |
Connection Type: | Connection-oriented | Connectionless |
Sequencing: | Yes | No |
Usage: | Downloads File Sharing Printing | VoIP Video (streaming) |
Có một số vấn đề chúng ta cần phải nắm ở bảng trên.
Đầu tiên, đó là connection type. TCP là loại connection-oriented, điều này có nghĩa là nó sẽ thiết lập một phiên kết nối (“setup” a connection), và sau đó mới bắt đầu gửi dữ liệu. UDP là loại Connectionless, điều này có nghĩa là nó chỉ bắt đầu gửi dữ liệu mà không cần quan tâm dữ liệu tới đích hay không. Quá trình thiết lập một phiên kết nối của TCP được gọi là “3 way handshake” (ba cái bắt tay), chúng ta sẽ tìm hiểu nó ngay sau đây:
Sequencing (trình tự) nghĩa là chúng ta sử dụng khái niệm sequence number, được sử dụng nếu bạn download một file có kích thước lớn và bạn cần phải chắc chắn rằng tất cả các gói tin dữ liệu đã được gửi tới đúng đích. Như bạn có thể thấy là UDP không có đặc điểm này, UDP không sử dụng sequence number.
UDP
Hãy cùng nhau tìm hiểu về UDP header:

- UDP hoạt động ở tầng vận chuyển (transport layer) của mô hình OSI
- Là giao thức phi kết nối (connectionless protocol), không thiết lập kết nối, chỉ việc truyền dữ liệu…
- Có khả năng phát hiện lỗi vì có trường Checksum trong header
- Best-effort hay là giao thức không tin cậy – unreliable protocol.
- Không có khả năng phục hồi dữ liệu.
TCP
Bây giờ chúng ta sẽ tìm hiểu về TCP. Đầu tiên, TCP là giao thức tin cậy – reliable protocol, nó thiết lập một kết nối trước khi bắt đầu gửi bất kỳ dữ liệu nào. Quá trình kết nối này còn được gọi là quá trình 3 cái bắt tay (3 way handshake). Hãy cùng nhau tìm hiểu quá trình này bằng cách làm một ví dụ bằng việc gửi dữ liệu bằng hai máy tính:

Máy A muốn gửi dữ liệu cho máy B bằng phương pháp tin cậy, vì vậy chúng ta sẽ sử dụng giao thức TCP ở đây. Đầu tiên, sẽ là quá trình thiết lập kết nối bằng cách sử dụng quá trình 3 way handshake. Quá trình đó được mô tả như sau:

Đầu tiên, máy A gửi thông tin có chứa cờ TCP SYN, thông báo cho máy B rằng nó muốn thiết lập một kết nối. Ngoài ra, máy A cũng gửi cho máy B một số sequence SEQ (sequence number) và để đơn giản thì tôi chọn số SEQ này bằng 1. (thực tế thì máy A sẽ khởi tạo số SEQ này random).

Máy B sau khi đã nhận được thông tin từ máy A, máy B sẽ gửi hồi đáp có chứa thông tin về cờ SYN, ACK cho máy A. Bạn có thể thấy là số sequence number của máy B là 100 (ở đây cũng là một số random mà tôi chọn), ngoài ra còn có một số ACK = 2 (acknowledges number). ACK = 2 có nghĩa là máy B đã nhận được gói tin chứa TCP SYN từ máy A với số sequence number là 1, điều này có nghĩa là máy B thông báo cho máy A là mình đã sẵn sàng nhận thông tin tiếp theo có số thứ tự (sequence number) là 2.

- Máy A gửi thông điệp mang thông tin TCP SYN (tôi muốn nói chuyện với bạn)
- Máy B gửi lại thông điệp mang thông tin TCP SYN, ACK (tôi đồng, bạn có thể nói chuyện với tôi; và tôi cũng muốn nói chuyện với bạn)
- Máy A sẽ gửi thông điệp mang thông tin TCP ACK (tôi đồng ý nói chuyện với bạn)
Ví dụ 3 way handshake
Hãy khảo sát quá trình này trên thực tế bằng cách bắt gói sử dụng Wireshark

- Trong ví dụ trên, máy có IP 192.168.1.2 sẽ tiến hành thiết lập kết nối với máy có địa chỉ IP 174.143.213.184 mag thông tin TCP SYN.
- 143.213.184 sẽ gửi phản hồi TCP SYN,ACK trở lại.
- Cuối cùng máy 192.168.1.2 sẽ gửi TCP ACK để kết thúc quá trình 3 way handshake.
Chi tiết của quá trình 3 way handshake
TCP SYN

Bạn có thể thấy ở phần cờ – Flags là cờ SYN được bật. Ở góc phải phía trên, bạn có thể thấy “Seq: 0”, đó là giá trị của sequence number.

Tiếp theo, như hình trên bạn có thể thấy là trong phần cờ – Flags thì cả cờ SYN và ACK được bật, và ở góc phải phía trên, bạn có thể thấy “Seq: 0” và “ACK:1”.

Phía trên là bước cuối cùng trong quá trình 3 way handshake khi cờ ACK được bật và “Seq: 1”, “ACK:1”.
Bạn có thể tự mình bắt gói bằng cách sử dụng Wireshark để có thể khảo sát quá trình hoạt động của 3 way handshake (SYN, SYN-ACK và ACK’s…), bạn cũng có thể bạn sẽ thấy được một số sequence number khác vì đây là một số được sinh tự động.
Vậy là bạn đã biết về 3 way handshake. Sau quá trình này, chúng ta đã có thể gửi và nhận dữ liệu. Vậy còn vấn đề nào về TCP mà chúng ta cần phải tìm hiểu. Tiếp theo sẽ là “flow control” – kiểm soát luồng.
Thử tưởng tượng rằng bạn sử dụng một máy tính mạnh để gửi dữ liệu tới smartphone, rõ ràng việc xử lý quá nhanh của một máy tính có thể gây ra việc quá tải xử lý cho smartphone với việc gửi các lưu lượng liên tục gây quá tải cho việc xử lý trên smartphone; chính vì thế ta cần đến việc flow control. Với mỗi TCP segment, máy nhận sẽ chỉ ra một giá trị “receive window” – giá trị muốn nhận để chỉ ra lượng dữ liệu muốn nhận tính bằng byte mà nó muốn nhận trong một thời điểm.
Máy tính gửi chỉ có thể gửi dữ liệu với kích thước dữ liệu mà smartphone không trở nên quá tải. Với việc có thể gửi nhiều dữ liệu hơn tại một thời điểm thì throughput của chúng ta sẽ được tăng lên.
Hãy nhìn ví dụ sau để hiểu thêm về vấn đề này:

Máy A thiết lập một kết nối với máy B sử dụng 3 way handshake. Máy A có gửi một thông tin khác là “10 bytes of Data”, điều này có nghĩa là “window size” của máy A là 10 bytes. Số sequence number là 10.

Máy B sẽ phản hồi lại với số ACK=11, điều này có nghĩa là “cám ơn, tôi sẽ gửi lại cho bạn dữ liệu tối đa là 10 bytes, bây giờ hãy gửi tôi dữ liệu #11 (ACK=11) và phần còn lại”.
Trên đây chỉ là một ví dụ nhỏ về TCP Window size. Để hiểu rõ hơn, bạn đọc thêm về bài viết TCP Window Size.
TCP là giao thức tin cậy reliable protocol, bởi vì chúng ta luôn phải phản hồi lại (sử dụng số ACK number) tất cả những gì mà chúng ta nhận được.
Với giá trị Window size càng lớn thì chúng ta sẽ có một throughput càng lớn. Điều này có nghĩa là chúng ta sẽ gửi ít số ACK hơn với cùng một dữ liệu mà bạn muốn gửi.
TCP là một giao thức khá phức tạp và nếu bạn nhìn vào TCP header thì bạn có thể thấy là nó phức tạp hơn những gì có trong một UDP header:

- Bạn có thể thấy hai trường 16 bit dành cho source và destination port, port numbers được sử dụng để xác định dữ liệu là của chương trình tầng ứng dụng nào được đóng gói bên trong.
- Ngoài ra còn có hai trường dài 32 bit dùng cho việc đánh giá trị cho số sequence number (SEQ number) và số acknowledgment number (ACK number).
- Trường Flags (cờ) được sử dụng để đánh dấu cho các loại TCP khác nhau như SYN hay ACK.
- Window size có độ lớn 16 bit dùng để xác định có bao nhiêu byte dữ liệu mà bạn muốn nhận được từ phía máy đang kết nối.
- Cuối cùng là trường checksum để đảm bảo tính chính xác của TCP header.
- Là một giao thức tin cậy – reliable protocol.
- Trước khi gửi dữ liệu thì cân phải khởi tao phiên kết nối bằng cách sử dụng 3 way handshake
- Sau khi đã gửi một số bytes nào đó tới máy nhận, bạn sẽ nhận lại được một số ACK từ phía máy nhận
- Số lượng byte mà bạn có thể gửi tới máy nhận trước khi bạn nhận lại được một số ACK được kiểm soát bởi “window size”.
- TCP có thể gửi lại các dữ liệu bị mất (retransmissions).
“Routing Fundamentals – Network Lesson”
NGUYỄN VĂN HUY DŨNG
Don’t compare yourself with anyone in this world…if you do so, you are insulting yourself.
Bill Gates
When something is important enough, you do it even if the odds are not in your favor.