TCP và UDP: Cuộc Chiến Không Hồi Kết Giữa Độ Tin Cậy và Tốc Độ

TCP và UDP: Cuộc Chiến Không Hồi Kết Giữa Độ Tin Cậy và Tốc Độ
TCP và UDP

Khởi Nguồn: Khi Internet Còn Trẻ và Ngây Thơ

Hãy quay ngược thời gian về những năm 1970s. Internet (hay chính xác hơn là ARPANET) vẫn còn là một "đứa trẻ" đang tập đi. Các nhà khoa học máy tính đối mặt với một vấn đề cơ bản: làm sao để hai máy tính ở hai đầu đất nước có thể "nói chuyện" với nhau một cách đáng tin cậy?

Vint Cerf và Bob Kahn, hai "cha đẻ" của Internet, đã phát minh ra TCP vào năm 1974. Ban đầu, TCP làm mọi thứ - cả việc định tuyến (routing) lẫn đảm bảo độ tin cậy. Nhưng họ nhanh chóng nhận ra rằng đó là một ý tưởng tồi, giống như bắt một người vừa lái xe vừa sửa xe cùng lúc.

Năm 1978, TCP được tách thành hai phần: IP (Internet Protocol) lo việc định tuyến, còn TCP lo việc đảm bảo dữ liệu đến nơi an toàn. Nhưng rồi một vấn đề mới nảy sinh…

UDP Ra Đời: Khi "Hoàn Hảo" Là Kẻ Thù Của "Đủ Tốt"

David P. Reed nhận ra rằng không phải lúc nào chúng ta cũng cần sự hoàn hảo của TCP. Đôi khi, tốc độ quan trọng hơn độ chính xác. Năm 1980, UDP ra đời với triết lý "shoot first, ask questions never" (bắn trước, không bao giờ hỏi sau).

Hãy tưởng tượng bạn đang trong một cuộc họp video quan trọng. Bạn muốn:

  • A) Mọi từ, mọi pixel hoàn hảo nhưng delay 5 giây?
  • B) Thỉnh thoảng mất vài từ, hình ảnh đôi lúc mờ, nhưng real-time?

Nếu bạn chọn B, chúc mừng, bạn vừa hiểu tại sao UDP tồn tại.

Tầng Giao Vận: Bưu Điện Của Thế Giới Số

Trước khi đi sâu vào TCP và UDP, hãy hiểu rõ môi trường chúng hoạt động - Tầng Giao Vận (Transport Layer). Trong mô hình OSI 7 tầng mà sinh viên nào cũng phải học (và quên ngay sau khi thi), tầng giao vận nằm ở vị trí thứ 4, kẹp giữa tầng mạng (Network) và tầng phiên (Session).

Nhưng trong thực tế, chúng ta thường dùng mô hình TCP/IP đơn giản hơn với 4 tầng. Ở đây, tầng giao vận đóng vai trò như một "bưu điện thông minh":

  1. Application Layer: "Tôi muốn gửi email này"
  2. Transport Layer: "OK, để tôi chia nhỏ nó ra, đánh số, và đảm bảo nó đến nơi"
  3. Internet Layer: "Tôi sẽ tìm đường đi"
  4. Link Layer: "Tôi sẽ truyền qua dây cáp/wifi"

Tầng giao vận giải quyết một vấn đề cốt lõi: multiplexing. Máy tính của bạn chỉ có một card mạng, nhưng bạn đang chạy 50 ứng dụng khác nhau - Chrome với 47 tab, Spotify, Discord, Steam… Làm sao để mọi ứng dụng đều có thể gửi/nhận dữ liệu mà không bị lẫn lộn?

Câu trả lời: Port numbers. Mỗi ứng dụng được gán một "số phòng" riêng (port). HTTP dùng phòng 80, HTTPS dùng 443, SSH dùng 22… Giống như một tòa nhà chung cư, mọi người dùng chung một địa chỉ (IP) nhưng ở các căn hộ khác nhau (ports).

TCP: Người Shipper Mẫu Mực Với OCD

TCP

Why this image ? If you know, you know

TCP (Transmission Control Protocol) là hiện thân của sự cẩn thận đến mức ám ảnh. Nếu TCP là con người, nó sẽ là người kiểm tra cửa khóa 5 lần trước khi đi ngủ, đếm lại tiền 3 lần khi nhận lương, và luôn giữ biên lai mua hàng trong 7 năm.

Giải Phẫu TCP Header: 20 Bytes Của Sự Paranoid

Hãy cùng "mổ xẻ" TCP header như một bác sĩ pháp y:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

