Edu DaLatHub
  • Trang chủ
  • Flutter
  • WordPress Plugin
  • GoLang
  • ReactJS
  • NodeJS
  • Networking
    • Basic Networking
      • ARP
      • ICMP
      • TCP/UDP
    • Routing & Switching
      • RIP
      • OSPF
      • EIGRP
      • Redistribution
      • TSHOOT
      • WAN
Liên hệ

  • By  Nguyễn Văn Huy Dũng
  • 0 comments
  • Tháng Một 13, 2022

TCP – UDP

Nội dung
  • UDP
  • TCP
    • 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
      • Chi tiết của quá trình 3 way handshake
Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu về các giao thức tầng vận chuyển (transport protocols) là TCP và UDP. Trong các giao thức tầng vận chuyển thì chúng ta tập trung vào hai giao thức được sử dụng chính đó là:
  • TCP (Transmission Control Protocol)
  • UDP (User Datagram Protocol)
Tại sao lại có 2 loại giao thức khác nhau cho tầng vậy chuyển ở đây, vấn đề nào chúng ta cần phải quan tâm và khi nào thì chúng ta cần phải sử dụng loại giao thức nào? Câu trả lời đơn giản như sau:
  • 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.
Bạn nghĩ như thế nào là tin cậy và không tin cậy? Tại sao chúng ta lại đặt ra một vấn đề là chuyển các data ở tầng vận chuyển là không tin cậy??? Chúng ta sẽ cùng nhau tìm hiểu một số điểm khác nhau của 2 giao thức này để trả lời cho vấn đề trên: Bạn sử dụng một chiếc máy tính cá nhân của mình và cần download một bộ phim có dung lượng lớn với chất lượng 1080p với chất lượng âm thanh 7.1… File đó bạn có dung lượng lên tới 20GB và sau khi bạn đã ngồi đợi download được 10GB thì đột nhiên có một vấn đề nào đó xảy ra dẫn đến việc các gói tin IP (IP packets) không thể tới được máy tính của bạn nữa, ngay lúc đó thì quá trình download này sẽ tự động dừng lại và bạn không thể nào xem được bộ phim mà bạn muốn, bạn chỉ nhận được một số thông báo lỗi. Bạn lại còn tốn khá nhiều thời gian để đợi download mà hông thể xem được bộ phim với chất lượng mà bạn mong muốn…, bạn lúc này có thể bỏ qua việc download và xem nó ở những trang web đã upload miễn phí trên internet với chất lượng thấp hơn… Ok, có thể là hơi nói quá ở phần trước, tuy nhiên có thể cho bạn một ý tưởng; nếu bạn muốn chắc chắc rằng việc vận chuyển các data trong việc download tới máy tính của bạn một các tin cậy, không xảy ra những lỗi nào đó thì bạn phải sử dụng giao thức TCP. Đó là trường hợp một số gói tin IP bị mất trong qua trình truyền không thể tới được máy tính của bạn và bạn muốn chắc chắn rằng các dữ liệu này sẽ được gửi lại tới máy tính của mình. Trong câu chuyện thứ hai sau đây, bạn là một kỹ sư mạng của công ty và bạn nói chuyện với sếp của bạn có một giải pháp tốt cho công ty là sử dụng giải pháp Voice over IP. Bạn quyết đình thực hiện giải pháp VoIP này trên thực tế để thay thế tất cả các chiếc điện thoại truyền thống nhưng bạn gặp vấn đề là có nhiều phản hồi từ người sử dụng là chất lượng cuộc gọi khi sử dụng giải pháp này là không tốt. Bạn có suy nghĩ rằng tín hiệu âm thanh cần phải đảm bảo tin cậy và việc sử dụng giao thức TCP ở đây là một giải pháp hiệu quả? Đó là một suy nghĩ sai! TCP không phải là giao thức sửa lỗi cho các kết nối (error correction), điều này có nghĩa là các thông tin không tới được máy tính của bạn không thể được sửa trừ khi nó được gửi lại. Hãy nghĩ thử nếu ta đang nói chuyện điện thoại với người bên kia mà phải mất vài giây mới có thể nghe được những gì họ nói? Đây là việc vận chuyển dữ liệu thời gian thực (real-time). Sẽ tốt hơn khi chúng ta lựa chọn việc gửi các gói tin VoIP có thể bị mất một vài thông tin hơn là việc lựa chọn việc gửi lại thông tin mà lại mất thời gian xử lý. Trong ví dụ này thì chúng ta sử dụng một giao thức giao thức không tin cậy (unreliable protocol)  và best-effort protocol đó là giao thức UDP.
  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:

Bạn có thể thấy là nó khá là đơn giản, UDP header có hia trường source và destination port number (port number cho biết data của chúng ta đóng gói là của chương trình nào của tầng trên – application layer), ngoài ra còn có trường UDP length và checksum. Đây là một số tóm tắt mà bạn nên biết về UDP:
  • 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.

Bước cuối cùng là của quá trình này là máy A sẽ gửi một số hổi đáp (acknowledgement) lại cho máy B. Bạn có thể thấy là máy A gửi có số ACK=101 có nghĩa là nó đã nhận thông điệp từ máy B có số SEQ=100.  Khi máy B gửi ACK=2 tới máy A, máy A đã biết là mình sẽ gửi một thông điệp tiếp theo có số SEQ=2. Quá trình 3 bước bắt tay có thể tóm tắt như sau:
  • 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:

Các trường màu xám không quan trọng trong các trường TCP header. Những trường màu đỏ là các trường quan trọng mà bạn cần phải quan tâm:
  • 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.
Còn đây là một số tóm tắt về TCP:
  • 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

Tags:
Basic Networking, Networking, TCP/UDP

Leave a Comment Cancel Reply

Your email address will not be published.*

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

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.

Elon Musk

Bài viết mới

  • Lorem Ipsum Sample Content123
  • Lorem Ipsum Sample Content
  • Hello world
  • Hello world
  • Hello world
  • Wide area networks (Phần 2)
  • Wide area networks (Phần 1)
  • Redistribution (Phần Cuối)
  • Redistribution (Phần 1)
  • OSPF – Open Shortest Path First (Phần Cuối)

Nơi chia sẻ về tin công nghệ, các kinh nghiệm lập trình. Xây dựng các khoá đào tạo lập trình, mạng, tin học văn phòng...

Thông tin liên hệ

  • 2/9 Phạm Ngũ Lão, Phường 3, Đà Lạt
  • 0865802659
  • info@dalathub.com

Copyright @ 2022 Edu DaLatHub