Tại sao trường giao thức là một phần của tiêu đề IP?


8

Lưu ý đây không phải là bản sao của Tại sao lớp IP nhận biết các lớp cao hơn trong ngăn xếp mạng?

Nhu cầu về một mã định danh giao thức (ví dụ: trường Giao thức của người đứng đầu IP) trong giao tiếp dựa trên gói là rõ ràng: Đây là hoặc một loại thuật toán suy luận chuyên sâu tính toán. Câu hỏi là: tại sao nó phải tồn tại như một phần của tiêu đề IP chứ không phải trong các tiêu đề của giao thức được đóng gói?

Dường như với tôi, đây là một trong những trường hợp mà sự rõ ràng về mặt lý thuyết đáp ứng những cân nhắc thực tế (AKA "Haskell gặp Go" ...): Một mặt đặt trường "giao thức" trong tiêu đề IP phá vỡ sự phân chia lợi ích theo khái niệm , ví dụ như . mô hình OSI nhằm mục đích; mặt khác, buộc các giao thức lên cao hơn ngăn xếp để xác định kiểu của chúng một cách nhất quán thì khó hơn nhiều và cuối cùng sẽ dẫn đến một tình huống tương tự (ví dụ: nếu mọi giao thức lên cao hơn ngăn xếp sử dụng byte tiêu đề đầu tiên để nêu loại , nó trông giống như IP sử dụng byte tiêu đề cuối cùng của nó để làm tương tự).

Vì vậy, câu hỏi của tôi là - lý do đằng sau việc đặt trường "giao thức" bên trong tiêu đề gói của IP chứ không phải bất cứ nơi nào khác?

Chỉnh sửa : Khi viết câu hỏi này, tôi đã suy nghĩ có nên thêm từ " nguyên bản " trước khi "lý luận" hay không, tức là lý do của nhóm đã nghĩ ra IP , nhưng cho rằng nó là dư thừa vì câu hỏi đã được đặt ra ở thì quá khứ ("cái gì câu lý luận ... "). Tuy nhiên, điều này có vẻ cần thiết, vì không có câu trả lời nào thực sự trả lời câu hỏi đó. Một số hiểu biết về lưu ý:

  • @immibis đề xuất bất kỳ hình thức nào khác sẽ phá vỡ các mô hình của các giao thức khác (ví dụ: các giao thức truyền thông được mã hóa sẽ phải có trường nhận dạng văn bản gốc)
  • @Eddie về cơ bản nói rằng lý do là quy ước (chấp nhận thiết kế chuỗi giao thức , mặc dù tại sao đó là quy ước vẫn còn là một bí ẩn)
  • @Ricky nhấn mạnh tính thực tiễn như một sự cân nhắc bao quát
  • @Claudio đề xuất rằng trường giao thức là một phần của tiêu đề được đóng gói, cần có một bước xác định tiêu đề bổ sung , trong đó mô hình hiện tại diễn ra trong quá trình phân tích cú pháp của tiêu đề IP

Vì vậy, tôi sẽ viết lại: Có gì sai với một mô hình trong đó thay vì mọi tiêu đề xác định loại tiêu đề tiếp theo, mọi tiêu đề đều xác định loại riêng của nó ở một vị trí được xác định trước (ví dụ: trong byte tiêu đề đầu tiên)? Tại sao một mô hình như vậy bất kỳ ít mong muốn hơn so với mô hình hiện tại?

Chỉnh sửa # 2 : Có vẻ như câu trả lời là sự kết hợp của một số câu trả lời được đưa ra (chủ yếu là những câu được đề cập ở trên cùng với phụ lục thứ hai của @ Eddie):

  1. Tính đơn giản: Phá vỡ nguyên tắc của thuyết bất khả tri trong trường hợp cụ thể này có nghĩa là toàn bộ ngăn xếp (hoặc mô hình) có thể đơn giản hơn:

    • Không có giai đoạn "nhận dạng giao thức", không ngầm định hay rõ ràng
    • Độc lập lớp được cải thiện (ví dụ: trình xử lý truyền thông được mã hóa không phải chia sẻ một lớp với bất kỳ giao thức trợ giúp nào)

    Quy định cũng được đơn giản hóa rất nhiều, không phải thực thi bất kỳ yêu cầu nào trên các giao thức máy khách.

  2. Hiệu suất: Việc nêu rõ giao thức của gói được đóng gói trước gói đó cho phép một số loại giao thức định tuyến nhanh (lọc gói, QOS, chuyển mạch cắt) được tích hợp vào chính lớp mạng (internet); sau đó chúng có thể đưa ra quyết định nhanh chóng như bảng băm có thể được truy cập, điều này quan trọng hơn cả khi xem xét phần cứng giới hạn mà giao thức này được thiết kế để chạy.

