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
| Tầng | Đơn vị dữ liệu | Ai làm | Ví dụ |
|---|---|---|---|
| Application | Thông điệp | Bạn | HTTP, SSH, DNS, giao thức của bạn |
| Transport | Segment, datagram | Hệ điều hành, bạn gọi qua socket | TCP, UDP |
| Internet | Gói tin | Hệ điều hành và bộ định tuyến | IP, ICMP |
| Link | Khung | Trình điều khiển và phần cứng | Ethernet, WiFi |
#TCP và UDP
| TCP | UDP | |
|---|---|---|
| Kết nối | Có, bắt tay ba bước trước | Không |
| Bảo đảm đến nơi | Có, gửi lại nếu mất | Không |
| Bảo đảm thứ tự | Có | Không |
| Kiểm soát tắc nghẽn | Có, tự giảm tốc khi mạng nghẽn | Không |
| Đơn vị dữ liệu | Dòng byte, không có ranh giới | Gói tin, giữ nguyên ranh giới |
| Tiêu đề | 20 byte trở lên | 8 byte |
| Độ trễ | Cao hơn | Thấp hơn |
| Dùng cho | HTTP, SSH, email, truyền tệp | DNS, 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ổng | Số hiệu | Ai dùng |
|---|---|---|
| Cổng hệ thống | 0 tới 1023 | Dị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ạm | 49152 tới 65535 | Hệ điều hành tự cấp cho client |
#Chọn giao thức nào
| Ứng dụng | Giao thức | Vì sao |
|---|---|---|
| Truyền tệp | TCP | Mất một byte là hỏng cả tệp |
| Web, API | TCP | Cần đủ và đúng thứ tự |
| SSH, telnet | TCP | Mất một ký tự lệnh là không chấp nhận được |
| DNS | UDP | Mộ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 video | UDP | Khung hình cũ đến muộn thì vô dụng, bỏ đi tốt hơn |
| Game thời gian thực | UDP | Vị trí cũ vô dụng, và độ trễ quyết định |
| Đo lường, log | UDP | Mất vài mẫu không sao, và không được làm chậm ứng dụng |
| Cơ sở dữ liệu | TCP | Không được mất giao dịch nào |
Tự làm thử
- Vẽ bốn tầng và điền vào mỗi tầng hai giao thức bạn biết.
- Tính xem gửi một byte dữ liệu thật tốn bao nhiêu byte trên dây.
- Chạy
netstat -antrên máy bạn và tìm ba trạng thái khác nhau. - Đếm số kết nối ở
CLOSE_WAITvà giải thích nếu có nhiều. - 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.
- 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.