2009-11-06 7 views
27

Nếu tôi gửi hai thư TCP, tôi có cần xử lý trường hợp thư đến sau trước đó không? Hoặc là nó được đảm bảo để đến theo thứ tự tôi gửi nó? Tôi cho rằng đây không phải là một ví dụ cụ thể của Twisted, bởi vì nó phải phù hợp với tiêu chuẩn TCP, nhưng nếu ai đó quen thuộc với Twisted có thể cung cấp một câu trả lời cụ thể cho sự an tâm của riêng tôi, được đánh giá cao :-)TCP có được đảm bảo đến đúng thứ tự không?

+3

Kể từ TCP không có ý tưởng nơi các thông điệp của bạn bắt đầu hoặc kết thúc, làm thế nào có thể nó có thể sắp xếp lại chúng ngay cả khi họ muốn? –

Trả lời

44

Miễn là hai tin nhắn được gửi trên cùng một kết nối TCP, đơn đặt hàng sẽ được duy trì. Nếu nhiều kết nối được mở giữa cùng một cặp quy trình, bạn có thể gặp sự cố.

Về Twisted hoặc bất kỳ hệ thống sự kiện không đồng bộ nào khác: Tôi hy vọng bạn sẽ nhận được thông báo dataReceived theo thứ tự nhận được byte. Tuy nhiên, nếu bạn bắt đầu đẩy công việc vào các cuộc gọi trì hoãn, bạn có thể, erm ... "vặn" luồng điều khiển của bạn ngoài sự công nhận.

7

TCP là luồng, UDP là một thông báo. Bạn đang trộn các thuật ngữ. Đối với TCP, đúng là luồng sẽ đến theo thứ tự giống như nó được gửi đi. Không có thông báo phân biệt trong TCP, các byte xuất hiện khi chúng đến, diễn giải chúng dưới dạng tin nhắn tùy thuộc vào bạn.

+1

Re: terms - Yep, tất nhiên. Tuy nhiên, Twisted tóm tắt thông tin này thành các thông điệp riêng biệt (vì vậy diễn giải chúng dưới dạng tin nhắn không tùy thuộc vào tôi) – Smashery

+0

Và đáng chú ý là trong khi bạn có thể có hai ghi ở phía người gửi, chúng có thể sụp đổ thành một lần đọc ở phía người nhận và ngược lại ngược lại - tùy thuộc vào kích thước bộ đệm và điều kiện mạng. –

+1

Không, Xoắn không trừu tượng TCP thành "tin nhắn". Bạn sẽ nhận được một đoạn byte (xuống đến một byte tại một thời điểm trong trường hợp cực đoan) trong giao thức cơ bản. – truppo

20

TCP là định hướng kết nối và cung cấp cho Khách hàng theo thứ tự phân phối. Tất nhiên điều này áp dụng cho mức kết nối: các kết nối riêng lẻ là độc lập.

Bạn nên lưu ý rằng thông thường chúng tôi đề cập đến "luồng TCP" và "thư UDP".

Bất kể thư viện Khách hàng nào bạn sử dụng (ví dụ: Xoay), kết nối TCP cơ bản độc lập với nó. TCP sẽ cung cấp "thông báo giao thức" để khách hàng của bạn. Bởi "thông báo giao thức" tôi tham khảo tất nhiên để giao thức bạn sử dụng trên lớp TCP.

Lưu ý thêm rằng thao tác I/O không đồng bộ về bản chất và phụ thuộc vào tải hệ thống + cũng làm chậm trễ mạng & tổn thất, bạn không thể dựa vào thông báo giữa các kết nối TCP.

+0

Bạn có ý gì khi kết nối _between_ TCP? – simplename

11

TCP "đảm bảo" rằng người nhận sẽ nhận được luồng byte được hoàn nguyên do người gửi ban đầu gửi. Tuy nhiên, giữa các điểm cuối gửi/nhận TCP (tức là mạng vật lý), dữ liệu có thể được nhận không đúng thứ tự, nó có thể bị phân mảnh, nó có thể bị hỏng và thậm chí nó có thể bị mất. Tài khoản TCP cho những vấn đề này bằng cách sử dụng một cơ chế bắt tay gây ra các gói dữ liệu xấu được truyền lại. Ngăn xếp TCP trên máy thu đặt các gói này theo thứ tự mà chúng được truyền đi để khi bạn đọc từ ổ cắm TCP của bạn, bạn nhận được dữ liệu như được gửi ban đầu.

Khi bạn gọi phương thức doRead trong Xoắn, dữ liệu được đọc từ ổ cắm đến kích thước của bộ đệm. Dữ liệu này có thể đại diện cho một tin nhắn, một phần tin nhắn hoặc nhiều tin nhắn. Bạn có thể trích xuất các thông điệp từ bộ đệm, nhưng bạn được đảm bảo rằng các byte nằm trong thứ tự truyền của chúng tại điểm này.

Xin lỗi vì làm lẫn lộn các vùng biển với bài trước của tôi ...

+0

vui lòng truy cập lại câu trả lời của bạn vì bạn rất sai. API được TCP hiển thị là rất nhiều luồng có phân phối byte được sắp xếp. Bạn đang đề cập đến đây để phương thức vận tải cơ bản (tức là các gói) mà tất nhiên là không được bảo đảm đến theo thứ tự. – jldupont

+0

FYI, "lớp máy chủ" cho TCP là IP, tất nhiên là "không kết nối" và không đảm bảo việc phân phối đơn đặt hàng gói. – jldupont

+0

Bạn chính xác. Tôi sẽ làm rõ. Cảm ơn. –