Mô hình này có nhược điểm của nó, nhưng dường như đối với các trường hợp sử dụng phổ biến, nó phù hợp hơn các lựa chọn thay thế.


10
Nếu số giao thức là một phần của dữ liệu được đóng gói và bạn không biết định dạng của dữ liệu được đóng gói (vì bạn không biết giao thức), vậy làm thế nào để bạn biết tìm số giao thức ở đâu?
dùng253751

Tốt viết lại câu hỏi của bạn. Nó có ý nghĩa hơn bây giờ những gì bạn đang yêu cầu. Tôi nghĩ rằng tôi đã có câu trả lời, nhưng tôi sẽ cho nó một ngày hoặc lâu hơn để nghiền ngẫm trong đầu để đảm bảo nó có ý nghĩa.
Eddie

6
"What's wrong with a model where instead of every header identifying the next header's type, every header identifies its own type in a predetermined location?"Bởi vì sau đó, nó thực sự chỉ là byte cuối cùng của tiêu đề IPv4 (hoặc bất kỳ giao thức cấp thấp hơn) nào ngoài tên. Đó là một vấn đề "gà hoặc trứng". Bạn không thể phân tích tiêu đề nếu bạn không biết giao thức đó là gì.
thiệu lại

Thêm suy nghĩ của tôi vào câu trả lời của tôi dưới đây. Ngoài ra, tôi nghĩ rằng @reirab đã đưa ra một điểm tuyệt vời.
Eddie

1
Điều gì khiến bạn nói "việc đặt trường giao thức trong tiêu đề IP sẽ phá vỡ sự phân tách lợi ích theo khái niệm, ví dụ như mô hình OSI nhắm đến"? Một giao thức thấp hơn luôn có thông tin về giao thức trên: bạn có thể coi nó là siêu dữ liệu. Chính xác là tính năng này cho phép phân lớp, không phải là một cách giải quyết thực tế: đó là một yêu cầu. Đề xuất rằng một lớp thấp hơn có thể tự xác định cách nó chọn sẽ thực sự phá vỡ sự tách biệt lợi ích. Đối với một vấn đề tương tự, bạn có thể xem xét các loại mã mở rộng tệp so với (loại Macintosh) so với các mẫu "ma thuật" Unix.
jonathanjo

Câu trả lời:


13

Hãy nhớ rằng, các bit đến trên một NIC là một chuỗi 1 và 0. Một cái gì đó phải tồn tại để ra lệnh làm thế nào các chuỗi 1 và 0 tiếp theo nên được diễn giải.

Ethernet2 là chuẩn defacto cho L2, do đó, nó được giả định để hiểu 56 bit đầu tiên là Lời mở đầu và 8 bit tiếp theo là Lời mở đầu và 48 bit tiếp theo là MAC đích và 48 bit tiếp theo là Nguồn MAC, vân vân và vân vân .

Biến thể duy nhất có thể là tiêu đề 802.3 L2 có phần lỗi thời , trước tiêu chuẩn Ethernet2 hiện tại, nhưng cũng bao gồm một tiêu đề SNAP phục vụ cho cùng một mục đích. Nhưng tôi lạc đề.

Tiêu đề, Ethernet2 L2 tiêu chuẩn có trường Loại, cho biết nút nhận biết cách diễn giải 1 và 0 theo sau: Tiêu đề Ethernet với trường Loại được tô sáng

Nếu không có điều này, làm thế nào để thực thể nhận biết tiêu đề L3 là IP hay IPv6? (hoặc AppleTalk, hoặc IPX hoặc IPv8, v.v ...)

Tiêu đề L3 (vào cùng khung như trên) có trường Giao thức, cho biết nút nhận làm thế nào để diễn giải bộ 1 và 0 tiếp theo theo tiêu đề IP: Tiêu đề IP với trường Giao thức được tô sáng

Một lần nữa, nếu không có điều này, làm thế nào để thực thể nhận biết giải thích các bit đó như một gói ICMP? Nó cũng có thể là TCP, hoặc UDP, hoặc GRE, hoặc một tiêu đề IP khác, hoặc rất nhiều thứ khác.

Điều này tạo ra một loại chuỗi giao thức để chỉ cho thực thể nhận cách diễn giải tập bit tiếp theo. Nếu không có điều này, kết thúc nhận sẽ phải sử dụng phương pháp phỏng đoán (hoặc chiến lược tương tự khác) để xác định loại tiêu đề, sau đó diễn giải và xử lý các bit. Điều này sẽ thêm chi phí đáng kể ở mỗi lớp và độ trễ đáng chú ý trong xử lý gói.

Tại thời điểm này, việc xem xét tiêu đề TCP hoặc tiêu đề UDP rất hấp dẫn và chỉ ra rằng các tiêu đề đó không có trường Loại hoặc Giao thức ... nhưng hãy nhớ lại, một khi TCP / UDP đã giải thích các bit, nó sẽ chuyển tải trọng của nó sang ứng dụng. Mà chắc chắn có thể có một số loại dấu hiệu để ít nhất xác định phiên bản của giao thức L5 +. Ví dụ: HTTP có số phiên bản được tích hợp trong các yêu cầu HTTP: (1.0 so với 1.1).


Chỉnh sửa để nói với chỉnh sửa của người đăng ban đầu:

Có gì sai với một mô hình trong đó thay vì mọi tiêu đề xác định loại tiêu đề tiếp theo, mọi tiêu đề đều xác định loại riêng của nó ở một vị trí được xác định trước (ví dụ: trong byte tiêu đề đầu tiên)? Tại sao một mô hình như vậy bất kỳ ít mong muốn hơn so với mô hình hiện tại?

Trước khi đi vào câu trả lời của tôi, tôi nghĩ rằng đáng chú ý rằng có lẽ không có câu trả lời triệu đô dứt khoát nào về lý do tại sao cách này tốt hơn hay cách khác. Trong cả hai trường hợp, giao thức tự nhận dạng so với giao thức xác định những gì nó gói gọn, thực thể nhận sẽ có thể diễn giải các bit một cách chính xác.

Điều đó nói rằng, tôi nghĩ rằng có một vài lý do tại sao giao thức xác định tiêu đề tiếp theo có ý nghĩa hơn:

# 1

Nếu tiêu chuẩn dành cho byte đầu tiên của mỗi tiêu đề để nhận dạng chính nó, thì điều này sẽ đặt một tiêu chuẩn cho mọi giao thức ở mọi lớp. Điều đó có nghĩa là nếu chỉ có một byte dành riêng, chúng ta chỉ có thể có 256 giao thức. Ngay cả khi bạn dành riêng hai byte, điều đó giới hạn bạn ở 65536. Dù bằng cách nào, nó cũng đặt giới hạn tùy ý về số lượng giao thức có thể được phát triển.

Trong khi đó, nếu một giao thức chỉ chịu trách nhiệm phiên dịch tiếp theo và ngay cả khi chỉ có một byte dành riêng cho từng trường nhận dạng giao thức, thì ít nhất bạn phải chia tỷ lệ tối đa 256 cho mỗi lớp.

# 2

Các giao thức sắp xếp các trường của chúng theo cách cho phép nhận các thực thể tùy chọn chỉ kiểm tra mức tối thiểu để đưa ra quyết định chỉ tồn tại nếu trường giao thức tiếp theo tồn tại trong tiêu đề trước.

Ethernet2 và chuyển mạch " Cut-Through " xuất hiện trong tâm trí. Điều này là không thể nếu các byte đầu tiên (vài) bị buộc phải là một khối nhận dạng giao thức.

# 3

Cuối cùng, tôi không muốn nhận tín dụng, nhưng tôi nghĩ câu trả lời của @reirab trong phần bình luận trong các bình luận của câu hỏi ban đầu là vô cùng khả thi:

Bởi vì sau đó, nó thực sự chỉ là byte cuối cùng của tiêu đề IPv4 (hoặc bất kỳ giao thức cấp thấp hơn) nào ngoài tên. Đó là một vấn đề "gà hoặc trứng". Bạn không thể phân tích tiêu đề nếu bạn không biết giao thức đó là gì.

Được trích dẫn với sự cho phép của Reirab


