2016-06-11 19 views
5

Tôi dự định đặt bit cờ "không phân đoạn" trong Go, giống như this post khi ở trong C. Tôi đã chọn constant list nhưng tôi không tìm thấy tùy chọn này. Vì vậy, các tùy chọn tương ứng trong Go là gì?Làm cách nào để đặt bit cờ "không phân đoạn" cho gói TCP trong Go?

Cảm ơn trước!

+0

Có thể bạn sẽ cần vòng lặp của riêng mình để không cho phép phân đoạn, như trong https://github.com/beatgammit/arduino-tcp-server/blob/master/TCPServer.ino – VonC

+0

@VonC Xin chào, tôi không ' t hoàn toàn hiểu tại sao thiết lập byte đầu tiên là 0x81 (như đã đề cập trong README của họ) có thể ngăn chặn phân đoạn. Cảm giác ruột của tôi là số ma thuật này có thể tạo thành một byte cho một gói mà không bị phân mảnh, nhưng thực ra gói tin vẫn có thể bị phân mảnh. Tôi có đúng hay tôi bỏ lỡ bất cứ điều gì ở đây? Cảm ơn!! – zzy

+0

Câu hỏi hay. Tôi không biết, ngoại trừ phần 5.7 của https://datatracker.ietf.org/doc/rfc6455/?include_text=1 có các ví dụ khung đơn bắt đầu bằng '0x81'. – VonC

Trả lời

5

Làm cách nào để đặt bit cờ "không phân đoạn" cho gói TCP trong Go?

Đầu tiên bạn nên biết rằng TCP thực sự không thích các đoạn IP. Hầu hết nếu không phải tất cả các triển khai chính đều tránh sự phân mảnh cho các phân đoạn TCP bằng cách sử dụng phát hiện đường dẫn MTU.

TL; DR là gói IP điển hình chứa phân đoạn TCP có bộ bit DF. Bạn có thể (và nên) thử điều này. Ở đây tôi đang đánh hơi một vài giây lưu lượng truy cập giữa máy của tôi và stackoverflow.com:

% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com 
<wait a few seconds> 
% tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c 
    186 0x00000002 

0x02 có nghĩa là bit DF được đặt. Tôi thú nhận trong các ảnh chụp khác tôi đã thấy phân đoạn TCP không thường xuyên trong một gói IP mà không có bit DF; Tôi nghi ngờ rfc1191 có giải thích cho điều này.


Bây giờ trở lại câu hỏi của bạn, tôi nghĩ rằng không có cách nào di động để thiết lập các bit DF và đây là một câu hỏi rộng rãi hơn (thậm chí không có một cách POSIX-portable). Có (có thể) một lối thoát hiểm trong gói có liên quan để bạn triển khai theo số golang.org/x/sys.

Ví dụ: trên Unix hỗ trợ IP_DONTFRAG chẳng hạn như FreeBSD, người ta có thể sử dụng unix.SetsockoptInt và khai thác giá trị không đổi có liên quan.

Trên Linux, không có IP_DONTFRAG, như bạn đã khám phá từ the question you linked. Cách giải quyết dường như là sử dụng IP_MTU_DISCOVER, điều này sẽ có sẵn như là a constant in the unix package. Bạn có thể sử dụng cùng một số unix.SetsockoptInt để đặt.

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