Không đáng tin cậy, backoff, phong toả và timeouts (tiếp tục)
Làm cách nào chúng ta viết một UDP client thực, một cái cái phải giải quyết thực tế rằng
các gói dữ liệu có thể bị mất?
Trước tiên tính không đáng tin cậy của UDP cái client phải thực hiện request của nó bên trong
một loop. Nó hoặc phải chuẩn bị chờ mãi mãi cho một câu trả lời hoặc tự ý quyết định khi nào
nó chờ quá dài cho một câu trả lời và rằng nó cần gửi cái khác. Lựa chọn khó khăn này là cần thiết
vì nhìn chung không có cách nào cho máy khchs phân biệt giữa 3 sự kiện hoàn toàn khác nhau này:
+ Câu trả lời mất thời gian lâu để quay trở lại, nhưng nó sẽ đến sớm.
+ Câu trả lời sẽ không bao giờ đến vì nó, hay request bị mất.
+ Server bị down, và nó không trả lời bất cứ ai.
Nên, một UDP client phải chọn một kế hoạch trên nó nó sẽ gửi các requests trùng nếu nó đã chờ một khoảng
thời gian hợp lí mà không nhận một câu trả lời. Tất nhiên, nó có thể kết thúc tốn thời gian của server bằng
cách làm cái này vì câu trả lời đầu tiên có thể sắp đến và bản copy thứ hai của request có thể gây server
thực hiện công việc trùng vô ích. Tại một vài điểm, tuy nhiên, client phải quyết định gửi lại request hay nó
có nguy cơ chờ mãi mãi.
Vì vậy, hơn là để hệ điều hành để nó dừng mãi mãi trong lời gọi recv(), client này trước tiên thực hiện một
settimeout() trên socket. Cái này thông báo hệ thống rằng client không sẵn sàng bị tắc chờ bên trong một hoạt
động của socket cho nhiều hơn các giây hoãn, và nó muốn lời gọi bị gián đoạn với một ngoại lệ socket.timeout
một khi một lời gọi đã chờ cho cái đó lâu.