Tại sao các dịch vụ sử dụng TCP phổ biến có UDP cũng như các mục TCP trong / etc / services?


22

Tôi đang đọc một cuốn sách về lập trình mạng với Go. Một trong các chương liên quan đến tệp / etc / services. Một cái gì đó tôi nhận thấy trong khi khám phá tệp này là các mục phổ biến nhất định như HTTP và SSH, cả hai đều sử dụng TCP ở lớp vận chuyển, có mục nhập thứ hai cho UDP. Ví dụ trên Ubuntu 14.04:

ubuntu@vm1:~$ grep ssh /etc/services  
ssh             22/tcp         # SSH Remote Login Protocol 
ssh             22/udp

ubuntu@vm1:~$ grep http /etc/services  
http            80/tcp          www             # WorldWideWeb HTTP            
http            80/udp                          # HyperText Transfer Protocol

Bất cứ ai cũng biết tại sao những điều này có hai mục? Tôi không tin SSH hoặc HTTP từng sử dụng UDP (được xác nhận bởi câu hỏi này cho SSH).


7
22/udpđã bị xóa trong Debian vào năm 2016. IANA vẫn liệt kê 22 / udp và liệt kê cả udp và tcp cho hầu hết các giao thức thường chỉ được thực hiện trên một trong số chúng. Có thể chỉ có nghĩa là 22 được dành riêng cho ssh trong trường hợp ai đó muốn thực hiện ssh qua udp một ngày nào đó?
Stéphane Chazelas

2
Xem thêm phần 7.1 của rfc6335
Stéphane Chazelas

Câu trả lời:


29

Về cơ bản, đó là vì đó là truyền thống từ cách trở lại khi số cảng bắt đầu được gán thông qua cho đến khoảng năm 2011. Xem, ví dụ, §7.1 “Nguyên tắc quá khứ” của RFC 6335 :

Các cổng TCP và UDP được gán đồng thời khi được yêu cầu

Tất nhiên, có thể chúng sẽ không được phân bổ vào một ngày nào đó, tất nhiên, vì các cổng 1023 trở xuống là "cổng hệ thống", được xử lý đặc biệt bởi hầu hết các hệ điều hành và hầu hết phạm vi đó hiện đang được chỉ định.

Và, nhân tiện, HTTP / 3 chạy trên UDP. Mặc dù nó có thể sử dụng bất kỳ cổng UDP nào, không chỉ 80/443. Vì vậy, thực sự những người vẫn chưa được sử dụng.

Theo như Debian có liên quan, /etc/servicesđã có 22 / udp trong 1.0 (buzz 1996) .

Tuy nhiên, nó đã bị xóa trong cam kết này vào năm 2016, lần đầu tiên được phát hành trong phiên bản 5.4 của netbasegói.

Khi viết, phiên bản ổn định mới nhất của Debian (buster) có 5.6 . Và gói netbase Ubuntu LTS (18.04, bionic) mới nhất dựa trên Debian netbase 5.4 và bạn có thể thấy thay đổi của nó cũng đề cập đến việc loại bỏ udp / 22 .


4
@SergiyKolodyazhnyy Tôi nghĩ là không, vì thực tế này có trước tường lửa.
derobert

3
@TobySpeight Đó không chỉ là Linux, đó là một phần của các tiêu chuẩn có liên quan. Xem, ví dụ, §6 của RFC đó. Mặc dù IANA cũng đăng ký các cổng cao hơn, chúng là một phân loại khác nhau (và điều đó quan trọng trong thực tế vì cách các HĐH, không chỉ Linux, đối xử với chúng). Tôi sẽ làm rõ điều đó một chút. Ngoài ra, 0 không phải là một cổng hợp lệ. Nó được API socket sử dụng làm ký tự đại diện (để nói với kernel chọn một cổng cho bạn).
derobert

2
"0 không phải là một cổng hợp lệ" là nghi vấn. Đây chắc chắn không phải là một cổng có thể sử dụng được trên HĐH của chúng tôi (đó là lý do tại sao tôi gọi nó một cách cụ thể và tại sao nó hiện được bảo lưu và không có khả năng được gán cho bất cứ thứ gì), nhưng nó không đặc biệt ở cấp độ giao thức.
Toby Speight

1
@derobert: Đối số của bạn là cổng 0 không sử dụng được trên các máy Unix cổng 0 có nghĩa là "chọn một cổng miễn phí". Tôi đang nói rằng lập luận là sai. Kết luận không tuân theo logic từ tiền đề.
MSalters

3
Mặc dù nó có thể sử dụng bất kỳ cổng UDP nào, không chỉ 80/443 Điều đó thực sự đúng với bất kỳ giao thức TCP / UDP nào, đây chỉ là các cổng mặc định được liên kết với nhau. Hầu hết các ứng dụng sử dụng TCP và UDP không cung cấp cách chỉ định các cổng không mặc định, nhưng HTTP cho phép chúng được chỉ định trong các URL để việc thay đổi cổng trở nên khả thi hơn.
Barmar
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.