1. Source và Destination Port (16 bits mỗi cái) Đây là "từ phòng nào, đến phòng nào" của gói tin. 16 bits cho phép 65,536 ports khác nhau (0-65535). Tại sao lại cần nhiều vậy? Well, Bill Gates từng nói "640KB RAM là đủ cho mọi người" - bài học: luôn luôn overestimate.

2. Sequence Number (32 bits) TCP đánh số TỪNG BYTE dữ liệu. Không phải từng gói tin, mà TỪNG BYTE. Đây là lý do tại sao TCP có thể phát hiện chính xác byte nào bị mất. 32 bits = 4.3 tỷ số khác nhau. Khi hết số? Quay lại 0 (wrap around).

Fun fact: Sequence number khởi đầu không phải từ 0 mà là một số ngẫu nhiên (ISN - Initial Sequence Number). Tại sao? Security! Nếu luôn bắt đầu từ 0, hacker dễ dàng đoán được số tiếp theo.

3. Acknowledgment Number (32 bits) "Tôi đã nhận được đến byte số X, gửi tiếp từ byte X+1 đi". Simple nhưng hiệu quả. Đây là cách TCP biết chính xác cái gì đã đến, cái gì chưa.

4. Data Offset (4 bits) Cho biết TCP header dài bao nhiêu (tính bằng 32-bit words). Tại sao cần? Vì TCP header có thể có Options, làm nó dài thêm. Minimum 5 words (20 bytes), maximum 15 words (60 bytes).

5. Reserved (3 bits) Dành cho tương lai. 20 năm rồi vẫn chưa dùng. Đây là bài học về forward thinking trong protocol design.

6. Flags (9 bits) - The Drama Queens Mỗi flag là 1 bit, on hoặc off:

  • URG: "GẤP LẮM! ƯU TIÊN TUI TRƯỚC!"
  • ACK: "Ừ, tao nghe rồi"
  • PSH: "Đẩy lên cho application ngay, đừng buffer"
  • RST: "STOP! DỪNG HẾT! CÓ VẤN ĐỀ!"
  • SYN: "Hello, làm quen không?"
  • FIN: "Tạm biệt, tui đi đây"

7. Window Size (16 bits) "Tôi còn chỗ cho X bytes nữa thôi, gửi từ từ". Đây là cơ chế flow control của TCP. Receiver kiểm soát tốc độ sender. Giống như bạn bảo shipper "Nhà tôi nhỏ, gửi 5 hộp một lần thôi".

8. Checksum (16 bits) Kiểm tra toàn bộ TCP segment + pseudo IP header có bị lỗi không. Nếu sai? Vứt luôn, không thương tiếc.

9. Urgent Pointer (16 bits) Dùng với URG flag. "Trong đống data này, byte thứ X quan trọng lắm". Thực tế ít dùng.

10. Options (0-40 bytes) Các tính năng mở rộng. Ví dụ:

  • MSS (Maximum Segment Size): "Tôi chỉ xử lý được gói tin tối đa X bytes"
  • Window Scaling: "Window 16 bits không đủ, nhân thêm đi"
  • SACK (Selective Acknowledgment): "Tôi nhận được gói 1,2,5,6,7. Thiếu 3,4 thôi"
  • Timestamps: Đo RTT chính xác hơn

Three-Way Handshake: Giao Thức Xã Giao Của Máy Tính

TCP không phải loại "xông vào nhà người ta". Nó lịch sự như một quý ông Anh, với quy trình bắt tay 3 bước huyền thoại:

TCP Handshake

Tại sao cần 3 bước? Tại sao không 2 hay 4?

  • 2 bước không đủ: Server không biết client có nhận được SYN-ACK không
  • 4 bước thừa: 3 bước đã đủ để cả hai bên xác nhận sequence numbers

Đây là ví dụ tuyệt vời về "necessary and sufficient" trong thiết kế protocol.

TCP Flow Control: Nghệ Thuật Không Làm Ngập Người Nhận

Window Size trong TCP header không chỉ là con số. Nó là cả một nghệ thuật cân bằng. Hãy tưởng tượng bạn đang rót nước từ bình 5 lít vào ly 200ml. Rót nhanh quá? Tràn. Rót chậm quá? Mất thời gian.

TCP Window hoạt động tương tự:

  1. Receiver quảng cáo: "Tôi còn chỗ cho 10KB"
  2. Sender gửi: 5KB
  3. Receiver update: "Giờ tôi còn chỗ cho 5KB" (10KB - 5KB đã nhận)
  4. Application đọc data: Buffer trống bớt
  5. Receiver quảng cáo lại: "Tôi lại có chỗ cho 8KB rồi"

Nhưng đó mới chỉ là phần nổi của tảng băng…

Congestion Control: Khi TCP Phải Lo Cho Cả Internet

Flow control lo cho receiver không bị ngập. Congestion control lo cho cả mạng không bị tắc. Đây là nơi TCP thể hiện tính "vị tha" của mình.

Slow Start (Khởi Đầu Chậm) Tên gọi này là một trò đùa. "Slow" start thực ra tăng tốc theo hàm mũ:

  • Bắt đầu với 1 MSS (thường ~1460 bytes)
  • Mỗi ACK nhận được, tăng gấp đôi
  • 1 → 2 → 4 → 8 → 16…

Giống như khi bạn mới quen người yêu. Tin nhắn đầu: "Chào em". Nếu reply, gửi nhiều hơn một chút. Cứ thế cho đến khi… bị seen không rep (packet loss).

Congestion Avoidance Khi đạt ngưỡng (ssthresh), TCP chuyển từ tăng hàm mũ sang tăng tuyến tính. Thêm 1 MSS mỗi RTT thay vì gấp đôi. An toàn hơn nhưng chậm hơn.

Fast Retransmit & Fast Recovery Nhận được 3 duplicate ACKs? Đừng đợi timeout, gửi lại ngay! Và đừng reset về slow start, chỉ cần giảm window một nửa. Giống như khi bạn gọi người yêu 3 lần không nghe máy - có lẽ đang bận, chứ không phải chia tay.

UDP: Kẻ Nổi Loạn Không Thích Ràng Buộc

UDP

Why this image ? If you know, you know

Nếu TCP là sinh viên mẫu mực, UDP chính là bad boy mà mọi người vừa ghét vừa… cần. UDP (User Datagram Protocol) với header chỉ vỏn vẹn 8 bytes, như một tờ post-it dán vội lên gói hàng.

UDP Header: Tối Giản Đến Mức Gây Sốc

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length             |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chỉ có vậy. 8 bytes. Xong.

Hãy so sánh: TCP header minimum 20 bytes, có 10+ trường khác nhau. UDP? 4 trường:

  1. Source Port: Ai gửi (có thể để 0 nếu không cần reply)
  2. Destination Port: Gửi cho ai
  3. Length: Tổng chiều dài UDP header + data
  4. Checksum: Kiểm lỗi (optional trong IPv4, bắt buộc trong IPv6)

Triết Lý "Fire and Forget"

UDP không connection-oriented. Không handshake. Không sequence number. Không acknowledgment. Không flow control. Không congestion control. Không gì cả.

Nghe có vẻ tệ? Nhưng đó chính xác là điểm mạnh của UDP. Hãy nghĩ về những scenario sau:

1. Live Video Streaming Bạn đang xem trận chung kết World Cup. Điều gì quan trọng hơn:

  • Xem trận đấu delay 30 giây nhưng mượt mà?
  • Xem gần real-time, thỉnh thoảng giật một chút?

Nếu dùng TCP, mỗi lần mất gói tin, nó sẽ dừng lại, yêu cầu gửi lại, đợi… Trong khi đó, Messi đã ghi bàn và bạn vẫn đang xem anh ta chuyền bóng.

2. Online Gaming Trong game bắn súng, vị trí của kẻ địch 100ms trước không quan trọng bằng vị trí HIỆN TẠI. UDP cho phép game liên tục update vị trí mới nhất. Mất vài update? Không sao, update tiếp theo sẽ sửa.

3. DNS Queries "IP của facebook.com là gì?" "142.250.66.174" Xong.

Cần gì handshake 3 bước cho một câu hỏi đơn giản?

UDP Không Phải Là "TCP Nhưng Tệ Hơn"

Nhiều người nghĩ UDP là phiên bản "rẻ tiền" của TCP. Sai hoàn toàn. UDP là một lựa chọn thiết kế có chủ đích cho những use case cụ thể.

Ví dụ thực tế: QUIC Protocol Google phát triển QUIC (Quick UDP Internet Connections) - chạy trên UDP nhưng implement các tính năng giống TCP ở application layer. Tại sao không dùng TCP luôn? Vì:

  1. Flexibility: Có thể update protocol mà không cần thay đổi OS kernel
  2. No Head-of-Line Blocking: TCP xử lý tuần tự, một gói tin bị mất = tất cả phía sau phải đợi
  3. Faster Handshake: 0-RTT connection establishment

QUIC chứng minh rằng UDP không phải là "dumb", mà là "simple by design".

So Sánh Chi Tiết: Cuộc Chiến Triết Lý

