2011-01-14 45 views

Trả lời

256

Một thời gian dài trước đây tôi đã đọc một sự tương tự tuyệt vời để giải thích sự khác biệt giữa hai. Tôi không nhớ nơi tôi đọc nó vì vậy tiếc là tôi không thể tin tưởng tác giả cho ý tưởng này, nhưng tôi cũng đã thêm rất nhiều kiến ​​thức của riêng tôi vào tương tự cốt lõi anyway. Vì vậy, ở đây đi:

Ổ cắm luồng giống như cuộc gọi điện thoại - một bên đặt cuộc gọi, các câu trả lời khác, bạn chào hỏi nhau (SYN/ACK trong TCP), sau đó trao đổi thông tin. Một khi bạn đã làm xong, bạn nói lời tạm biệt (FIN/ACK trong TCP). Nếu một bên không nghe lời tạm biệt, họ sẽ thường gọi lại cho người kia vì đây là một sự kiện bất ngờ; thường thì máy khách sẽ kết nối lại với máy chủ. Có đảm bảo rằng dữ liệu sẽ không đến theo thứ tự khác với thứ tự bạn đã gửi và có bảo đảm hợp lý rằng dữ liệu sẽ không bị hỏng.

Ổ cắm datagram giống như truyền ghi chú trong lớp. Hãy xem xét trường hợp bạn không trực tiếp bên cạnh người bạn đang chuyển ghi chú tới; ghi chú sẽ di chuyển từ người này sang người khác. Nó có thể không đạt đến đích của nó, và nó có thể được sửa đổi bởi thời gian nó đến đó. Nếu bạn chuyển hai ghi chú cho cùng một người, họ có thể đến theo thứ tự bạn không có ý định, vì tuyến đường ghi chú qua lớp học có thể không giống nhau, một người có thể không ghi chú nhanh như ghi chú khác, v.v.

Vì vậy, bạn sử dụng một ổ cắm luồng khi có thông tin theo thứ tự và còn nguyên vẹn là quan trọng. Các giao thức truyền tệp là một ví dụ điển hình ở đây. Bạn không muốn tải một số tập tin với nội dung của nó ngẫu nhiên xáo trộn xung quanh và bị hư hỏng!

Bạn muốn sử dụng ổ cắm datagram khi đặt hàng ít quan trọng hơn giao hàng kịp thời (nghĩ VoIP hoặc giao thức trò chơi), khi bạn không muốn chi phí cao hơn của luồng (đây là lý do DNS chủ yếu là giao thức datagram) để các máy chủ có thể phản hồi nhiều, nhiều yêu cầu cùng một lúc rất nhanh), hoặc khi bạn không quan tâm quá nhiều nếu dữ liệu đến đích của nó.

Để mở rộng trên trường hợp VoIP/trò chơi, các giao thức như vậy bao gồm cơ chế đặt hàng dữ liệu của riêng chúng. Nhưng nếu một gói bị hỏng hoặc bị mất, bạn không muốn chờ giao thức luồng (thường là TCP) phát hành yêu cầu gửi lại - bạn cần phục hồi nhanh chóng. TCP có thể mất đến một số phút để phục hồi và các giao thức thời gian thực như chơi game hoặc VoIP thậm chí ba giây có thể không được chấp nhận! Sử dụng giao thức datagram như UDP cho phép phần mềm phục hồi từ một sự kiện như vậy cực kỳ nhanh chóng, bằng cách bỏ qua dữ liệu bị mất hoặc yêu cầu lại sớm hơn TCP.

VoIP là một ứng cử viên tốt để bỏ qua dữ liệu bị mất - một bên sẽ nghe thấy một khoảng trống ngắn, tương tự như những gì xảy ra khi nói chuyện với ai đó trên điện thoại di động khi họ tiếp nhận kém. Các giao thức chơi game thường phức tạp hơn một chút, nhưng các hành động thường sẽ là bỏ qua dữ liệu bị thiếu (nếu dữ liệu sau đó nhận được dữ liệu bị mất), yêu cầu lại dữ liệu bị thiếu hoặc yêu cầu cập nhật trạng thái hoàn chỉnh đảm bảo rằng trạng thái của máy khách được đồng bộ với máy chủ.

+1

Đơn giản chỉ cần tuyệt vời cho bao gồm cả các chi tiết của SYNACK. – LazerSharks

+0

Ví dụ này hoặc một ví dụ rất giống với Giao diện lập trình Linux. Ấn bản năm 2010 chứa các ví dụ này trên các trang 1155 và 1159. – Josh

19

Suối Socket:

  • chuyên dụng & point-to-point kênh giữa máy chủ và máy khách.
  • Sử dụng giao thức TCP để truyền dữ liệu.
  • Đáng tin cậy và không tổn thất.
  • Dữ liệu được gửi/nhận theo thứ tự tương tự.
  • dài thời gian cho việc khôi phục mất/dữ liệu nhầm

Datagram Socket:

  • Không dành riêng cho kênh & point-to-point giữa máy chủ và máy khách.
  • Sử dụng UDP để truyền dữ liệu.
  • Không đáng tin cậy 100% và có thể mất dữ liệu.
  • dữ liệu gửi/nhận được lệnh có thể không giống nhau
  • Không quan tâm hoặc nhanh chóng khôi phục các mất/dữ liệu nhầm
Các vấn đề liên quan