3
Có, và cũng có các giao thức lớp 4 còn tồn tại ngoài TCP hoặc UDP. IP không thực sự quan tâm đến khối lượng của nó, bao gồm các giao thức chưa được phát minh ..
Ron Maupin

@Eddie Chương trình chụp gói đó là gì?
Levi

2
@Levi: trông giống như WireShark.
Mat

1
@Levi thật khó để nhấn mạnh giá trị của việc biết Wireshark cho bất kỳ ai tham gia vào mạng. Họ đưa ra một bộ video tuyệt vời từ hội nghị thường niên của họ, SharkFest, minh họa giá trị của nó và dạy rất nhiều khái niệm nâng cao.
Jeff Meden 2/2/2016

2
Ngoài ra, bạn hoàn toàn chính xác về lý do tại sao TCP và UDP không có trường loại giao thức / tải trọng. Ethernet và IP được thiết kế để chuyển tải trọng của chúng lên cấp cao hơn tiếp theo trong ngăn xếp mạng của HĐH, trong khi TCP và UDP được thiết kế để truyền tải trọng của chúng trực tiếp đến một ứng dụng trên một ổ cắm cụ thể. Ứng dụng đã biết giao thức nào được mong đợi trên ổ cắm đó. HĐH cần biết đủ để biết cách định tuyến gói đến đúng ổ cắm đích, nhưng chủ sở hữu của ổ cắm đó nên biết giao thức lớp cao hơn tiếp theo là gì.
đăng lại

8

Bạn cũng có thể hỏi tại sao một tiêu đề ethernet có trường Loại Ether. Ngăn xếp mạng cần biết giao thức nào trong lớp cao hơn tiếp theo sẽ nhận được trọng tải của lớp hiện tại.

Chỉnh sửa 1:

Lý do mà mỗi datagram có giao thức của lớp trên tiếp theo là để tạo ra sự độc lập của lớp. Mỗi lớp không quan tâm đến những gì trong tải trọng và không cần phải tìm trong tải trọng để xác định nơi cung cấp tải trọng. Hãy nghĩ về số giao thức trong tiêu đề là một địa chỉ nơi tải trọng sẽ được phân phối. Giống như số cổng TCP là địa chỉ TCP, chúng cho TCP biết nơi cung cấp tải trọng của nó.

Địa chỉ MAC đích báo cho bộ chuyển đổi mạng chuyển giao diện chuyển giao khung. Trường Loại Ether cho lớp 2 nơi phân phối tải trọng của nó, trường Giao thức trong tiêu đề IP cho lớp 3 biết nơi phân phối tải trọng của nó và số cổng trong TCP và UDP cho lớp 4 biết nơi cung cấp tải trọng của nó.

Hãy nghĩ về một tài xế xe tải 18 bánh móc ra một chiếc xe kéo để đưa nó đến một nơi nào đó. Anh ta không cần phải lo lắng những gì trong trailer, hoặc cho những gì nó sẽ được sử dụng; anh ta chỉ nhìn vào giấy tờ của mình và đưa nó đến nơi trong giấy tờ.

Bạn cần nhớ rằng mỗi giao thức được phát triển độc lập mà không biết giao thức lớp trên mới nổi nào sẽ được sử dụng. Trong một thời gian dài, giao thức lớp 3 chính được sử dụng trên ethernet là IPX. Nếu ethernet được tạo riêng cho IPX, ngày nay nó có phổ biến không? Ethernet được xây dựng để mang bất kỳ giao thức lớp 3 nào bằng cách có trường Loại Ether mà ngăn xếp mạng có thể sử dụng để quyết định tải trọng ethernet đi đâu. IP cũng làm điều tương tự, và TCP và UDP cũng vậy. Đây là một phương pháp dễ dàng và hợp lý, đó là lý do tại sao mỗi lớp được phát triển độc lập trong ngăn xếp mạng có một mức tương đương. Bạn và bất kỳ ai khác quan tâm, có thể tự do phát triển (các) giao thức của riêng bạn cho bất kỳ lớp nào có thể dễ dàng cắm vào ngăn xếp mạng vì điều này.

Chỉnh sửa 2:

