【发布时间】:2018-06-10 08:12:36
【问题描述】:
背景
任何基于 TCP/IP 的客户端套接字程序 (C) 看起来像,
/* Socket creation */ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* Do nothing for dynamic address assignment to that client socket */ /* Identify the server, we use to send a request for connection */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); inet_pton(AF_INET, serv_ip, &servaddr.sin_addr); /* Connect request to listening socket of server */ ret_val = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); /* * Communication code ================== Here comes the code for application layer protocol using read() & write() call that follow FTP, HTTP, SMTP specific rules. * */任何基于 TCP/IP 的服务器套接字程序 (C) 看起来像,
/* Create listen socket */ listfd = socket(AF_INET, SOCK_STREAM, 0); /* Assign protocol family(AF_INET) & address to that socket */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8004); retval = bind(listfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); /* Enable the communication on that socket */ listen(listfd, 5); /* with a specific server model(iterative/threaded/multiprocess/..) accept client request */ connfd = accept(listfd, (struct sockaddr *) &cliaddr, &clilen); /* * Communication code ================== Here comes the code for application layer protocol using read() & write() call that follow FTP, HTTP, SMTP specific rules. * */
早期的主机到主机协议专注于人机通信 例如:电子邮件 1971、FTP 和可互操作的 Telnet:1973
人们对应用到应用协议感兴趣 - RFC 707 描述了完成网络过程调用的方式。
RPC 是 数据结构 通过libnsl.so.1 从客户端存根到服务器端存根的传输,在 ansi C 世界中(比如说)。数据结构
可以保存一个添加操作的消息(比如),如下图,
-------------
| proc: "add" |
-------------
| int: val(i) |
-------------
| int: val(j) |
-------------
远程add(i, j)操作的典型RPC流程,
客户端和服务器在数据表示上可能不同(大端和小端)。外部数据表示 (add_xdr.c) 是机器独立通信所需的数据抽象。
RPC 是独立于机器的通信吗?
在 RPC 世界中,client stub 和 server stub 之间的数据包处理代码的行为是否类似于 client socket 和 服务器套接字?不同之处在于通信代码携带一个数据结构,其中包含过程信息
add(i, j)
【问题讨论】:
-
RPC 是一个通用术语,它涵盖了从 Sun-RPC 开始的几件事,如果不是之前的话。一般来说,RPC 是一个远程 过程调用, 包括传输可能大量的原语或结构作为参数、调用本身以及原语或结构作为参数的返回返回值。不是你上面说的。而且我从未见过 RFC 707 的实际实现。