| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP/IP详解 卷1:协议 学习笔记 第二十六章 Telnet和Rlogin:远程登录 -> 正文阅读 |
|
[网络协议]TCP/IP详解 卷1:协议 学习笔记 第二十六章 Telnet和Rlogin:远程登录 |
TCP/IP网络上,有两种应用提供远程登录功能: Telnet是最老的一种Internet应用,起源于1969年的ARPANET(高级研究计划局网络,Advanced Research Projects Agency Network,通称阿帕网,是美国国防高级研究计划局开发的世界上第一个运营的数据包交换网络,是全球互联网的鼻祖),Telnet的名字是电信网络协议telecommunication network protocol的缩写词。
通过比较Telnet和Rlogin的客户进程和服务器进程源代码的行数,就可以直到这两者的复杂程度: 远程登录不是那种有大量数据报传输的应用,客户进程和服务器进程交互的分组大多比较小。终端上键入的一条短命令往往令服务器进程端产生许多输出。 Rlogin第一次发布是在4.2BSD中,当时它仅能实现Unix主机间的远程登录,这使得Rlogin比Telnet简单。由于客户进程和服务器进程的操作系统都能预知对方的操作系统类型,因此不需要选项协商机制。Rlogin协议后来也派生出了几种非Unix版本。 当Rlogin的客户进程和服务器进程的TCP连接建立完毕后,会发生以下动作: Rlogin客户进程每次给服务器发送一个字节的内容,并且接收服务器进程的所有返回信息,这里使用了Nagle算法,从而可以保证在速率较低的网络上,若干输入字节以单个TCP报文段传输。 默认,Rlogin的流量控制是由客户进程完成的。客户进程能识别用户键入的STOP和START的ASCII字符(Control_S和Control_Q),并且终止或启动终端的输出,如果客户进程不能识别这两个字符,每次我们为终止终端输出而键入的Control_S字符向服务器进程传递时,服务器进程还在向客户进程发送数据,在输出停止之前,可能有很多字节还会在屏幕上显示: 当我们在客户端键入一个中断字符时(DELETE或Control_C),也会发生上例这种服务器还继续发送数据直到收到中断字符的情况,而我们的本意是要中断字符尽快终止某进程,使得屏幕上不再有任何响应输出。 对于以上的Control_C、DELETE、Control_S、Control_Q特殊字符,在客户端起作用后也会发送到服务器,此时就不需要采用TCP的紧急方式来传送了。 如果是窗口式的显示方式,在客户的应用程序运行时,我们可以动态地改变窗口的大小,一些应用需要直到窗口大小的变化,Rlogin客户需要采用某种方法通知服务器窗口大小变化情况。 Rlogin的服务器进程也可给客户发命令,但只有一条TCP连接可用,所以服务器进程需要给命令字节做标记,使得客户进程可以从数据流中识别出命令,而不是显示在终端上。服务器要给客户发命令时,服务器就进入紧急方式,且把命令放在紧急数据的最后一个字节中,当客户接收到紧急方式通知时,它从连接上读取数据并保存起来,直到读到命令字节(即紧急数据的最后一个字节),此时客户根据读到的命令,再决定对于所读到数据是显示在终端上还是丢弃它。 采用TCP紧急方式发送Rlogin从服务器到客户的命令的原因在于,命令清仓输出需要立即发送给客户,即使服务器到客户的数据流被窗口流量控制所终止(这是常发生的,因为服务器的输出速率通常大于客户终端的显示速率)。
Rlogin中客户到服务器的命令只有一条,就是将当前窗口大小发送给服务器。当客户的窗口大小发生变化时,客户并不立即向服务器报告,除非收到了服务器发来的0x80命令。 客户同样需要对命令字节进行标注,使服务器可以在数据流中识别出命令,而不是把它发送到上层的应用中,处理方法是在两个字节的0xff后跟两个特殊的标志字节下。对于窗口大小命令,两个标志字节是ASCII码的s,之后是4个16bit长的数据(网络字节序),分别是行数、列数、X方向的像素数、Y方向的像素数,通常,后两个16bit是0,因为Rlogin服务器进程调用的应用程序通常以字符为单位来度量屏幕,而非像素点。 从客户到服务器的命令采用带内信令,这是因为命令字节和其他的普通数据一起传输,选择0xff字节表示这个带内信令的原因是一半用户操作不会产生0xff这个字节,因此Rlogin是不完备的,如果我们采用某种办法通过键盘产生两个连续的0xff字节+两个连续的ASCII的s字符,则后面字节会被认为是窗口大小。 对于服务器到客户的Rlogin命令,大多数API采用的技术叫做带外数据,所以将其称为带外命令。 由于从客户到服务器的命令使用的是带内信令,因此服务器进程必须检查从客户进程收到的每个字节,看是否有两个0xff字节。对于从服务器到客户的带外信令,客户进程不需要检查收到的每个字节,除非服务器进入了紧急方式,即使在紧急方式下,客户进程也仅仅需要留意紧急指针所指向的字节。由于从服务器到客户的数据量远大于从客户到服务器的数据量,因此带内信令比较适合从客户到服务器这种较少数据量的情况,而带外信令适合于从服务器到客户传输数据这种数据量比较大的情况。 有时,Rlogin客户不需要把键入的信息传输到服务器,而是要和Rlogin客户进程直接通信,方法是在一行的开头键入代字符 只有当客户的Unix支持任务控制时,以上命令3、4才会生效。 从主机bsdi到服务器svr4的Rlogin建立一个连接时的时间序列,图中去掉了TCP的建立过程、窗口通告、服务类型信息): 随后服务器在报文段7中发送窗口请求命令,这是采用TCP紧急方式发送的,这里是采用了较老的解释,即紧急指针指明的序号是紧急数据的最后一个字节加1。之后客户回送12字节的数据:2字节的0xff、2字节的s、4个16bit长度的窗口数据。 随后服务器发送的4个报文段(10、12、14、16)是服务器操作系统的问候,之后的报文段18是一个7字节长度的shell进程的提示符" svr4% "。 随后客户每键入一个字节,就发送一个字节。 客户和服务器都可以主动中断该连接,如果在服务器端输入一个命令,让服务器的shell终止运行,则服务器会中断该连接;如果我们给Rlogin客户键入一个转移符 Rlogin的客户进程端口号是1023,这是IANA分配的。Rlogin协议要求客户进程使用小于1024的端口号,这类端口的术语叫保留端口。Unix中,客户进程一般不能使用保留端口号,除非客户进程有root权限,这是客户进程和服务器进程相互鉴别的一部分,这种鉴别可以使得用户不需要口令直接登录。 在主机上sun上运行Rlogin客户进程,登录到主机bsdi,向终端输出一个大文本文件,然后键入Control_S中断输出,当输出停止时,键入中断键(DELETE)以异常方式终止该进程:
我们键入的中断键在报文段9中被传输到服务器进程,服务器进程接收到中断键后,服务器进程把它发送给应用程序cat,cat就终止,由于cat被终端中断键终止,应用就清空它的输出缓存,服务器进程发现后,通过TCP紧急方式向客户进程发送清仓输出命令(报文段10),报文段10告诉客户进程在命令字节前还有3419个字节(从26727到30145)在服务器进程的发送缓存中等待发送。 报文段10采用紧急通知方式发送,包含了服务器进程向客户进程要发送的下一个字节26727,这个字节并不是清仓输出命令字节,它只是服务器进程发送1个字节的数据来试探客户的接收窗口是否关闭,然后客户进程TCP就发送了报文段11通知服务器当前接收窗口还是0,但客户进程内部已经知道了对方有紧急通知。 服务器发送报文段12的原因是,如果连接的一端处于TCP紧急模式,则每收到一个报文段,就会发送一个报文段,这个报文段中没有告诉客户任何新信息,只是重申进入了紧急模式。 当客户进程开始读取已经在输入缓存中等待被读取的数据时,接收窗口会重新打开(报文段13),然后服务器进程就开始正常发送数据(报文段14、15、17、18),报文段18中包含紧急数据的最后一个字节的数据,客户收到该命令后,它就丢弃报文段14、15、17、18所收到的数据,且清空终端的输出缓存。报文段19中的2个字节是中断键的回显 Telnet可工作在任何操作系统之间。 RFC 854定义了Telnet的规范,其中还定义了一种通用字符终端,叫做网络虚拟终端(NVT,Network Virtual Terminal)。NVT是虚拟设备,连接的双方都必须把它们的物理终端转换为NVT格式,同时,不管服务器进程的终端是什么类型,操作系统必须能把NVT格式转换为终端能支持的格式。 NVT是带有键盘和打印机的字符设备,用户击键产生的数据被发送到服务器进程,服务器进程回送的响应输出到打字机上。 NVT ASCII代表7比特的ASCII字符集,网间网协议族都是用NVT ASCII,每个7比特的字符都以8比特格式发送,最高位比特为0。行结束符以回车(CR)+换行(LF)表示,用\r\n表示。单独的回车也是以两个字符序列(\r\0)表示。FTP、SMTP、Finger、Whois协议都以NVT ASCII藐视客户命令和服务器的响应。 Telnet通信的两个方向都是用带内信令方式。字节0xff叫做IAC(interpret as command,作为命令解释),该字节后面的一个字节才是命令字节。如果要发送的数据是0xff,则发送两个连续的0xff(由于Telnet的数据流是NVT ASCII,是7bit的格式,因此255不能在Telnet上传输,但Telnet中有一个选项,可以允许数据以8bit传输)。
对于一个选项,连接的任何一方都能发送以下4种请求之一: 根据Telnet规定,对于激活请求(上述请求1、2),接收方有权同意或不同意,对于使选项失效的请求(上述请求3、4),必须同意,这样4种请求会组合出6种情况: 有些选项不是仅仅用激活和禁用就能表达的,如指定终端类型,客户进程必须发送一个ASCII字符串表示终端类型,为此,定义了子选项协商机制: Telnet的服务器进程和客户进程,有4种操作方式: Telnet以Data Mark(DM)命令作为同步信号,该同步信号是以TCP紧急数据形式发送的,它告诉接收端回到正常的处理过程上来,Telnet的双方都能发送该命令。当一端收到对方已经进入了紧急方式的通知后,它开始读数据流,一边读一边丢弃读的数据,直到读到Telnet命令为止,采用TCP紧急方式的原因是,即使TCP数据流已经被TCP流量控制所终止,该命令也可以在连接上传输。 Telnet客户进程也可以使用户直接和客户进程进行交互,通常客户的转义字符是 单字符方式下,用户在终端输入的每个字符都将发送到服务器进程,服务器进程的响应也将以字符方式回显到终端上。这种方式下与服务器连接时的选项协商过程: 以下是以上过程的时间序列(去掉了连接建立部分): 报文段3是标注9的内容,即DO TERMINAL TYPE命令。 报文段5中是标注10~17的内容,长27字节,其中10~16是常规选项,每个占3字节,17是子选项,占6个字节。 报文段6中包含12字节,对应标注18,是客户发送它的终端类型子选项。 报文段8中包含53字节,其中含两个Telnet命令和47字节的输出数据,两个命令是服务器的WILL ECHO和DO ECHO,输出数据为: 报文段9包含客户发送的标注20和22两个选项SENT DO ECHO和SENT WONT ECHO。 报文段10中含标注23表示的客户接收到的选项DONT ECHO。之后双方就可以交互数据了,交互过程中还可进行选项协商。报文段12是服务器发送的提示符 上例中,客户端发起选项协商,而在18章中,telnet命令的tcpdump并没有看到客户发起选项协商,这是由于在Unix系统中,除非使用标准的Telnet端口号23,否则客户进程不进行选项协商,这一特性使得Telnet客户进程可以使用标准的NVT同其他一些非Telnet服务器进程交换数据。 为描述Telnet行方式选项协商过程,使用主机BSD/386和4.4BSD,它们都支持这个选项,以下是行方式选项协商与上例单字符方式的区别: 一旦登录完成,客户进程将把数据以整行方式发送给服务器,这种行方式大大减少了客户和服务器之间的数据交互量,且对于用户的击键(回显和编辑)提供更快的响应。 在行方式下,我们输入以下命令: 如果在服务器端运行一个需要进入单个字符方式的应用(如vi编辑器),会发生如下交互: 以上过程和键入口令的过程说明:客户直接回显与单个字符方式或一次一行方式没有依赖关系。当我们键入口令时,客户直接回显必须关闭,但一次一行方式有效;对于一个编辑器,客户直接回显失效而单个字符方式必须有效。 以上过程后,普通命令处理过程就和行方式类似了,即客户处理所有的编辑和回显,并以整行的方式发送给服务器。 以下是进入准行方式客户端的过程: 准行方式下,如果在服务器运行如vi这样一次一字符的应用,服务器必须告诉客户从准行方式切换到单字符方式,当应用结束时,服务器还要告诉客户返回准行方式,以下是协商要点: 报文段2是服务器对DO TIMING MARK选项的响应。 报文段3、4是Telnet的同步信号 如果客户的缓冲区已满,那么客户发送了报文段1中的IP命令后就丢弃收到的所有数据。即使服务器被TCP的流量控制所终止而不能发送报文段2、3、4中的数据,紧急指针仍可发送。
Rlogin和Telnet都采用了TCP紧急方式,以便从服务器到客户的数据传输被流量控制终止时,服务器仍然可以向客户发送命令。 Rlogin客户进程必须使用保留端口号,通常使用的是512~1023之间的保留端口,这限制了一个主机只能有512个远程登录的客户,实际上,这个限制一般小于512,因为这个范围内的一些端口被其他服务器,如远程登录服务器,用作了知名端口。对于一个TCP连接,TCP的限制是4元组必须唯一,由于Rlogin服务器总是使用了知名端口513,因此一台单接口主机上多个Rlogin客户只有在它们和不同的服务器主机(假设此主机上只有一个接口)相连接时才可以使用相同的保留端口,然而Rlogin没有采用重用保留端口的技术,如果使用了此技术,理论限制就变为最多有512个Rlogin客户和同一个服务器主机相连。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 5:20:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |