Lập trình mạng Python: giao thức TCP (phần 3)

Các TCP sockets nghĩa là gì

Giống như trường hợp với UDP trong học phần trước, TCP sử dụng các số cổng để phân biệt các ứng dụng
khác nhau chạy tại cùng địa chỉ IP, và nó tuân theo chính xác cùng thông lệ liên quan đến các số cổng
được biết đến nhiều không bền. Đọc lại phần “Port Numbers” trong học phần trước nếu bạn muốn xem lại chi
tiết.
Như bạn đã thấy trong học phần trước, nó chỉ lấy một socket đơn để nói chuyện với UDP: một máy chủ có thể
mở một cổng UDP và sau đó nhận các datagrams từ hàng nghìn máy khách khác nhau. Trong khi nó là chắc chắn
có thể để connect() một datagram socket tới một peer cụ thể để rằng socket sẽ luôn send() tới chỉ peer đó và
recv() các gói dữ liệu được gửi quay trở lại từ peer đó, ý tưởng về kết nối chính là sự thuận tiện. Tác dụng
của connect() chính xác tương tự như ứng dụng của bạn đơn giản quyết định trên bản thân nó để gửi chỉ tới
một địa chỉ với các lời gọi sendto() và sau đó bỏ qua các trả lời từ bất cứ địa chỉ nào trừ cái tương tự.
Nhưng với một giao thức dòng trạng thái như TCP, lời gọi connect() trở thành bước mở trên đó tất cả trao đổi
thông tin mạng xa hơn là bản lề. Nó là khoảnh khắc khi stack mạng hệ điều hành của bạn kích hoạt giao thức handshake
mô tả trong phần trước rằng, nếu thành công sẽ tạo cả hai đầu cuối dòng TCP sẵn sàng cho sử dụng.
Cái này có nghĩa rằng một TCP connect(), không giống cùng lời gọi trên một UDP socket, có thể thất bại. Host ở xa có
thể không trả lời, hoặc nó có thể từ chối kết nối. Hay các lỗi giao thức mơ hồ hơn có thể xảy ra, như sự nhận ngay
lập tức một gói RST (thiết lập lại). Vì một kết nối dòng đòi hỏi thiết lập một kết nối ổn định giữa 2 hosts, host kia
cần đang lắng nghe và sẵn sàng để chấp nhận kết nối của bạn.

Chia sẻ