Bỏ qua điều hướng, tới nội dung chính
Học C
Bài 46.126 phút đọc

Chồng giao thức, TCP và UDP

Sau bài này bạn sẽ làm được

  • Vẽ bốn tầng của chồng giao thức và biết socket nằm ở đâu
  • Kể sáu khác biệt giữa TCP và UDP
  • Giải thích bắt tay ba bước
  • Chọn đúng giao thức cho một tình huống cụ thể

Lập trình mạng bằng C nghĩa là gọi khoảng bảy hàm. Nhưng để gọi đúng thì phải biết bảy hàm đó nằm ở đâu trong bức tranh lớn, và đó là nội dung bài này.

#Bốn tầng

Bạn viết mã ở tầng ứng dụng và gọi xuống tầng vận chuyển. Ba tầng dưới do hệ điều hành lo.
TầngĐơn vị dữ liệuAi làmVí dụ
ApplicationThông điệpBạnHTTP, SSH, DNS, giao thức của bạn
TransportSegment, datagramHệ điều hành, bạn gọi qua socketTCP, UDP
InternetGói tinHệ điều hành và bộ định tuyếnIP, ICMP
LinkKhungTrình điều khiển và phần cứngEthernet, WiFi

#TCP và UDP

TCPUDP
Kết nốiCó, bắt tay ba bước trướcKhông
Bảo đảm đến nơiCó, gửi lại nếu mấtKhông
Bảo đảm thứ tựCóKhông
Kiểm soát tắc nghẽnCó, tự giảm tốc khi mạng nghẽnKhông
Đơn vị dữ liệuDòng byte, không có ranh giớiGói tin, giữ nguyên ranh giới
Tiêu đề20 byte trở lên8 byte
Độ trễCao hơnThấp hơn
Dùng choHTTP, SSH, email, truyền tệpDNS, gọi video, game, phát trực tiếp

#Bắt tay ba bước

Trình tự mở một kết nối TCP
Client                                       Server
  |                                            |
  |  1. SYN, so thu tu = x                     |
  |------------------------------------------->|   client goi connect()
  |                                            |   server dang o accept()
  |  2. SYN-ACK, so thu tu = y, xac nhan = x+1 |
  |<-------------------------------------------|
  |                                            |
  |  3. ACK, xac nhan = y+1                    |
  |------------------------------------------->|   accept() TRA VE
  |                                            |
  |          ket noi da mo, gui du lieu        |
  |<------------------------------------------>|

Ba goi tin, va ca ba deu KHONG chua du lieu ung dung nao.

Nghia la truoc khi gui duoc mot byte du lieu, ban da mat mot
vong di ve day du. Tren mang trong nuoc do la vai mili giay,
qua chau luc thi co the la ba tram mili giay.

Do la ly do HTTP/1.1 co "keep-alive": dung lai mot ket noi
cho nhieu yeu cau, thay vi bat tay lai moi lan.
terminal
# Xem các kết nối và trạng thái của chúng
netstat -an | findstr 18080
  TCP    0.0.0.0:18080          0.0.0.0:0              LISTENING
  TCP    127.0.0.1:18080        127.0.0.1:64144        TIME_WAIT

#Địa chỉ IP và cổng

/* Mot ket noi TCP duoc xac dinh boi BON so: */

  dia chi IP nguon, cong nguon, dia chi IP dich, cong dich

/* Vi du:
     127.0.0.1:64144  ->  127.0.0.1:18080

   Nghia la mot server o cong 18080 phuc vu duoc rat nhieu client
   cung luc: moi client co mot CONG NGUON khac nhau, nen bon so
   khac nhau, nen he dieu hanh phan biet duoc.

   Do la ly do "accept" tra ve mot mo ta tep MOI cho moi ket noi,
   trong khi socket lang nghe van o cong 18080. */
Dải cổngSố hiệuAi dùng
Cổng hệ thống0 tới 1023Dịch vụ chuẩn. Trên Unix cần quyền root để bind
Cổng đăng ký1024 tới 49151Ứng dụng đã đăng ký với IANA
Cổng tạm49152 tới 65535Hệ điều hành tự cấp cho client

#Chọn giao thức nào

Ứng dụngGiao thứcVì sao
Truyền tệpTCPMất một byte là hỏng cả tệp
Web, APITCPCần đủ và đúng thứ tự
SSH, telnetTCPMất một ký tự lệnh là không chấp nhận được
DNSUDPMột câu hỏi, một câu trả lời, nhỏ. Hỏi lại rẻ hơn bắt tay
Gọi videoUDPKhung hình cũ đến muộn thì vô dụng, bỏ đi tốt hơn
Game thời gian thựcUDPVị trí cũ vô dụng, và độ trễ quyết định
Đo lường, logUDPMất vài mẫu không sao, và không được làm chậm ứng dụng
Cơ sở dữ liệuTCPKhông được mất giao dịch nào

Tự làm thử

  1. Vẽ bốn tầng và điền vào mỗi tầng hai giao thức bạn biết.
  2. Tính xem gửi một byte dữ liệu thật tốn bao nhiêu byte trên dây.
  3. Chạy netstat -an trên máy bạn và tìm ba trạng thái khác nhau.
  4. Đếm số kết nối ở CLOSE_WAIT và giải thích nếu có nhiều.
  5. Với năm ứng dụng bạn hay dùng, đoán xem chúng dùng TCP hay UDP rồi kiểm chứng.
  6. Giải thích vì sao đóng kết nối cần bốn bước còn mở chỉ cần ba.

Trình chấm điểm tự động sẽ được bổ sung ở giai đoạn sau. Hiện tại bạn tự chạy thử trên máy.

Tóm tắt

  • Socket API nằm ở tầng vận chuyển; ba tầng dưới do hệ điều hành lo.
  • Mỗi tầng thêm một tiêu đề, nên gửi một byte thật tốn ít nhất năm mươi tư byte trên dây.
  • TCP là dòng byte không có ranh giới; UDP giữ nguyên ranh giới gói. Đây là khác biệt gây nhiều lỗi nhất.
  • Bắt tay ba bước tốn một vòng đi về trước khi gửi được byte dữ liệu đầu tiên; đóng kết nối cần bốn bước vì TCP hai chiều độc lập.
  • Một kết nối được xác định bởi bốn số, nên một cổng server phục vụ được rất nhiều client cùng lúc.