Nó cho phép các giao thức lớp 3 khác nhau đăng ký với lớp 2. Bạn có thể chạy đồng thời các giao thức IPX (0x8137), IPv4, (0x0800), ARP (0x0806), IPv6 (0x86DD), v.v. 3 giao thức mà không biết gì về tải trọng (hoặc bỏ bất kỳ gói nào không có giao thức đã đăng ký). Bạn không muốn phải cài đặt giao thức lớp 2 khác nhau cho mỗi kết hợp giao thức lớp 3 bạn có, và điều đó sẽ được yêu cầu nếu giao thức lớp 2 phải biết thêm về giao thức lớp 3 ) để có thể đọc các tiêu đề gói. Ngay cả các tiêu đề gói IPv4 và IPv6 cũng khá khác nhau.

Dưới đây là danh sách không đầy đủ các giá trị cho các giao thức lớp 3 khác nhau có thể đăng ký với lớp 2.

Các giao thức lớp 4 cũng đăng ký với các giao thức lớp 3 khác nhau và các ứng dụng đăng ký với các giao thức lớp 4.

Câu hỏi ban đầu của bạn đặt ra rằng các lớp nên độc lập với nhau và loại điều này thực sự thúc đẩy sự độc lập của lớp, thay vì phá vỡ nó như bạn đề xuất. Lớp 2 không biết rằng tải trọng là IPv4, nó chỉ biết rằng ethertype là 0x0800 và nó sẽ chuyển tải trọng sang giao thức lớp 3 đã đăng ký ethertype đó.


1
Điều này. Đó là một tối ưu hóa lập trình. Làm thế nào để bạn biết cấu trúc dữ liệu nào được áp dụng mà không cần liệt kê nó là gì. Vị trí hợp lý của nó là trong Tiêu đề IP ("khai báo chuyển tiếp".) Hãy nhớ rằng IP được thiết kế trong thời đại mà máy tính có khả năng kém hơn rất nhiều.
Ricky Beam

4
@RickyBeam Không, đó không phải là một sự tối ưu hóa. Đó là một loại ID. Bạn không thể biến nó thành một phần của dữ liệu của giao thức cao hơn, bởi vì sau đó bạn cần biết giao thức để giải mã dữ liệu - rõ ràng, đây là một vòng tròn :)
Luaan 2/2/2016

2

Không phải là một câu trả lời trực tiếp cho câu hỏi của bạn, nhưng:

Một mặt, việc đặt trường "giao thức" trong tiêu đề IP sẽ phá vỡ sự phân tách lợi ích theo khái niệm mà OSI hướng tới.

TCP / IP được phát triển mà không cần tham khảo mô hình OSI. Trong khi họ chia sẻ một số điểm tương đồng, đó là một nỗ lực phát triển riêng biệt.


Cảm ơn. Ban đầu tôi đã sử dụng " mô hình OSI nhắm đến ", chính xác hơn trong bối cảnh này. Tôi sẽ viết lại.
Docom 2/2/2016

1

Lý do đơn giản nhất, là để giúp phân tích cú pháp khi nhận được một gói.

Nếu bạn biết giao thức nào tuân theo, bạn có thể phát triển các ràng buộc chặt chẽ hơn. Khía cạnh động duy nhất trong gói IP là kích thước (sự hiện diện của các tùy chọn IP làm tăng kích thước này theo bội số của bốn byte).

Trong giai đoạn phân tích cú pháp, bạn có thể kiểm tra độ dài tiêu đề ip, giao thức. Sau đó, trong xác thực gói cấp thấp, dữ liệu gói được đọc thông qua cấu trúc dữ liệu (thông thường, các tiêu đề icmp, tcp, udp) và với gói dễ dàng được xác thực.


0

Chỉ cần đọc tiêu đề:

Khi gói IP chứa dữ liệu TCP, trường số giao thức sẽ có giá trị 6 trong đó, do đó, tải trọng sẽ được gửi đến ngăn xếp TCP, sau đó TCP sẽ sử dụng số cổng để gửi dữ liệu đến đúng ứng dụng. Điều tương tự là đối với UDP với giao thức số 17.

Một cách khác để xem trường số giao thức IP là, nếu chúng ta không có trường này trong tiêu đề gói IP, IP sẽ chỉ có khả năng mang một loại dữ liệu, trong khi thêm trường này cho phép IP mang nhiều loại dữ liệu được phân biệt bởi số giao thức, tương tự với TCP / UDP sử dụng cổng TCP / UDP để phục vụ nhiều ứng dụng và Ethernet bằng Ethertype, v.v.

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.