Kích thước gói tối đa cho kết nối TCP là bao nhiêu hoặc làm cách nào tôi có thể nhận được kích thước gói tối đa?
Kích thước gói tối đa cho kết nối TCP là bao nhiêu hoặc làm cách nào tôi có thể nhận được kích thước gói tối đa?
Câu trả lời:
Giới hạn tuyệt đối về kích thước gói TCP là 64K (65535 byte), nhưng trên thực tế, nó lớn hơn nhiều so với kích thước của bất kỳ gói nào bạn sẽ thấy, vì các lớp thấp hơn (ví dụ ethernet) có kích thước gói thấp hơn.
Ví dụ, MTU (Đơn vị truyền tối đa) cho Ethernet là 1500 byte. Một số loại mạng (như Token Ring) có MTU lớn hơn và một số loại có MTU nhỏ hơn, nhưng các giá trị được cố định cho từng công nghệ vật lý.
Đây là một câu hỏi xuất sắc và tôi thực sự gặp phải vấn đề này rất nhiều trong công việc. Có rất nhiều câu trả lời "đúng về mặt kỹ thuật" như 65k và 1500. Tôi đã thực hiện rất nhiều công việc viết giao diện mạng và sử dụng 65k là ngớ ngẩn, và 1500 cũng có thể khiến bạn gặp rắc rối lớn. Công việc của tôi diễn ra trên rất nhiều phần cứng / nền tảng / bộ định tuyến khác nhau và thành thật mà nói, nơi tôi bắt đầu là 1400 byte. Nếu bạn CẦN hơn 1400 bạn có thể bắt đầu tiến lên, bạn có thể đến 1450 và đôi khi đến 1480? Nếu bạn cần nhiều hơn thế thì tất nhiên bạn cần chia thành 2 gói, trong đó có một số cách làm rõ ràng ..
Vấn đề là bạn đang nói về việc tạo gói dữ liệu và viết nó ra thông qua TCP, nhưng tất nhiên có dữ liệu tiêu đề được xử lý và cứ thế, vì vậy bạn có "hành lý" đưa bạn đến 1500 hoặc hơn thế nữa .. và cả rất nhiều phần cứng có giới hạn thấp hơn.
Nếu bạn "đẩy nó", bạn có thể nhận được một số điều thực sự kỳ lạ đang diễn ra. Dữ liệu bị cắt, rõ ràng hoặc bị mất dữ liệu mà tôi hiếm khi thấy. Dữ liệu bị hỏng cũng hiếm khi nhưng chắc chắn không xảy ra.
send()
nếu nó thuận tiện.
1480'ish
nên là 1460
. Tiêu đề IP và tiêu đề TCP chiếm tối thiểu 20 byte mỗi cái (trừ khi các trường tiêu đề tùy chọn được sử dụng) và do đó, tối đa cho Ethernet (khung không phải Jumbo) là 1500 - 20 -20 = 1460
.
Ở cấp độ ứng dụng, ứng dụng sử dụng TCP làm giao thức hướng luồng. Lần lượt TCP có các phân đoạn và tóm tắt các chi tiết làm việc với các gói IP không đáng tin cậy.
TCP giao dịch với các phân đoạn thay vì các gói. Mỗi phân đoạn TCP có số thứ tự được chứa trong tiêu đề TCP. Dữ liệu thực tế được gửi trong một phân đoạn TCP là biến.
Có một giá trị cho gotockopt được hỗ trợ trên một số HĐH mà bạn có thể sử dụng được gọi là TCP_MAXSEG, lấy ra kích thước phân đoạn TCP tối đa (MSS). Nó không được hỗ trợ trên tất cả các hệ điều hành.
Tôi không chắc chắn chính xác những gì bạn đang cố gắng thực hiện nhưng nếu bạn muốn giảm kích thước bộ đệm đã sử dụng, bạn cũng có thể xem xét: SO_SNDBUF và SO_RCVBUF.
Theo http://en.wikipedia.org/wiki/Maximum_seribution_size , kích thước lớn nhất mặc định cho gói IPV4 trên mạng là 536 octet (byte có kích thước 8 bit). Xem RFC 879
Không có gói nào trong TCP API.
Có các gói trong các giao thức cơ bản thường xuyên, như khi TCP được thực hiện qua IP, điều mà bạn không quan tâm, bởi vì chúng không liên quan gì đến người dùng ngoại trừ việc tối ưu hóa hiệu suất rất tinh vi mà bạn có thể không quan tâm (theo xây dựng câu hỏi).
Nếu bạn hỏi số byte tối đa bạn có thể có send()
trong một lệnh gọi API là bao nhiêu thì đây là cài đặt và cài đặt phụ thuộc. Bạn thường gọi send () cho các khối lên đến vài kilobyte và luôn sẵn sàng để hệ thống từ chối chấp nhận hoàn toàn hoặc một phần, trong trường hợp đó, bạn sẽ phải quản lý việc chia tách thành các phần nhỏ hơn để đưa dữ liệu của mình vào API gửi () TCP.
Nói chung, điều này sẽ phụ thuộc vào giao diện mà kết nối đang sử dụng. Bạn có thể có thể sử dụng ioctl () để lấy MTU và nếu đó là ethernet, bạn thường có thể nhận được kích thước gói tối đa bằng cách trừ kích thước của tiêu đề phần cứng từ đó, là 14 cho ethernet không có Vlan.
Đây chỉ là trường hợp nếu MTU ít nhất là lớn trên toàn mạng. TCP có thể sử dụng phát hiện MTU đường dẫn để giảm MTU hiệu quả của bạn.
Câu hỏi là, tại sao bạn quan tâm?
Có vẻ như hầu hết các trang web trên internet sử dụng 1460 byte cho giá trị của MTU. Đôi khi, nó là 1452 và nếu bạn đang sử dụng VPN, nó sẽ giảm nhiều hơn cho các tiêu đề IPSec.
Kích thước cửa sổ mặc định thay đổi khá nhiều lên đến tối đa 65535 byte. Tôi sử dụng http://tcpcheck.com để xem các giá trị IP nguồn của riêng tôi và để kiểm tra xem các nhà cung cấp Internet khác đang sử dụng cái gì.
Một giải pháp có thể là đặt tùy chọn ổ cắm TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) thành giá trị "an toàn" với mạng bên dưới (ví dụ: được đặt thành 1400 để an toàn trên ethernet) và sau đó sử dụng một bộ đệm lớn trong cuộc gọi hệ thống gửi. Bằng cách này, có thể có các cuộc gọi hệ thống ít tốn kém hơn. Kernel sẽ phân chia dữ liệu để khớp với MSS.
Bằng cách này, bạn có thể tránh dữ liệu bị cắt và ứng dụng của bạn không phải lo lắng về bộ đệm nhỏ.
Kích thước gói cho cài đặt TCP trong giao thức IP (Ip4). Đối với trường này (TL), 16 bit được phân bổ, theo đó kích thước tối đa của gói là 65535 byte: Chi tiết giao thức IP