Khi nào tắt TCP SACK?


28

Tôi đã xem xét các thông số điều chỉnh Linux và thấy một số cấu hình trong đó SACK bị tắt. Bất cứ ai có thể giải thích điều này?

Điều này sẽ được điều chỉnh cho một máy chủ web bận rộn.

Câu trả lời:


34

Một ACK TCP cơ bản nói rằng "Tôi đã nhận được tất cả các byte lên tới X." ACK chọn lọc cho phép bạn nói "Tôi đã nhận được byte XY và VZ."

Vì vậy, ví dụ, nếu một máy chủ gửi cho bạn 10.000 byte và byte 3000-5000 bị mất trong quá cảnh, ACK sẽ nói "Tôi đã nhận được mọi thứ lên tới 3000." Đầu kia sẽ phải gửi byte 3001-10000 một lần nữa. SACK có thể nói "Tôi đã nhận 1000-2999 và 5001-10000" và chủ nhà sẽ chỉ gửi 3000-5000.

Điều này là tuyệt vời trên một liên kết băng thông cao, mất mát (hoặc độ trễ cao). Vấn đề là nó có thể gây ra các vấn đề hiệu suất nghiêm trọng trong các trường hợp cụ thể. Các ACK TCP thông thường sẽ khiến máy chủ xử lý kết nối băng thông cao, mất kết nối với găng tay trẻ em (gửi 500 byte, chờ, gửi 500 byte, chờ, v.v.). SACK cho phép nó thích ứng với độ trễ cao vì nó biết chính xác có bao nhiêu gói đã thực sự bị mất.

Đây là nơi những điều xấu có thể xảy ra. Kẻ tấn công có thể buộc máy chủ của bạn giữ một hàng đợi truyền lại khổng lồ trong một thời gian dài, sau đó xử lý toàn bộ điều chết tiệt đó nhiều lần. Điều này có thể chốt CPU, ăn RAM và tiêu thụ nhiều băng thông hơn mức cần thiết. Tóm lại, một hệ thống nhẹ có thể khởi tạo DoS chống lại máy chủ mạnh hơn.

Nếu máy chủ của bạn hoạt động mạnh và không phục vụ các tệp lớn, bạn sẽ cách ly khá tốt với điều này.

Nếu bạn chủ yếu phục vụ mạng nội bộ hoặc nhóm người dùng có độ trễ thấp khác, SACK không mua gì cho bạn và có thể bị tắt vì lý do bảo mật mà không làm giảm hiệu suất.

Nếu bạn đang sử dụng một liên kết băng thông thấp (giả sử là 1Mb / giây trở xuống như một quy tắc hoàn toàn tùy ý), SACK có thể gây ra sự cố trong các hoạt động bình thường bằng cách bão hòa kết nối của bạn và nên tắt đi.

Cuối cùng, tùy bạn. Xem xét những gì bạn đang phục vụ, cho ai, từ những gì và cân nhắc mức độ rủi ro của bạn đối với các hiệu ứng hiệu suất của SACK.

Có một cái nhìn tổng quan tuyệt vời về SACK và lỗ hổng của nó ở đây.


FTR: kể từ Linux 4.18 có bật SACK . Nó có thể cải thiện hiệu suất trên các mạng không dây. Ngoài ra, phần nào có liên quan: nhận xét ban đầu của nhà phát triển .
Hi-Angel

12

Một lý do khác khiến TCP SACK thường bị vô hiệu hóa là có một số lượng đáng kinh ngạc các thiết bị mạng ngoài đó không xử lý chính xác tùy chọn này. Chúng tôi thấy điều này mọi lúc với một sản phẩm truyền tệp tốc độ cao mà chúng tôi cung cấp sử dụng TCP. Vấn đề phổ biến nhất là các thiết bị cổng làm những việc như ngẫu nhiên số thứ tự cho các gói TCP chuyển qua thiết bị từ mạng bên trong sang bên ngoài, nhưng không "không ngẫu nhiên" các tùy chọn TCP SACK có thể được gửi từ xa kết thúc. Nếu các giá trị SACK thực tế không được dịch lại thành các giá trị phù hợp bởi các thiết bị này, thì phiên TCP sẽ không bao giờ hoàn thành khi mất gói khi đầu từ xa cố gắng sử dụng SACK để nhận các lợi ích ACK chọn lọc.

Có lẽ đây sẽ là một vấn đề ít hơn nếu mọi người áp dụng mạnh mẽ hơn việc bảo trì phần mềm phòng ngừa cho thiết bị này, nhưng họ có xu hướng không.


2
Xem bài viết RedHat KB này: Tại sao các kết nối TCP từ hệ thống máy khách phía sau bộ định tuyến ADSL bị treo không liên tục trong Red Hat Enterprise Linux? kbase.redhat.com/faq/docs/DOC-26683
Davey

6

Tôi có thể xác nhận từ kinh nghiệm cay đắng rằng tcp_sack = 1 gây ra việc truyền dữ liệu bị đình trệ qua sftp / rsync / scp, v.v ... với các tệp vượt quá khoảng 12mb khi sử dụng một số thiết bị tường lửa Cisco ASA.

MỌI THỜI GIAN Nó sẽ bị đình trệ.

Chúng tôi đã chuyển qua một liên kết 100mbps chuyên dụng giữa máy chủ A và máy chủ B ở hai trung tâm dữ liệu khác nhau, cả hai đều sử dụng tường lửa cisco và chuyển đổi phần cứng với centos.

Điều này có thể được giảm bớt phần nào bằng cách sửa đổi kích thước bộ đệm - ví dụ: tôi không thể chuyển tệp 1GB qua sftp từ máy chủ A sang máy chủ B trừ khi tôi đặt bộ đệm sftp thành 2048, nhưng tôi có thể bất kể máy chủ B có kéo tệp từ A.

Các thử nghiệm với cùng một tệp sử dụng rsync và gửi / nhận điều chỉnh bộ đệm cho phép tôi nhận được khoảng 70mb tệp 1GB được đẩy từ A đến B.

Tuy nhiên, câu trả lời cuối cùng là vô hiệu hóa tcp_sack trên máy chủ A. Ban đầu bằng cách đặt tcp_sack = 0 trong kernel khi đang di chuyển - nhưng cuối cùng - tôi đã thêm nó vào /etc/sysctl.conf


1
fwiw, Cisco ASA Firewall ở đây cũng có. Bản chất đơn hướng của vấn đề là gây bối rối, chúng tôi đã theo đuổi điều này trong nhiều tháng. Scp hoạt động ít nhiều "ở tốc độ" một chiều, nhưng thường xuyên bị đình trệ và hết thời gian theo hướng khác. Vô hiệu hóa tcp_sack là một phương pháp chữa bệnh.

@ jean-loup Tôi hy vọng bạn không đề nghị thay đổi thiết bị. Tôi đã gặp vấn đề này trong công việc cuối cùng và đã sửa nó bằng các thay đổi cấu hình. unix.stackexchange.com/questions/391125/NH
Rui F Ribeiro
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.