本文将从以下几个方面具体阐述nobody进程的前世今生
-
为什么需要nobody进程?
-
进程间通信的协议制定
为什么需要nobody进程
(1)为什么要使用nobody进程和服务进程两个进程?
1.在PORT模式下,服务器会主动建立数据通道连接客户端,服务器可能就没有权限做这种事情,就需要nobody进程来帮忙。 Nobody进程会通过unix域协议(本机通信效率高) 将套接字传递给服务进程。普通用户没有权限绑定20端口,需要nobody进程的协助,所以需要nobody进程作为控制进程。
2.事实上无论是PORT模式还是PASV模式,创建套接字还是后面对套接字的监听这些操作涉及到于内核的相关操作放在服务进程都是不安全。其实最近看到一个文章,文中指出以root启动在验证后转到用户进程也会不安全的。
(2)为什么使用多进程而不是多线程?
原因是在多线程或IO复用的情况下,当前目录是共享的,无法根据每一个连接来拥有自己的当前目录,也就是说当前用户目录的切换会影响到其他的用户。
(3)ftp服务器的架构
<!-- more -->
进程间通信的协议制定
首先采用Unix域的内部通信协议需要创建一个Unix的套接字进行通信
void priv_sock_init(session_t *sess) { int sockfds[2]; if (socketpair(PF_UNIX, SOCK_STREAM, 0, sockfds) < 0) ERR_EXIT("socketpair"); sess->parent_fd = sockfds[0]; sess->child_fd = sockfds[1]; } void priv_sock_set_parent_context(session_t *sess) { if (sess->child_fd != -1) { close(sess->child_fd); sess->child_fd = -1; } } void priv_sock_set_child_context(session_t *sess) { if (sess->parent_fd != -1) { close(sess->parent_fd); sess->parent_fd = -1; } }
sess作为两个进程共有的用户信息,在两个进程创建初期sess内部便被写入了Unix的套接字通信
void begin_session(session_t *sess) { activate_oobinline(sess->ctrl_fd); priv_sock_init(sess); //写入套接字