TCP mở một kết nối như thế nào?
TCP bắt đầu kết nối như thế nào?
Trình duyệt đã biết máy chủ nằm ở:
203.0.113.9:443
Nó biết phải gửi gói tin tới địa chỉ IP nào và port nào.
Nhưng TCP vẫn chưa có một kết nối với máy chủ đó.
Hai bên chưa biết đây là một cuộc trao đổi mới, và cũng chưa thống nhất dữ liệu của mỗi bên sẽ bắt đầu được đánh số từ đâu.
TCP giải quyết việc này bằng ba gói tin.
Bước 1: SYN
Máy khách muốn mở một kết nối TCP.
Nó chọn một số thứ tự (sequence number) ban đầu, ví dụ 100, rồi gửi:
MÁY KHÁCH MÁY CHỦ
SYN
seq = 100
------------------------------------>
SYN báo rằng:
Tôi muốn bắt đầu một kết nối mới. Dãy số của tôi bắt đầu từ đây.
Khi nhận được gói này, máy chủ biết có một máy khách đang muốn mở kết nối.
Nhưng lúc này mới chỉ có một chiều được xác nhận:
máy khách → máy chủ
Máy khách vẫn chưa biết SYN của mình có tới nơi hay không.
Bước 2: SYN + ACK
Máy chủ trả lời bằng một gói có cả SYN và ACK.
Nó cũng chọn số thứ tự ban đầu của riêng mình, ví dụ 500:
MÁY KHÁCH MÁY CHỦ
SYN + ACK
seq = 500
ack = 101
<------------------------------------
Hai phần này làm hai việc khác nhau.
ACK 101 → Tôi đã nhận SYN có seq = 100 của bạn.
SYN 500 → Dãy số của tôi bắt đầu từ 500.
Khi gói này tới máy khách, máy khách đã biết:
SYN của mình đã tới máy chủ.
Máy chủ cũng có thể gửi gói ngược lại.
Nhưng vẫn còn một vấn đề.
Máy chủ chưa biết SYN + ACK của mình có tới được máy khách hay không.
Bước 3: ACK
Máy khách gửi lại:
MÁY KHÁCH MÁY CHỦ
ACK
ack = 501
------------------------------------>
ack = 501 nói với máy chủ:
Tôi đã nhận SYN có seq = 500 của bạn.
Đến đây, cả hai chiều đều đã được xác nhận:
máy khách → máy chủ ✓
máy chủ → máy khách ✓
Và cả hai cũng đã biết số thứ tự ban đầu của phía bên kia.
Toàn bộ quá trình:
MÁY KHÁCH MÁY CHỦ
SYN
seq = 100
------------------------------------>
SYN + ACK
seq = 500
ack = 101
<------------------------------------
ACK
ack = 501
------------------------------------>
Máy khách
- máy chủ muốn nói chuyện?
- ✓
- máy chủ nghe thấy mình?
- ✓
ĐÃ KẾT NỐI
Máy chủ
- máy khách muốn nói chuyện?
- ✓
- máy khách nghe thấy mình?
- ✓
ĐÃ KẾT NỐI
Đó là bắt tay ba bước (three-way handshake) của TCP.
Tại sao phải có bước thứ ba?
Thử dừng lại sau hai bước:
MÁY KHÁCH MÁY CHỦ
SYN
------------------------------------>
SYN + ACK
<------------------------------------
Máy khách đã nhận được SYN + ACK, nên nó biết:
máy chủ đã nhận được SYN của mình.
Nhưng nhìn từ phía máy chủ, nó chỉ biết:
mình đã nhận SYN và đã gửi SYN + ACK.
Nó chưa biết gói trả lời đó có tới máy khách hay bị mất giữa đường.
ACK cuối cùng xác nhận điều đó.
Có thể nhìn ba bước như sau:
1. Máy khách → Máy chủ
Tôi muốn mở kết nối.
Số thứ tự của tôi bắt đầu ở đây.
2. Máy chủ → Máy khách
Tôi đã nhận được.
Số thứ tự của tôi bắt đầu ở đây.
3. Máy khách → Máy chủ
Tôi cũng đã nhận được số thứ tự của bạn.
Sau bước thứ ba, hai bên có đủ thông tin để coi kết nối TCP đã được thiết lập.
Số thứ tự để làm gì?
TCP không chỉ cần biết gói tin có tới nơi hay không.
Sau khi kết nối được mở, một luồng dữ liệu có thể được chia thành nhiều phần:
A B C D E F G H ...
Mỗi byte trong luồng TCP được gắn với một vị trí trong dãy số.
Nhờ vậy, bên nhận có thể phát hiện những chuyện như:
đoạn nào đã tới;
đoạn nào chưa tới;
đoạn nào tới sai thứ tự;
đoạn nào bị gửi lại.
Mỗi chiều có dãy số riêng.
máy khách ───────────────→ máy chủ
dãy của máy khách
máy khách ←─────────────── máy chủ
dãy của máy chủ
Ba bước bắt tay chính là lúc hai bên cho nhau biết điểm bắt đầu của hai dãy số đó.
Các con số 100 và 500 ở trên chỉ là ví dụ.
Ý quan trọng là:
SYN
→ bắt đầu một kết nối và gửi số thứ tự ban đầu
SYN + ACK
→ xác nhận SYN của phía kia và gửi số thứ tự của mình
ACK
→ xác nhận số thứ tự của phía còn lại
Kết nối TCP lúc này đã mở.
Với HTTPS, bước tiếp theo chưa phải là gửi nội dung trang web ngay. Trình duyệt còn phải thiết lập TLS trước, rồi HTTP mới chạy bên trong kết nối đã mã hóa.
Nhưng TCP đã hoàn thành phần việc của nó: tạo ra một luồng dữ liệu hai chiều có thứ tự giữa hai máy.
Vấn đề là mạng vẫn có thể làm mất một phần dữ liệu trong luồng đó.
Nếu một phần dữ liệu bị mất giữa đường thì TCP biết bằng cách nào?