TCP MSS tối thiểu trong Linux


9

TCP MSS trong Linux phải có ít nhất 88 (bao gồm / net / tcp.h):

/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS             88U

Câu hỏi của tôi là: họ đã nghĩ ra "60 + 60 + 8" ở đâu và tại sao? Tôi nhận được rằng 20 + 20 đến từ tiêu đề IP + tiêu đề TCP.

EDIT: Sau khi xem xét kỹ hơn các tiêu đề, công thức tìm kiếm cho tôi như thế này:

(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)

Câu hỏi vẫn còn: tại sao ? Tại sao nhân Linux sử dụng công thức này, do đó cấm (một luồng bắt buộc) các phân đoạn TCP, ví dụ, 20 byte? Hãy suy nghĩ iperf ở đây.

EDIT2: Đây là trường hợp sử dụng của tôi. Bằng cách buộc MSS thấp trên ổ cắm / kết nối, tất cả các gói được gửi bởi ngăn xếp sẽ có kích thước nhỏ. Tôi muốn đặt MSS thấp khi làm việc với iperf để kiểm tra gói / giây. Tôi không thể nhận các gói IP nhỏ hơn 128 byte (khung Ethernet là 142 byte) vì giới hạn thấp hơn cho MSS! Tôi muốn có kích thước khung hình Ethernet gần 64 byte theo RFC 2544. Về mặt lý thuyết điều này có thể xảy ra: 18 + 20 + 20 <64.


Làm thế nào điều này cấm các phân đoạn TCP 20 byte?
David Schwartz

MSS là viết tắt của Kích thước phân đoạn tối đa, đó là giới hạn trên (không phải thấp hơn) cho kích thước phân khúc trong kết nối cụ thể. TCP_MIN_MSS chỉ định giới hạn dưới cho giới hạn này. Vì vậy, nó không cấm trong bất kỳ phân đoạn nào có ít hơn 88 byte, nó chỉ nói rằng MSS cho bất kỳ kết nối nào phải> = 88 byte.
gelraen

Tất nhiên! Xin lỗi vì không đủ rõ ràng. Xin vui lòng xem chỉnh sửa mới nhất.
Mircea Gherzan

Tại sao bạn để tiền thưởng hết hạn? Câu trả lời của David ít nhất làm sáng tỏ sự hài lòng của tôi. Sự khác biệt giữa câu trả lời của anh ấy và của tôi là chúng ta đang nói về những cực tiểu khác nhau. Đối với giá trị của nó, có tối thiểu thứ ba, đó là 41 hoặc 20 + 20 + 1 byte dữ liệu TCP. Vì vậy, kích thước gói tối thiểu phụ thuộc vào lý do bạn yêu cầu. Tôi mong đợi 68 là câu trả lời đúng trong trường hợp kernel sử dụng TCP_MIN_MSS.
Warren Young

Tôi vẫn chưa hài lòng với câu trả lời. Tôi vẫn không thấy lý do mà hạt nhân không cho phép tôi áp đặt một MSS nhỏ tùy tiện cho một ứng dụng. Tôi rất thích có các gói IP được nạp TCP liên tục với 41 byte, nhưng tôi không thể, vì TCP_MIN_MSS. Tại sao nó không thể là 1? RFC sẽ phá vỡ cái gì? Những gì lý thuyết / vấn đề thực tế nó sẽ gây ra? Bạn có chắc chắn đó là "bên ngoài thông số kỹ thuật"? "Cực tiểu khác nhau"? Chỉ có một lợi ích tối thiểu ở đây: MSS nhỏ nhất được cho phép bởi kernel.
Mircea Gherzan

Câu trả lời:


5

Việc triển khai là cần thiết để hỗ trợ các tiêu đề TCP và IP có kích thước tối đa, mỗi tiêu đề là 60 byte.

Việc triển khai phải hỗ trợ các datagram 576 byte, mà ngay cả với các tiêu đề tối đa cũng có nghĩa là hơn 8 byte dữ liệu trong datagram. Để gửi các datagram có nhiều hơn 8 byte dữ liệu, phân mảnh IP phải đặt ít nhất 8 byte dữ liệu vào ít nhất một trong các gói đại diện cho các đoạn của datagram. Do đó, việc triển khai phải hỗ trợ ít nhất 8 byte dữ liệu trong một gói.

Đặt điều này cùng nhau, việc triển khai phải hỗ trợ các gói 60 + 60 + 8 byte.

Khi chúng tôi gửi các gói là một phần của luồng TCP, chúng có tiêu đề IP 20 byte (tùy chọn cộng) và tiêu đề TCP 20 byte (tùy chọn cộng). Điều đó để lại tối thiểu (60 + 60 + 8) - (20 + 20) byte cho dữ liệu và tùy chọn. Do đó, đây là mức tối đa chúng ta có thể đảm nhận một cách an toàn TCP MSS của việc triển khai.


1
MSS không bao gồm tiêu đề mặc dù (chỉ là tải trọng) và 60xuất hiện hai lần
Michael Mrozek

Việc triển khai phải có khả năng hỗ trợ một gói có tiêu đề có kích thước tối đa, nhưng chúng tôi không gửi tiêu đề có kích thước tối đa. Do đó, sự khác biệt giữa mức tối đa và những gì chúng tôi thực sự gửi là có sẵn cho dữ liệu và nên được thêm vào MSS.
David Schwartz

OK, vì vậy bạn đã giải thích 8 byte. Tôi không biết ý của bạn về tiêu đề "TCP / IP". Tôi biết một tiêu đề IP và một TCP. Và, như Michael chỉ ra 60 lần xuất hiện hai lần. Và RFC chỉ thảo luận về "MSS hiệu quả" chứ không phải là tối thiểu.
Mircea Gherzan

60 hiển thị hai lần, một lần cho tiêu đề IP và một lần cho tiêu đề TCP.
David Schwartz

68 chỉ là về sự phân mảnh. "60 + 60 + 8" có thể bị phân mảnh, vậy tại sao lại quan tâm đến việc phân mảnh? Ngay cả "68 + 20" cũng có thể bị phân mảnh. Và tại sao "phải" phía bên kia "chấp nhận" "60 + 60 + 8"? "Chấp nhận" như trong "không phân mảnh"? Dòng dưới cùng: tại sao tôi không được phép gửi "20 + 20" + 10 byte dữ liệu?
Mircea Gherzan

3

Tôi không biết con số đó đến từ đâu, nhưng tôi có thể nói với bạn nó nằm ngoài thông số kỹ thuật. MTU tối thiểu được hỗ trợ cho mạng IP là 576 byte, là 512 byte dữ liệu cộng với tối đa 64 byte cho các tiêu đề IP + TCP và tùy chọn TCP. Giá trị đó đã được chọn để cung cấp cho chi phí thấp trong trường hợp điển hình.

Việc tôi đọc các bit của mã hạt nhân cho thấy giá trị bạn đang hiển thị không phải là tùy ý. Có một thực tiễn cũ hơn là chỉ sử dụng hằng số 64 thay thế TCP_MIN_MSS. Do đó, tôi cho rằng có một số mạng IP-over-Foo kỳ lạ mà các nhà phát triển kernel đã gặp phải khiến họ quyết định họ có thể nâng giá trị lên những gì bạn thấy.

Tuy nhiên, loại mạng không chuẩn là gì, tôi không thể nói.


576 là MTU cho datagram . Trong trường hợp này, đó là giới hạn gói quan trọng, không phải giới hạn datagram vì các gói TCP đặt bit DF.
David Schwartz

MTU tối thiểu được xác định cho các datagram IP và các gói TCP cũng là các datagram IP.
gelraen

Đúng, nhưng giới hạn TCP này là dành cho các gói, không phải datagram, bởi vì các datagram TCP không bao giờ (bình thường). Ý nghĩa duy nhất trong đó quy tắc datagram 576 byte là nó có nghĩa là việc triển khai phải có khả năng hỗ trợ ít nhất 8 byte dữ liệu trong một gói (do đó là 8 trong công thức). Nếu không, sẽ không thể phân đoạn một datagram 576 byte.
David Schwartz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.