Xin chúc mừng, bạn vừa đi sâu vào khái niệm các lớp mạng bằng cách nhận ra rằng các cổng và giao thức không được kết nối trực tiếp với nhau. Như những người khác đang nói, telnet có thể được sử dụng để kết nối với bất kỳ cổng TCP nào. Tuy nhiên để hiểu tại sao điều này là có thể, bạn cần hiểu một chút về các lớp mạng. Nếu bạn đã từng nghe về mô hình lớp OSI 7 thì đây là thứ cho phép bạn sử dụng telnet để kết nối với một cổng khác. Mặc dù trên Internet, họ chỉ quan tâm đến 4 lớp và được gọi là Bộ giao thức Internet. Không có các lớp kết nối mạng, mỗi chương trình không chỉ cần hiểu giao thức riêng mà còn phải xác định sơ đồ địa chỉ IP và hệ thống cổng riêng, điều đó có nghĩa là mỗi bộ định tuyến sẽ cần hiểu cách định tuyến các sơ đồ này và các giao thức khác nhau sẽ nhiều khó học và chẩn đoán hơn. Nói một cách đơn giản, Internet sẽ không hoạt động gần như không có lớp.
Những gì bạn quan tâm là lớp vận chuyển và lớp ứng dụng. Ở tầng giao vận, chúng ta có các giao thức Internet như TCP và UDP với số cổng từ 1 đến 65535 trên mỗi giao thức. Ở lớp ứng dụng, chúng ta có các giao thức như HTTP, SMTP và DNS. Thông thường mỗi tài liệu tiêu chuẩn Internet xác định giao thức chỉ định một cổng TCP hoặc UDP mặc định mà giao thức nên sử dụng theo mặc định. Chẳng hạn như cổng TCP 80 cho HTTP, cổng TCP 25 cho SMTP, cổng UDP 53 cho DNS và cổng TCP 23 cho Telnet. Chương trình telnet thực sự nói về giao thức TELNET, đây là một giao thức chuẩn, nhưng chủ yếu là một cổ xưa theo tiêu chuẩn hiện hành. Bởi vì các chuỗi giao thức của nó được tạo từ các ký tự 8 bit, bạn hiếm khi thấy giao thức và hầu như trong suốt khi so sánh với các giao thức hiện đại khác như HTTP và SMTP sử dụng các từ hiển thị của con người trong ASCII như GET, POST, HELO, LOGIN, Vân vân.
Do giao thức của nó thường không hiển thị, telnet được tạo cho một công cụ hợp lý để kết nối với các cổng TCP khác và cho phép người dùng nhập các giao thức theo cách thủ công. Một số quản trị viên mạng sử dụng kỹ thuật này để chẩn đoán sự cố với máy chủ. Tuy nhiên vì chương trình telnet vẫn có giao thức riêng và đôi khi có thể gửi thêm bit dữ liệu, bạn vẫn có thể gặp sự cố với kỹ thuật này. Khi bạn sử dụng telnet, bạn thực sự đang "tạo kết nối" ở lớp ứng dụng cũng như lớp vận chuyển. Nó chỉ xảy ra rằng các giao thức lớp ứng dụng khác có thể hoạt động tốt thông qua nó đối với hầu hết các chẩn đoán và sẽ không can thiệp vào giao thức telnet. Có một chương trình tốt hơn để thực hiện điều này thông qua được gọi là nc (Net Cat. Nó được đặt tên từ một phiên bản dựa trên mạng của lệnh cat).
$ nc www.stackexchange.com 80
Chương trình nc không nói bất kỳ giao thức lớp ứng dụng nào và khi bạn thực hiện kết nối với nó, bạn chỉ "tạo kết nối" ở lớp Internet (địa chỉ IP) và lớp Giao thông (TCP hoặc UDP). Điều đó có nghĩa là bạn kiểm soát giao thức lớp ứng dụng nào được sử dụng. Hầu như bất cứ điều gì là trò chơi công bằng, thậm chí các giao thức nhị phân. Điều này cũng cho phép bạn thực hiện những việc hữu ích như truyền tệp mà không bị hỏng và lắng nghe trên các cổng cho lưu lượng truy cập đến:
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
Và sau đó movie.mp4 được chuyển qua mạng mà không sử dụng giao thức lớp ứng dụng (chẳng hạn như FTP). Giao thức ứng dụng thực sự là bạn của bạn nói với bạn rằng họ đã sẵn sàng để bạn chạy lệnh của bạn.
nc cũng có thể xử lý các gói UDP và ổ cắm tên miền UNIX. Sử dụng nó để nghe cũng có thể thú vị.
nc -l 12345
Bây giờ trong trình duyệt web của bạn, hãy truy cập http: // localhost: 12345 / và trong phiên nc của bạn, bạn sẽ thấy GET / HTTP/1.1
yêu cầu của trình duyệt . Tại thời điểm này, bạn có thể nhập nội dung nào đó và nhấn Ctrl-D
và nó sẽ hiển thị trong trình duyệt của bạn ở dạng văn bản thuần túy (Nếu bạn muốn HTML hiển thị, bạn phải gửi lại phản hồi giao thức HTTP phù hợp theo mã HTML).
Đôi khi, các chương trình vốn nói một giao thức như HTTP có thể kết nối với các cổng khác dành cho một giao thức khác. Bạn thường không thể làm điều này trong trình duyệt GUI nữa vì họ đã hạn chế chúng kết nối với một số cổng, nhưng nếu bạn sử dụng chương trình như curl để kết nối với cổng 25 (SMTP để gửi thư), bạn có thể sẽ thấy một vài lỗi về phá vỡ giao thức.
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
Điều này xảy ra vì curl thường nói giao thức HTTP, vì vậy sau khi thiết lập bắt tay TCP, nó bắt đầu gửi dữ liệu như sau:
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
Nhưng những gì máy chủ SMTP đang mong đợi là SMTP, giống như thế này:
HELO myhomecomputername.local
Tại điểm đó, máy chủ sẽ gửi lại dòng nhận dạng của nó:
250 yourispsmtpserverhost.com
Vì vậy, bạn thấy rằng không có gì ngăn cản việc thiết lập kết nối lớp vận chuyển với máy chủ SMTP, nó chỉ không thể nói giao thức. Nhưng bạn có thể tự nói giao thức với một chương trình như telnet hoặc tốt hơn là nc.
nc(1)
) linh hoạt hơn nhiều. Nó có thể kết nối với các dịch vụ được mã hóa SSL / TLS, và cũng được sử dụng như một máy chủ và thậm chí chuyển tiếp dữ liệu xung quanh.