【网络面试必问(9)】Web服务器处理Http请求消息及与客户端交互的原理

 接上一篇:【网络面试必问(8)】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器

 这一篇,我们看一下请求消息的终点,Web服务器的程序结构。我们都知道,服务器会同时接收多个客户端的请求,做出响应并返回程序结果。但是仅一个服务器程序就处理多个客户端的请求是很难得,因此服务器会启用多个程序或者多个线程来实现这种一对多的关系。

1. 服务器程序的结构

 服务器的程序会分成两个模块,即等待连接模块和与客户端通讯模块,简称连接模块和通讯模块。服务器在启动之后,连接模块(a)会首先创建套接字,并且进入等待连接的状态,这时候,客户端就可以向客户端发起连接了。当连接模块监听到有客户端的连接请求进来之后,首先会把套接字和客户端的连接起来,然后就会把这个套接字移交给连接模块(b),当然这个连接模块可能之前没有新创建的,也可能是事先已经准备好的。同时,操作系统还会记录套接字和客户端的对应关系。
 接下来的通讯操作,实际上是通讯模块(b)和客户端在通讯,连接模块(a)会继续监听来自客户端的请求,如有新的请求过来,会继续执行上面的操作。所以通讯(b)模块会存在多个,并且和多个客户端交互。

在这里插入图片描述
 这里其实还有一个问题,上面我们提到了套接字,每当有新的连接进来,就会创建一个套接字,其实要说明的是这个套接字其实是连接模块套接字拷贝的副本,因为服务器应用程序启动之初就已经创建了监听的套接字,所有链接模块的套接字都是这个套接字的副本,并且记录和自己通讯的客户端控制信息。但是有一个问题是,前面我们说过,不同套接字应该对应不同的端口号,但是对于多个套接字副本端口号其实是一样的。这样一来,客户端比如要找80端口的应用,协议栈分析TCP头部中接收方端口号为80,应该找那个套接字副本呢?

 对应的解决办法其实就是,根据客户端的IP地址和端口号、服务器的IP地址和端口号这4个信息共同来确定一个套接字,这样即使服务器套接字端口号相同,也可以根据这四个信息确定唯一的套接字了。这些匹配信息其实会维护在操作系统协议栈中,只要请求过来,查表就可以了。

在这里插入图片描述
 当然,有这么多信息才能确定一个套接字,我们就需要用套接字描述符来代表这4类信息了,简单直接。而且最重要的,在程序启动之初,等待连接的套接字中,是没有客户端的IP地址和端口号的。

2. 服务器的接收操作

2.1 电信号转为数字信号

 服务器接收电信号的过程和客户端发送的过程相反,网卡会接收信号,然后将其还原成数字信息。接下来需要根据包末尾的帧校验序列(FCS)来校验错误,如果校验失败,需要丢弃此包。接下来,MAC模块会检查MAC模块中的MAC地址信息是不是发给自己的,不是的话也要丢弃。确认没问题后,就会把这些信息存放到网卡缓冲区中。

在这里插入图片描述
 接下来,网卡就会读取包的信息,并根据MAC头部的信息来判断协议类型,并将包交给它处理,这里假设是以太网的类型,表示IP协议,就会调用TCP/IP协议栈来执行。

2.2 IP模块的接收操作

 协议栈的IP模块会检查IP的头部,判断是不是发送给自己的,否则的话丢弃,另外还会检查是否分片等操作。最后再读取IP头部的协议号字段,确定是转交给TCP模块还是UDP模块。

2.3 TCP模块的处理操作

 TCP模块的执行操作,我们前面其实已经说到过,这里就简单概述一下,如果接收到的发起连接的包,会检查TCP头部的控制位SYN,检查接收方的端口号,创建套接字的副本,然后和将发送方的IP地址和端口号信息记录到套接字里面。

 如果是数据收发阶段,TCP模块会根据收到的包发送方IP地址和端口号,接收方的IP地址和端口号,找到对应的套接字,然后对比收到的包和之前报的发送状态是不是对应的上,如果能对应上就会把数据块拼接起来并且缓存起来,然后向客户端返回ACK包。

 如果是断开阶段,服务器程序会调用Socket的close()函数,TCP模块会生成FIN=1的头部,并且委托IP模块发送给客户端,之后进行四次挥手的操作执行断开连接的操作。当断开连接操作完成后,经过一段时间,套接字就会被删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/303420.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组织框架概念澄清及表设计

组织 企业组织 企业组织就是企业正式编制,以单独的编制,是个人在企业所在的长久的家,类似于所说的考编,在企业体制内的位置,可能一个人在组织有不同的岗位,也可能有不同的项目组,但是&#xf…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin,我们除了可以自己…

C++标准模板库(STL)

标准模板库(STL)是一组C模板类,提供常见的编程数据结构和函数,如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库,因此,它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

ROS-rosbag

文章目录 一、命令行二、编码 机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如: 机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两…

ubuntu 在线安装 python3 pip

ubuntu 在线安装 python3 pip 安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip

Bacnet—IP业务逻辑协议Yabe软件

Bacnet—IP业务逻辑协议 1、 网络属性配置和读取 Bacnet有专门配置IP参数的类,设备连接之前,需要配置端口号和ip地址,图示是用yabe的BACnet参数设置功能 2、 设备信息配置和读取 Bacnet 有个专门的类可以配置和读取出厂参数信息,软…

力扣日记12.27-【二叉树篇】235. 二叉搜索树的最近公共祖先

力扣日记:【二叉树篇】235. 二叉搜索树的最近公共祖先 日期:2023.12.27 参考:代码随想录、力扣 235. 二叉搜索树的最近公共祖先 题目描述 难度:中等 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近…

纹理映射示例Chap02.2

书章节2.2.4纹理映射 把上一节代码稍微修改&#xff0c;加载一个平面和图片&#xff0c;就可以实现简单纹理映射。 2.2_TextureExample.cpp如下 //VTK INIT With Opengl2 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteract…

C语言中函数调用和嵌套

函数是C语言的基本组成元素 函数调用 根据函数在程序中出现的位置有下列三种函数调用方式&#xff1a; 将函数作为表达式调用 将函数作为表达式调用时&#xff0c;函数的返回值参与表达式的运算&#xff0c;此时要求函数必须有返回值 int retmax(100,150); 将函数作为语句…

dpo笔记

参考:https://blog.csdn.net/chacha_/article/details/134527000 这个讲的很好. \(\pi_r\)是我们要的解,我们(4)两边取log得到. y1,y2是两个生成的句子,x是prompt.p是y1比y2好的优化函数.r是reward函数. 机器学习里面一个变量右上角写\(*\),就表示他的估计.也就是真实的计算.不…

基于 OV2640 的以太网 RGMII 图像传输系统设计

相关文章: (1)千兆以太网网络层 ARP 协议的原理与 FPGA 实现 (2)千兆以太网硬件设计及链路层 MAC 协议格式 (3)CRC校验原理及实现 (4)RGMII 与 GMII 转换电路设计 (5)千兆以太网网络层 IP 协议介绍与 IP 校 验和算法实现 (6)千兆以太网传输层 UDP 协议原理与 FPGA…

系列十七(面试)、请你谈谈RocketMQ的消息丢失问题

一、RocketMQ的消息丢失问题 1.1、概述 生产环境中为了保证服务的高可用&#xff0c;一般情况下都是采用集群的方式&#xff0c;RocketMQ也不例外&#xff0c;另外现在企业级的开发基本都是分布式微服务的模式&#xff0c;这就存在着跨网络传输数据的问题&#xff0c;而网络传…