ขอแสดงความยินดีคุณเพิ่งเจาะลึกถึงแนวคิดของเลเยอร์เครือข่ายโดยตระหนักว่าพอร์ตและโปรโตคอลไม่ได้เชื่อมต่อกันโดยตรง ตามที่คนอื่นพูด telnet สามารถใช้เพื่อเชื่อมต่อกับพอร์ต TCP ใด ๆ อย่างไรก็ตามเพื่อให้เข้าใจว่าทำไมจึงเป็นไปได้คุณจำเป็นต้องเข้าใจเกี่ยวกับเลเยอร์เครือข่าย หากคุณเคยได้ยินรุ่นชั้น OSI 7นี่คือสิ่งที่ช่วยให้คุณใช้ telnet เพื่อเชื่อมต่อกับพอร์ตอื่น แม้ว่าบนอินเทอร์เน็ตพวกเขาจะเกี่ยวข้องกับ 4 เลเยอร์เท่านั้นและเรียกว่าInternet Protocol Suite. หากไม่มีเลเยอร์เครือข่ายแต่ละโปรแกรมจะไม่เพียง แต่ต้องเข้าใจโปรโตคอลของตัวเอง แต่จะต้องกำหนดรูปแบบที่อยู่ IP และระบบพอร์ตของตัวเองซึ่งหมายความว่าเราเตอร์แต่ละคนจะต้องเข้าใจวิธีการกำหนดเส้นทางแผนการเหล่านี้และโปรโตคอลที่แตกต่างกัน เรียนรู้และวินิจฉัยได้ยากขึ้น ในการกล่าวง่ายๆก็คืออินเทอร์เน็ตจะทำงานได้ไม่ดีหากไม่มีเลเยอร์
สิ่งที่คุณกังวลคือเลเยอร์การขนส่งและเลเยอร์แอปพลิเคชัน ที่ transport layer เรามีโปรโตคอลอินเทอร์เน็ตเช่น TCP และ UDP พร้อมหมายเลขพอร์ตตั้งแต่ 1 ถึง 65535 ในแต่ละพอร์ต ที่ชั้นแอปพลิเคชันเรามีโปรโตคอลเช่น HTTP, SMTP และ DNS โดยปกติแล้วแต่ละเอกสารมาตรฐานอินเทอร์เน็ตที่กำหนดโปรโตคอลจะระบุพอร์ต TCP หรือ UDP เริ่มต้นที่โปรโตคอลควรใช้เป็นค่าเริ่มต้น เช่นพอร์ต TCP 80 สำหรับ HTTP, พอร์ต TCP 25 สำหรับ SMTP, พอร์ต UDP 53 สำหรับ DNS และพอร์ต TCP 23 สำหรับ Telnet โปรแกรม telnet พูดถึงโปรโตคอล TELNET ซึ่งเป็นโปรโตคอลมาตรฐานแต่ส่วนใหญ่โบราณนั้นเป็นไปตามมาตรฐานปัจจุบัน เนื่องจากลำดับโปรโตคอลของมันทำจากอักขระ 8 บิตคุณไม่ค่อยเห็นโปรโตคอลเองและส่วนใหญ่จะโปร่งใสเมื่อเปรียบเทียบกับโปรโตคอลอื่น ๆ ที่ทันสมัยกว่าเช่น HTTP และ SMTP ที่ใช้คำที่มนุษย์มองเห็นใน ASCII เช่น GET, POST, HELO, LOGIN, เป็นต้น
เนื่องจากโพรโทคอลไม่สามารถมองเห็นได้โดยทั่วไป telnet สร้างขึ้นเพื่อเป็นเครื่องมือที่เหมาะสมสำหรับการเชื่อมต่อกับพอร์ต TCP อื่นและอนุญาตให้ผู้ใช้พิมพ์โปรโตคอลด้วยตนเอง ผู้ดูแลระบบเครือข่ายบางรายใช้เทคนิคนี้เพื่อวินิจฉัยปัญหากับเซิร์ฟเวอร์ อย่างไรก็ตามเนื่องจากโปรแกรม telnet ยังคงมีโปรโตคอลของตัวเองและอาจส่งบิตเพิ่มเติมของข้อมูลบางครั้งคุณยังสามารถประสบปัญหากับเทคนิคนี้ เมื่อคุณใช้ telnet คุณจะ "ทำการเชื่อมต่อ" ที่ชั้นแอปพลิเคชันเช่นเดียวกับชั้นการขนส่ง มันเกิดขึ้นที่โปรโตคอลเลเยอร์แอปพลิเคชันอื่น ๆ อาจทำงานผ่านการวินิจฉัยส่วนใหญ่และจะไม่ยุ่งเกี่ยวกับโปรโตคอล telnet มีโปรแกรมที่ดีกว่าสำหรับการทำสิ่งนี้ผ่านการเรียก nc (Net Cat มันได้รับชื่อจากการเป็นคำสั่ง cat ตามเวอร์ชันเครือข่าย)
$ nc www.stackexchange.com 80
โปรแกรม nc ไม่ได้พูดถึงโพรโทคอลเลเยอร์ใด ๆ ของแอปพลิเคชันและเมื่อคุณทำการเชื่อมต่อกับมันคุณจะ "ทำการเชื่อมต่อ" ที่อินเทอร์เน็ตเลเยอร์ (ที่อยู่ IP) และขนส่งเลเยอร์ (TCP หรือ UDP) เท่านั้น หมายความว่าคุณควบคุมสิ่งที่ชั้นโปรโตคอลใช้ เกือบทุกอย่างเป็นเกมที่ยุติธรรมแม้แต่โพรโทคอลไบนารี นอกจากนี้ยังช่วยให้คุณทำสิ่งที่มีประโยชน์เช่นถ่ายโอนไฟล์โดยที่ไม่ได้รับความเสียหายและฟังพอร์ตสำหรับทราฟฟิกขาเข้า:
nc -l 9000 < movie.mp4 (Your friend runs this)
nc friends.computer.hostname 9000 > movie.mp4 (you run this)
และจากนั้น movie.mp4 จะถูกถ่ายโอนผ่านเครือข่ายโดยไม่ต้องใช้โพรโทคอลเลเยอร์ (เช่น FTP) เลย โปรโตคอลแอปพลิเคชันเป็นเพื่อนของคุณจริง ๆ แล้วบอกคุณว่าพวกเขาพร้อมให้คุณรันคำสั่งของคุณแล้ว
nc สามารถจัดการแพ็คเก็ต UDP และซ็อกเก็ต UNIX โดเมนได้ การใช้ฟังเพื่อฟังก็น่าสนใจเช่นกัน
nc -l 12345
ตอนนี้ในเว็บเบราว์เซอร์ของคุณไปที่http: // localhost: 12345 /และในเซสชัน nc ของคุณคุณควรเห็นGET / HTTP/1.1
คำขอของเบราว์เซอร์ ณ จุดนี้คุณสามารถพิมพ์บางสิ่งในและกดCtrl-D
และควรปรากฏขึ้นในเบราว์เซอร์ของคุณในข้อความธรรมดา (ถ้าคุณต้องการให้ HTML ปรากฏขึ้นคุณต้องส่งกลับการตอบสนองโปรโตคอล HTTP ที่เหมาะสมตามด้วยรหัส HTML)
บางครั้งโปรแกรมที่ใช้โปรโตคอลเดียวเช่น HTTP สามารถเชื่อมต่อกับพอร์ตอื่นที่มีความหมายสำหรับโปรโตคอลอื่นได้ โดยทั่วไปแล้วคุณไม่สามารถทำได้ในเบราว์เซอร์ GUI อีกต่อไปเพราะพวกเขาถูก จำกัด ไม่ให้เชื่อมต่อกับบางพอร์ต แต่ถ้าคุณใช้โปรแกรมเช่น curl เพื่อเชื่อมต่อกับพอร์ต 25 (SMTP สำหรับส่งจดหมาย) คุณอาจเห็น ข้อผิดพลาดเกี่ยวกับการทำลายโปรโตคอล
$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
สิ่งนี้เกิดขึ้นเพราะ curl พูดโพรโทคอล HTTP ตามปกติดังนั้นหลังจากสร้างแฮนด์เชค TCP แล้วมันเริ่มส่งข้อมูลดังนี้:
GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
แต่สิ่งที่เซิร์ฟเวอร์ SMTP คาดหวังคือ SMTP ซึ่งมีลักษณะดังนี้:
HELO myhomecomputername.local
ณ จุดนี้เซิร์ฟเวอร์จะส่งคืนบรรทัดการระบุ:
250 yourispsmtpserverhost.com
ดังนั้นคุณจะเห็นว่าไม่มีอะไรที่ป้องกันไม่ให้ curl สร้างการเชื่อมต่อเลเยอร์การขนส่งกับเซิร์ฟเวอร์ SMTP มันไม่สามารถพูดโปรโตคอลได้ แต่คุณสามารถพูดโพรโทคอลตัวเองด้วยโปรแกรมเช่น telnet หรือมากกว่า nc
nc(1)
) นั้นยืดหยุ่นกว่ามาก มันสามารถเชื่อมต่อกับบริการที่เข้ารหัส SSL / TLS และยังสามารถใช้เป็นเซิร์ฟเวอร์และแม้กระทั่งการถ่ายทอดข้อมูลรอบ ๆ