当前位置:首页 > CN2资讯 > 正文内容

app服务器器架构 手机app服务器 原理

1天前CN2资讯



絮叨

       讲解CS通信之前,先大致了解一下我们平时手机通话的流程。语音信号经过脉冲采样变成数字信号,通过手机GSM模块发送无线信号至基站进入无线接入网,根据对方手机号查询数据库后通过骨干路由器转入核心网,一连串中转之后发送到对端所属的小区,找一条空闲线路接通对方。

       网络通信类似,但是也有不同,电话信号只能维持一条连接,而一个服务端可以维持多条连接,像双十一淘宝OceanBase就达到了一千万QPS的并发量。

这里实名给手淘打个招聘广告

基础知识

了解APP通信首先要了解socket的含义。Socket是一种进程通信方式,可用于多主机之间的通信,IP地址(对应主机)和端口(对应进程)就确定了一个socket,类似于电话的插座。下面我们来实现一个基础网络示例:客户端从标准输入读取文本,发送给服务器;服务器接收后原文返回给客户端,客户端输出到标准输出。

注:标准输入STDIN位于 /dev/stdin ,一般为键盘输入,fd为0;标准输出STDOUT位于/dev/stdout,一般为终端显示器,fd为1;标准错误 STDERR位于/dev/stderr,fd为2。

       TCP客户/服务端程序基本流程如下:

服务端处理流程

服务端程序如下:

#include<sys/socket.h> /* basic socket definitions */ int main(int argc, char **argv) { int listenfd,connfd; pid_t childpid; socklen_t clilen; struct sockaddr_incliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM,0); //创建套接字,监听端口 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr =htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); Bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); //绑定本机地址 Listen(listenfd, LISTENQ); //监听 for ( ; ; ) { clilen = sizeof(cliaddr); connfd = Accept(listenfd, (structsockaddr *) &cliaddr, &clilen); //阻塞等待客户端SYN报文 if ( (childpid = Fork()) == 0) { /* fork一个子进程专门处理接入的客户端 */ Close(listenfd); /* 子进程关闭监听端口 */ str_echo(connfd); /* 子进程发送请求 */ exit(0); } Close(connfd); /* 父进程关闭连接端口 */ } }

下面分析一下服务端状态机流程:

服务端创建一个监听套接字并绑定本机知名端口(如80、8080http端口),本机地址设置为INADDR_ANY是为了任何本地接口的连接都接收,一般为多网卡的场景。之后服务端阻塞在accpt调用,使用fork为每个客户端专门分配一个子进程,父进程继续监听接入的客户端。

对于已连接的客户端,使用str_echo读入客户端发送过来的数据,并直接返回回去。

