2009-05-27 38 views
19

Tôi thực sự không biết nhiều về các ổ cắm ngoại trừ cách đọc và ghi chúng như thể chúng là các tệp. Tôi biết một chút về việc sử dụng bộ chọn ổ cắm. Tôi không hiểu tại sao bạn phải tuôn ra một ổ cắm, những gì thực sự xảy ra ở đó? Các bit chỉ treo ở đâu đó trong bộ nhớ cho đến khi chúng bị đẩy ra? Tôi đọc một số điều trực tuyến về ổ cắm, nhưng tất cả đều rất trừu tượng và cao cấp.Có nghĩa là gì để tuôn ra ổ cắm?

Điều gì thực sự xảy ra ở đây?

Trả lời

42

Có một lượng chi phí nhất định liên quan đến việc ghi vào ổ cắm mạng và gửi dữ liệu. Nếu dữ liệu được gửi mỗi khi byte vào ổ cắm, bạn sẽ kết thúc với 40+ byte của tiêu đề TCP cho mỗi byte dữ liệu thực tế. (Giả sử bạn đang sử dụng một ổ cắm TCP, tất nhiên. Các ổ cắm khác sẽ có các giá trị khác nhau). Để tránh sự thiếu hiệu quả như vậy, socket duy trì một bộ đệm cục bộ, thường là hơn 1000 byte. Khi bộ đệm đó được lấp đầy, một tiêu đề được bao quanh dữ liệu và gói tin được gửi đi đến đích của nó.

Trong nhiều trường hợp, bạn không cần gửi từng gói ngay lập tức; nếu bạn đang chuyển một tệp, dữ liệu ban đầu có thể không được sử dụng mà không có dữ liệu cuối cùng của tệp, do đó, điều này hoạt động tốt. Nếu bạn cần buộc dữ liệu được gửi đi ngay lập tức, tuy nhiên, việc xả bộ đệm sẽ gửi bất kỳ dữ liệu nào chưa được gửi đi.

Lưu ý rằng khi bạn đóng một ổ cắm, nó sẽ tự động xóa sạch bất kỳ dữ liệu remaning, vì vậy không cần phải tuôn ra trước khi bạn đóng.

+0

NAGL liên kết với nhau như thế nào, bạn có biết không? – rogerdpack

+0

câu trả lời tuyệt vời .... – goh

1

Tôi chưa sử dụng phương pháp lập trình ổ cắm. Tôi nhớ một nơi nào đó có các chế độ mà bạn có thể thiết lập, nơi mà luồng định hướng gửi cố gắng giảm số gói nhỏ được gửi đi. Tuy nhiên, bạn sẽ sử dụng một sendall() để đảm bảo rằng tất cả mọi thứ trong bộ đệm được gửi đi.

Chức năng tắt() rất hữu ích khi bạn đang làm đổ xuống. Tất nhiên bạn phải sử dụng cuộc gọi close() nếu bạn không muốn nội dung bị treo xung quanh.

Hãy xem Beej's guide để biết thêm thông tin.

+3

sendall() là giống như tuôn ra() –

2

Thuật toán của Nagle thường được sử dụng trên ổ cắm. Tóm lại, nó chờ đợi cho đến khi có một lượng dữ liệu không nhỏ nhặt để gửi đi. Vấn đề là để đạt được một sự cân bằng giữa độ trễ truyền dẫn và chi phí trên không của việc gửi một gói dữ liệu.

Tải trọng dữ liệu lớn hơn, băng thông lãng phí càng nhỏ vì tiêu đề có kích thước cố định (chủ yếu). Hơn nữa, các hệ thống trung gian thường có các giới hạn hiệu suất dựa trên tốc độ gói tin đáng kể hơn, chứ không phải tốc độ dữ liệu tổng thể.

+0

Câu trả lời này không thực sự giải quyết như thế nào xả một quan hệ ổ cắm trong, mặc dù. –

9

Bạn không thể thực sự tuôn ra ổ cắm.

(Từ How can I force a socket to send the data in its buffer?)

Bạn không thể ép buộc nó. Giai đoạn. TCP tự quyết định khi nào nó có thể gửi dữ liệu. Bây giờ, bình thường khi bạn gọi write() trên một socket TCP,
TCP thực sự sẽ gửi một phân đoạn, nhưng không có bảo đảm và không có cách nào để bắt buộc. Có rất nhiều lý do tại sao TCP sẽ không gửi phân đoạn
: cửa sổ đã đóng và thuật toán Nagle là hai thứ để
đến ngay lập tức.

Đọc toàn bộ bài đăng, nó khá sâu và làm rõ rất nhiều điều cho tôi.

Các vấn đề liên quan