linux网络:telnet客户端登陆过程
1、用户通过telnet客户端连接服务器。如果服务器配置为独立(Standalone)模式,则在服务器监听连接请求是一个telnetd进程,它fork出一个telnetd子进程来服务客户端,父进程仍监听其它连接请求。另外一种可能是服务器端由系统服务程序inetd或xinetd监听连接请求,inetd称为Internet Super-Server,它监听系统中的多个网络服务端口,如果连接请求的端口号和telnet服务端口号一致,则fork/exec一个telnetd子进程来服务客户端。xinetd是inetd的升级版本,配置更为灵活。
2、telnetd子进程打开一个伪终端设备,然后再经过fork一分为二:父进程操作伪终端主设备,子进程将伪终端从设备作为它的控制终端,并且将文件描述符0、1、2指向控制终端,二者通过伪终端通信,父进程还负责和telnet客户端通信,而子进程负责用户的登录过程,提示输入帐号,然后调用exec变成login进程,提示输入密码,然后调用exec变成Shell进程。这个Shell进程认为自己的控制终端是伪终端从设备,伪终端主设备可以看作键盘显示器等硬件,而操作这个伪终端的“用户”就是父进程telnetd。
3、当用户输入命令时,telnet客户端将用户输入的字符通过网络发给telnetd服务器,由telnetd服务器代表用户将这些字符输入伪终端。Shell进程并不知道自己连接的是伪终端而不是真正的键盘显示器,也不知道操作终端的“用户”其实是telnetd服务器而不是真正的用户。Shell仍然解释执行命令,将标准输出和标准错误输出写到终端设备,这些数据最终由telnetd服务器发回给telnet客户端,然后显示给用户看。
如果telnet客户端和服务器之间的网络延迟较大,我们会观察到按下一个键之后要过几秒钟才能回显到屏幕上。这说明我们每按一个键telnet客户端都会立刻把该字符发送给服务器,然后这个字符经过伪终端主设备和从设备之后被Shell进程读取,同时回显到伪终端从设备,回显的字符再经过伪终端主设备、telnetd服务器和网络发回给telnet客户端,显示给用户看。也许你会觉得吃惊,但真的是这样:每按一个键都要在网络上走个来回!
BSD系列的UNIX在/dev目录下创建很多ptyXX和ttyXX设备文件,XX由字母和数字组成,ptyXX是主设备,相对应的ttyXX是从设备,伪终端的数目取决于内核配置。而在SYS V系列的UNIX上,伪终端主设备是/dev/ptmx,“mx”表示Multiplex,意思是多个主设备复用同一个设备文件,每打开一次/dev/ptmx,内核就分配一个主设备,同时在/dev/pts目录下创建一个从设备文件,当终端关闭时就从/dev/pts目录下删除相应的从设备文件。Linux同时支持上述两种伪终端,目前的标准倾向于SYS V的伪终端。
个人总结:
init---[shell]--->inetd---fork-->inetd--exec-->telnet客户服务进程----fork---->telnet(将伪终端作为控制端,将文件描述符指向控制端)------->login
|----->处理telnet连接 |---建立伪终端
|---处理telnet客户端网络连接
参考来源:http://blogxl.blog.163.com/blog/static/20161612320119237490923/