void str_echo(intsockfd) { ssize_t n; char buf[MAXLINE]; again: while ( (n = read(sockfd, buf, MAXLINE))> 0) //从标准输入读取数据 Writen(sockfd, buf, n); //发送至服务端 // while循环退出说明接收到FIN包,客户端完成了数据发送 if (n < 0 && errno == EINTR) goto again; //被信号打断,继续读取 else if (n < 0) err_sys("str_echo: readerror"); //遇到其他错误结束运行 }

客户端处理流程

下面给出客户端处理状态机(省略部分socket异常处理):

str_cli处理逻辑如下:

void str_cli(FILE* fp, int sockfd) { charsendline[MAXLINE],recvline[MAXLINE]; while (fgets(sendline, MAXLINE, fp) !=NULL) { //从fp读入数据 Writen(sockfd, sendline,strlen(sendline)); //发送给服务器 if (Readline(sockfd, recvline,MAXLINE) == 0) //接收服务器发送过来的数据 err_quit("str_cli:server terminated prematurely"); //如果为0,说明服务端已关闭连接 fputs(recvline, stdout); //将接收到的数据输出到终端 } //文件读取结束时fgets返回NULL,while退出 }

运行客户端/服务端程序

服务器启动后,在客户端连接之前,使用netstat -a检查主机监听套接字状态如下:

Proto Local Address Foreign Address State TCP *:9877 *:* LISTEN

来启动客户端并指定服务器地址127.0.0.1(本地环回地址),客户端在connect函数中完成TCP三次握手流程,之后服务端从accept中返回,一条数据通道建立。

服务端这边握手流程较为复杂,用简图表示如下:

连接建立后,客户端阻塞于fgets等待接收键盘输入,服务端进程从accept返回后调用fork创建一个子进程专门负责这条连接,父进程继续阻塞在accept上监听新客户端的到来。此时,三个进程都阻塞:客户端进程、服务器父进程、服务器子进程。

注1:一个程序不等于一个进程,像淘宝,除了主进程进行各种数据处理外,还有push进程作为维持客户端和服务器的长连接通信,用于发送心跳包和推送消息。

注2:建立连接时,客户端阻塞在connect上,收到服务器的SYN/ACK报文即返回,而服务器需要收到ACK报文才返回,两边阻塞时间差了半个RTT。

使用netstat -a观察现在连接情况:

Proto Local Address Foreign Address State TCP localhost:9877 localhost:47512 ESTABLISHED //服务器 TCP localhost:47512 localhost:9877 ESTABLISHED //客户端 TCP *:9877 *:* LISTEN //服务器父进程

这里除了通过TCP四次挥手正常终止连接,还可以发送信号kill -9 pid终止进程。信号的处理后续剖析~

上述程序对服务器主机崩溃、主机重启、主机关机及客户端主机崩溃等异常情况都做了保护,这也是我们平时写需要注意程序健壮性的地方。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21091.html

    分享给朋友:

    “app服务器器架构 手机app服务器 原理” 的相关文章

    探索4837线路:高速度、稳定性与价格优势的网络选择

    在当今网络时代,选择合适的线路对于提高上网体验至关重要。4837线路就是其中一个备受关注的选项。它主要指在回国或出国前,通过一个名为4837的节点进行连接,进行跨国网络传输。这个线路归类为联通线路,其特点在于相对负载较低,使得整体表现更胜一筹。经过近年来的广泛应用,4837线路逐渐成为热门选择。 我...

    AT&T VPS详解:稳定性与灵活性的完美选择

    在这篇文章中,我想和大家聊聊AT&T VPS,尤其是在更广泛的虚拟私有服务器市场中,AT&T VPS代表了什么。AT&T是一家美国知名的电信运营商,其提供的VPS服务在一定程度上依赖于它的网络基础设施。这种结合了高质量网络与虚拟服务器技术的服务,吸引了大量需要高稳定性和可扩展...

    GPU租用服务:灵活、高效、经济的计算解决方案

    在今天的科技世界里,GPU租用服务正逐渐成为一种流行的趋势。这种服务允许用户通过云计算平台租用高性能的图形处理单元(GPU),从而完成需要大量计算的任务,比如深度学习、3D渲染或者其他复杂的数据处理。对于很多个人用户或小企业而言,直接购买这些昂贵的硬件并不现实,租用的方式显得更加灵活和经济。 借助G...

    在Ubuntu上使用宝塔面板进行服务器管理的全方位指南

    宝塔面板简介 作为一款在服务器管理领域取得广泛认可的工具,宝塔面板在Linux系统中尤为突出,特别是针对Ubuntu用户而言。通过提供直观的操作界面,宝塔有效地简化了复杂的Linux服务器管理过程。对于我这样的用户来说,宝塔无疑是一个不可多得的助手,轻松应对日常维护和配置工作。 宝塔面板不仅仅是一款...

    爱快助力安装Win10:全步骤指南和常见问题解决方案

    爱快概述 当我第一次接触爱快的时候,它给我带来了不少惊喜。爱快,一个专注于网络设备管理与配置的工具,让我对网络的掌控能力提升了很多。我发现,爱快不仅让我的路由器管理变得简单,还可以实现对网络的深度调试与分析。对于那些想要轻松管理网络的人来说,爱快无疑是一个不错的选择。 爱快的主要功能和特点让我印象深...

    全面掌握BBR加速技术,提升网络传输效率的终极指南

    在现代网络传输中,带宽的利用与数据传输的速度变得尤为重要。提到这里,BBR加速即以其独特的方式引起了不少人的关注。BBR,或者称为Bottleneck Bandwidth and Round-trip propagation time,是一种新的TCP拥塞控制算法,旨在优化网络性能。BBR的核心思想...