Reliability vs Speed: Trade-off Muôn Thuở

TCP và UDP represent hai trường phái tư tưởng:

TCP - "Better Safe Than Sorry"

  • Mọi byte phải đến đích
  • Đúng thứ tự
  • Không trùng lặp
  • Kiểm soát lỗi
  • Kiểm soát tắc nghẽn

UDP - "Better Late Than Never? Nah, Better Never Than Late"

  • Best-effort delivery
  • Không đảm bảo thứ tự
  • Có thể trùng lặp
  • Có thể mất mát
  • Nhưng NHANH

Overhead Comparison: David vs Goliath

Khía cạnhTCPUDP
Header Size20-60 bytes8 bytes
Connection Setup3-way handshake (1.5 RTT)0 RTT
Connection StateCó (RAM cho mỗi connection)Không
CPU UsageCao (checksums, ordering, retransmission)Thấp
LatencyVariable (retransmissions)Consistent
JitterCao (do buffering)Thấp

Use Case Matrix: Chọn Đúng Tool

Ứng dụngProtocolLý do
Web (HTTP/3)QUIC/UDPLow latency, multiplexing
Web (HTTP/2)TCPCompatibility, reliability
EmailTCPKhông thể mất data
VoIPUDPReal-time > reliability
File TransferTCPData integrity critical
Live StreamingUDPBuffering is enemy
Video on DemandTCPCan buffer ahead
Gaming (action)UDPEvery ms counts
Gaming (turn-based)TCPConsistency matters
IoT SensorsUDPSimple, low power
Database ReplicationTCPACID compliance

Real-World Implementation: Những Bài Học Từ Chiến Trường

Netflix: Master of Both Worlds

Netflix sử dụng cả TCP và UDP một cách thông minh:

Video Delivery: TCP (ngạc nhiên chưa?)

  • Adaptive bitrate streaming qua HTTP
  • Có thể buffer trước 30-60 giây
  • Chất lượng quan trọng hơn latency

Telemetry & Analytics: UDP

  • Gửi metrics về server
  • Mất vài data points không quan trọng
  • Không muốn impact performance

Open Connect (CDN): Hybrid

  • Control plane: TCP (configuration, management)
  • Data plane: Optimized TCP với custom congestion control

Discord/Zoom: The UDP Champions

Voice/Video apps yêu UDP vì:

1. Predictable Latency

  • TCP retransmission gây jitter không đoán trước
  • UDP: mất thì mất, nhưng latency ổn định

2. Partial Data > No Data

  • Mất 10% audio packets? Nghe hơi rè
  • TCP đợi retransmit? Im lặng hoàn toàn

3. Application-Level FEC

  • Gửi redundant data
  • Reed-Solomon coding
  • Rebuild lost packets without retransmission

Gaming: Mỗi Genre Một Chiến Lược

FPS Games (CS:GO, Valorant)

  • Movement/Shooting: UDP
  • Chat/Lobby: TCP
  • Anti-cheat: TCP (cần reliability)

MOBA (LoL, Dota 2)

  • Game State: Mostly UDP
  • Reconnect Logic: TCP
  • Replay System: TCP

MMO (WoW, FFXIV)

  • Hybrid approach
  • Combat: UDP cho responsiveness
  • Trading/Inventory: TCP cho consistency

Performance Optimization: Squeeze Mọi Giọt Hiệu Năng

TCP Tuning: Biến Rùa Thành Thỏ

1. TCP_NODELAY (Disable Nagle's Algorithm)

int flag = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));

Gửi data ngay lập tức, không đợi gom đủ. Trade-off: nhiều small packets hơn.

2. SO_KEEPALIVE Định kỳ gửi "còn sống không?" để phát hiện broken connections. Cứu tinh cho long-lived connections.

3. TCPUSERTIMEOUT "Đợi bao lâu trước khi bỏ cuộc?" Default có thể lên đến 20 phút!

4. Buffer Tuning

# Linux kernel parameters
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456

UDP Optimization: Fast and Furious-er

1. SOREUSEADDR/SOREUSEPORT Multiple processes listen cùng port. Load balancing cho UDP servers.

2. Packet Pacing Không blast 1000 packets cùng lúc. Spread out để tránh packet loss do buffer overflow.

3. PMTU Discovery Tìm Maximum Transmission Unit của path. Tránh fragmentation = tránh packet loss.

Security Implications: Khi Tin Cậy Trở Thành Gánh Nặng

TCP Attack Vectors

1. SYN Flood Attacker gửi hàng ngàn SYN packets với fake source IP. Server giữ half-open connections đến khi timeout. Memory exhaustion.

Mitigation: SYN Cookies - encode connection state trong sequence number.

2. TCP Reset Attack Guess sequence number, gửi RST packet. Connection bị terminate.

Mitigation: Randomized ISN, IPSec.

3. Slowloris Mở nhiều connections, gửi data cực chậm. Giữ connection mãi mãi.

Mitigation: Connection timeouts, rate limiting.

UDP Attack Vectors

1. UDP Flood Simplest attack. Blast UDP packets làm tắc bandwidth.

Mitigation: Rate limiting at network edge.

2. Amplification Attacks Lợi dụng services reply lớn hơn request:

  • DNS: 60 byte query → 4000 byte response
  • NTP: 8 byte query → 468 byte response

Mitigation: Disable open resolvers, rate limit.

3. IP Spoofing UDP không verify source. Dễ fake sender.

Mitigation: Không tin source IP, use application-level auth.

Tools & Debugging: Arsenal Của Network Engineer

Command Line Kung Fu

# TCP connections và statistics
ss -tan
netstat -tulpn
lsof -i TCP:80

# UDP monitoring
ss -uan
netstat -su

# Packet capture
tcpdump -i any -n port 80
tcpdump -i eth0 udp port 53

# Performance testing
iperf3 -s  # server
iperf3 -c server_ip -u  # UDP test

# Latency measurement
mtr google.com
traceroute -T google.com  # TCP
traceroute -U google.com  # UDP

Wireshark: X-Ray Vision Cho Packets

Wireshark không chỉ capture packets. Nó cho bạn:

  1. TCP Stream Reconstruction: Click chuột phải → Follow TCP Stream
  2. Expert Analysis: Phát hiện retransmissions, out-of-order, duplicate ACKs
  3. Graphing: RTT graph, throughput graph, window scaling analysis
  4. Filters: tcp.analysis.retransmission để tìm vấn đề

Programming: Hands-on Code

TCP Server (Python)

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', 9999))
server.listen(5)

while True:
    client, addr = server.accept()
    data = client.recv(1024)
    client.send(b"Echo: " + data)
    client.close()

UDP Server (Python)

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 9999))

while True:
    data, addr = server.recvfrom(1024)
    server.sendto(b"Echo: " + data, addr)

Để ý sự khác biệt:

  • TCP: listen(), accept() - connection-oriented
  • UDP: chỉ cần bind() và recvfrom() - connectionless

Future of Transport Protocols: Beyond TCP và UDP

QUIC: Best of Both Worlds?

Google's QUIC (nay là IETF QUIC) chạy trên UDP nhưng provide:

  • Reliability như TCP
  • Nhưng không head-of-line blocking
  • 0-RTT handshake
  • Connection migration (đổi IP không mất connection)

SCTP: The Forgotten Protocol

Stream Control Transmission Protocol - kết hợp TCP và UDP:

  • Multi-streaming (nhiều streams độc lập)
  • Multi-homing (nhiều IP addresses)
  • Partial reliability

Tại sao không phổ biến? NATs và firewalls không hiểu SCTP.

BBR: Congestion Control Mới

Bottleneck Bandwidth and RTT - Google's new congestion control:

  • Không dựa vào packet loss
  • Measure actual bandwidth và RTT
  • 25% throughput improvement trên YouTube

Kết Luận: Không Có Kẻ Thắng Cuộc

Sau gần 50 năm, TCP và UDP vẫn là backbone của Internet. Không phải vì chúng hoàn hảo, mà vì chúng "good enough" cho các use case khác nhau.

TCP wins khi:

  • Data integrity là tối quan trọng
  • Có thể buffer và đợi
  • Cần đảm bảo thứ tự
  • Connection state có ích

UDP wins khi:

  • Latency là kẻ thù
  • Một chút mất mát OK
  • Simplicity là vàng
  • Stateless là lợi thế

Cả hai đều thua khi:

  • Bạn không hiểu requirements
  • Chọn protocol vì "ai cũng dùng"
  • Không measure và optimize

Cuối cùng, như mọi thứ trong engineering: "It depends". Nhưng giờ ít nhất bạn đã biết "depends on what".

Và lần sau khi ai đó hỏi "TCP hay UDP tốt hơn?", bạn có thể mỉm cười và nói: "Cả hai. Hoặc không cái nào. Tùy ông muốn làm gì."

P.S: Nếu bạn đọc đến đây, congratulations! Bạn đã hiểu về TCP/UDP nhiều hơn 90% developers ngoài kia. Giờ hãy đi build something awesome với knowledge này!