note-网络是怎样连接的6 请求到达服务器,响应返回浏览器
助记提要
- 服务器程序的结构
- 套接字的指代方式
- MAC模块的接收过程
- IP模块的接收过程
- TCP模块处理连接包
- TCP模块处理数据包
- TCP模块的断开操作
- URI转换为实际文件路径
- URI调用程序
- Web服务器访问控制
- 响应内容的类型
6章 请求到达服务器,响应返回浏览器
1 服务器概览
在数据收发层面,不需要区分客户端和服务器。连接操作上需要区分:发起连接的是客户端,等待连接的是服务器。
服务器和客户端的网络相关的组件是相同的,但用法不同。
服务器可以与多台客户端通信,它的程序结构和客户端也不同。
1.1 服务器程序结构
服务器程序分为等待连接模块和与客户端通信的模块。程序启动并完成初始化后,就运行等待连接模块,创建套接字后进入等待连接的暂停状态。
客户端发起连接时,该模块恢复运行,并接受连接,启动客户端通信模块,并移交完成连接的套接字。
客户端通信模块使用已连接的套接字和客户端进行通信。通信结束后,通信模块会退出。
每次有新的客户端发起连接,都会启动一个新的客户端通信模块,与客户端是一对一的关系。
1.2 服务器程序调用socket库的通信操作
accept接受到客户端的包时,协议栈会给等待连接的套接字复制一个副本,并把连接对象等控制信息写到新的套接字中。这时等待连接模块会启动客户端通信模块,并将套接字副本会转交给客户端通信模块。
1.3 多个套接字副本的端口号
复制出套接字副本后,原先的套接字仍然处于等待连接状态。新的客户端的包到达时,它又会执行接受连接操作,再次复制一个套接字副本。
- 套接字的指代方式
新创建的套接字副本和原来等待连接的套接字具有一样的的端口号,以让客户端判断收到的包是正确的程序发来的,比如http的连接套接字都使用80端口号。但是当客户端的包到达时,服务器仅凭接收方端口号无法判断该把包交给哪一个套接字。
服务器的套接字可能有相同的端口号,但是客户端的套接字都是对应不同的端口号的。因此能通过客户端的端口号确定服务器上的某个套接字。
在有多个客户端时,不同客户端的端口号可能是重复的,所以必须再加上客户端的IP地址才能判断。
IP头部和TCP头部包含了4项信息:接收方IP、接收方端口号、发送方IP、发送方端口号。通过这4项信息就能确定某个套接字。
- 描述符指代套接字
描述符也用来指代套接字。因为在等待连接的时候,没有客户端IP和端口号。而且描述符仅使用一种信息,表示起来比4种信息简单。
2 服务器的接收操作
2.1 网卡把信号还原为数字信息
- 从报头读取识别时钟信号,按相同的周期延长时钟信号;
- 在每个时钟周期位置检测信号的变化方向,根据信号变化方向还原出0和1;
- 根据校验公式计算数字信息,与包尾的帧校验序列比较;如果不一致,说明数据错误,包会被丢弃(TCP检测到丢包后会自动处理)。
- 校验成功后,就检查MAC头部的接收方MAC地址,确认这个包是发给自己的。
- 都确认无误后,把数字信息保存在网卡的缓冲区中。
- 网卡通过中断,告知CPU有网络包到达;
- CPU切换到网卡驱动程序,从网卡缓冲区读取包,根据MAC头部的以太类型字段判断协议种类,然后交给相应的协议栈。
2.2 IP模块接收步骤
- 检查IP头部格式是否符合规范;
- 查看接收方IP地址是不是自己;
- 检查包有没有被分片,如果是分片的包,就把包暂存在内存中,等所有分片到达后组装为原始包。
- 检查IP头部的协议号字段,交给对应的模块。如协议号为06交给TCP模块,协议号为11交给UDP模块。
2.3 TCP模块的操作
TCP模块处理连接包
TCP模块发现TCP头部控制位的SYN为1时,说明是一个发起连接的包。
- TCP模块检查包的接收方端口号,看该端口上有没有正处于等待连接状态的套接字。如果没有等待连接的套接字,则像客户端返回错误通知。
- 如果存在等待连接的套接字,就为这个套接字复制一个新的副本,将发送方IP、端口、序号初始值、窗口大小等信息写入这个套接字,并分配用于发送缓冲区和接收缓冲区的内存空间。
- 生成代表确认的ACK号,和发送数据的序号初始值、接收缓冲区的窗口大小等信息生成TCP头部,委托IP模块发给客户端。
- 客户端收到后,返回表示确认的ACK号。ACK号到达服务器后,连接就完成了。
TCP模块处理数据包
- 根据包的IP头部的发送方IP、接收方IP,和TCP头部的接收方端口、发送方端口找到数据包对应的套接字。
- 根据套接字中保存的上一个序号和数据长度计算下一个序号,检查该序号和包的TCP头部中的序号是否一致。一致说明包未丢失,这时TCP模块从包中提取数据放到接收缓冲区,和之前的数据连接起来。
- 数据进入接收缓冲区后,TCP模块生成确认应答的TCP头部,根据接收包的序号和数据长度计算出ACK号,委托IP模块发给客户端。
- 应用程序调用read,TCP模块把接收缓冲区的数据转交给应用程序。
TCP模块的断开操作
- 服务器程序调用close时,TCP模块生成控制位FIN为1的TCP头部,委托IP模块发送给客户端;
- 客户端收到后,返回一个ACK号,确认收到;
- 客户端调用close,生成一个FIN为1的TCP头部发送给服务器;
- 服务器返回ACK号,完成断开操作。对应的套接字一段时间后会被删除。
3 Web服务器程序解释请求消息并作出响应
3.1 URI转换为实际文件名
请求消息中包括请求方法和表示数据源的URI,服务器程序根据这些信息向客户端返回数据。
Web服务器公开的目录不是磁盘上的实际目录,而是虚拟目录。URI中写的就是在虚拟目录结构下的路径名。在读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将URI转换成实际的文件名,才能读取并返回数据。
URI中省略文件名时,服务器会读取预先设定好的默认文件名。
可以设置文件名改写规则,在URI中的路径符合改写规则时,将URI中的文件名改写为其他文件名进行访问。这在服务器的目录和文件发生变化并且需要用户通过原来的网址访问时很有用。
3.2 CGI程序
URI指定的文件内容不一定是HTML文档,也可能时一个程序。这时服务器会运行这个程序,然后将程序的输出返回给客户端。
浏览器将需要服务器程序处理的数据放在HTTP请求消息中发送给服务器。数据加在HTTP消息中的两种方法,一是通过GET方法,把输入的数据作为参数添加在URI后面;二是通过POST方法,把数据放在HTTP请求体中发送给服务器。
收到请求消息后,Web服务器检查URI指定的文件名是不是程序。如果是程序,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据交给该程序。
程序处理后,输出结果一般会嵌入HTML中。Web服务器将其作为响应消息返回给客户端。
3.3 Web服务器访问控制
访问控制可以根据预先设定的规则,允许或禁止访问。
收到请求时,服务器根据URI判断数据源,并检查数据源对应的访问控制规则,只有允许访问时才读取文件或运行程序。
根据IP地址控制
接受连接时就能知道客户端的IP地址,可以检查是否允许访问。
根据客户端域名控制
先根据IP地址向DNS服务器查询客户端域名,然后再用该域名查询一下IP地址,看结果是否和发送方IP一致。如果一致则检查对应的访问控制规则。
这种方式需要和DNS服务器做多次查询,会使Web服务器响应速度变慢。
有一种在DNS服务器上注册假域名的攻击方式,因此需要双重检查。
根据用户名和密码控制
收到需要用户名和密码的访问时,Web服务器会向客户端发送一条响应消息,告诉用户需要在请求消息中放入用户名和密码。
浏览器收到该消息,会弹出输入用户名和密码的窗口,用户输入用户名和密码后,浏览器把这些消息放入请求消息中重新发给服务器。
服务器检查收到的用户名和密码,与注册的信息一致时,才返回数据。
3.4 做出响应
Web服务器调用write,把响应消息交给协议栈,告诉协议栈这个消息对应的套接字。
协议栈会把数据拆分为多个包,加上头部发出去。
4 浏览器接收响应消息并显示内容
4.1 通过响应的数据类型判断内容
Web可以处理很多类型的数据,每种类型的显示方法都不同。
可以根据响应消息的头部字段Content-Type判断数据类型。
Content-Type: 主类型/子类型; charset=utf-8
Content-Type定义的数据类型:
| 主类型 | 含义 | 子类型 |
|---|---|---|
| text | 文本数据 | html,HTML文档; plain,纯文本; |
| image | 图像数据 | jpeg,JPEG格式图片; gif,GIF格式图片; |
| audio | 音频数据 | mpeg,MP2、MP3格式的音频; |
| video | 视频数据 | mpeg,MPEG格式的视频; quicktime,Quicktime格式的视频; |
| model | 对物体的形状和动作进行建模的数据 | vrml,VRML格式的建模数据; |
| application | 应用程序数据 | pdf,PDF文档数据; msword,MS-WORD格式的文档数据; |
| message | 直接存放邮件等消息时使用的类型 | rfc822,一般的邮件数据,包含From、Date等头部数据; |
| multipart | 消息体中包含多个部分的数据 | mixed,消息体中包含不同格式的数据,其中每部分数据都有单独定义的媒体类型; |
当数据类型为文本时,需要用charset附加文本的编码信息。utf-8表示Unicode,euc-jp表示EUC编码,ISO-022-jp表示JIS编码,shift_jis表示JIS编码。
如果消息的内容是通过压缩或编码技术转换过的,还需要检查Content-Encoding字段,得知如何将消息中的数据还原为原始数据。
4.2 浏览器在网页显示内容
HTML文档按照标签表示文档的布局和字体等样式信息。浏览器解释这些标签,并按照指定的样式显示文档内容。
HTML文档中有表示图片和视频的标签。浏览器遇到这些标签时,会向服务器请求其中的图片或视频数据。Web服务器返回数据后,浏览器解压该数据,然后委托操作系统显示。
Web服务器还会返回一些应用程序的数据,浏览器会调用相应的程序,或者是自身的插件。不同类型的数据和不同程序的对应关系在浏览器中已经设置好了。
显示操作实际上是操作系统完成的,浏览器负责对系统发出指令。
相关文章:
note-网络是怎样连接的6 请求到达服务器,响应返回浏览器
助记提要 服务器程序的结构套接字的指代方式MAC模块的接收过程IP模块的接收过程TCP模块处理连接包TCP模块处理数据包TCP模块的断开操作URI转换为实际文件路径URI调用程序Web服务器访问控制响应内容的类型 6章 请求到达服务器,响应返回浏览器 1 服务器概览 在数据…...
存储过程与函数:封装数据库逻辑的艺术(七)
引言 在上一章《事务处理》中,我们深入探讨了事务的ACID特性以及如何通过事务控制语句和隔离级别来确保数据的一致性和完整性。本章,我们将把焦点转向存储过程与函数,这是数据库系统中用于封装复杂业务逻辑和增强代码复用性的强大工具。通过…...
【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】卷积
卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发射器每个时刻 t t t产生一个信号 x t x_t xt,其信息的衰减率为 w k w_k wk,即在 k − 1 k-1 k−1个时间步长后,信息为原来的 w k w_k wk倍,时刻 …...
Trie字符串统计
Trie字符串统计 维护一个字符串集合,支持两种操作: I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。 共有 N个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。 输入格式…...
Kali Linux源
中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.…...
【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统
【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统 一 文档简介二 平台构建2.1 使用平台2.2 百度智能云2.2.1 物联网核心套件2.2.2 在线语音合成 2.3 playback语音数据准备与烧录2.4 开机语音准备与添加2.5 唤醒词识别词命令准备与添加 三 代码准备3.1 sln-local/2-iot 代码…...
国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决
国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…...
FastAPI教程I
本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…...
如何在 HTML 中实现响应式设计以适应不同设备的屏幕尺寸?
要在HTML中实现响应式设计以适应不同设备的屏幕尺寸,可以使用CSS媒体查询和流动布局。 以下是实现响应式设计的一些关键步骤: 使用CSS媒体查询:CSS媒体查询允许根据屏幕尺寸和设备特性应用不同的CSS样式。通过在CSS中使用media规则…...
【基础篇】第1章 Elasticsearch 引言
1.1 Elasticsearch简介 1.1.1 基本概念 Elasticsearch,一个开源的分布式搜索引擎,以其强大的搜索能力和实时数据分析能力,在大数据时代脱颖而出。它基于Apache Lucene库构建,旨在提供高效、可扩展且易于使用的全文检索解决方案。…...
在区块链技术广泛应用的情况下,C 语言如何在区块链的底层开发中发挥更有效的作用,提高性能和安全性?
C语言在区块链底层开发中发挥着重要的作用,可以提高性能和安全性。具体可以从以下几个方面进行优化: 性能优化:C语言是一种高效的编程语言,可以直接访问内存和硬件资源。在区块链底层开发中,使用C语言可以更好地利用底…...
量化投资 日周月报 2024-06-28
文章 深度学习在量化交易中的应用:在BigQuant量化交易平台的文章中,探讨了深度学习在量化交易中,特别是在因子挖掘方面的应用。文章提到,随着传统线性模型的潜力逐渐枯竭,非线性模型逐渐成为量化交易的主要探索方向。深度学习因其对非线性关系的拟合能力,在量化交易中展现…...
基于 Paimon 的袋鼠云实时湖仓入湖实战剖析
在当今数据驱动的时代,企业对数据的实施性能力提出了前所未有的高要求。为了应对这一挑战,构建高效、灵活且可扩展的实时湖仓成为数字化转型的关键。本文将深入探讨袋鼠云数栈如何通过三大核心实践——ChunJun 融合 Flink CDC、MySQL 一键入湖至 Paimon …...
IPython相关了解
一、什么是 IPython? 1.1 简单理解 IPython IPython 是一种增强的 Python 交互式解释器,它可以让你更方便地编写、调试和运行 Python 代码。你可以把它想象成一个比普通 Python 解释器更聪明、功能更丰富的工具,非常适合用来进行数据探索、…...
华为面试题及答案——机器学习(二)
21. 如何评价分类模型的优劣? (1)模型性能指标 准确率(Accuracy): 定义:正确分类的样本数与总样本数之比。适用:当各类样本的数量相对均衡时。精确率(Precision): 定义:预测为正类的样本中实际为正类的比例。适用:当关注假阳性错误的成本较高时(例如垃圾邮件检测…...
PlatformIO开发环境
PlatformIO是一个开源的生态系统,用于构建物联网应用,它支持多种微控制器(MCU)和硬件开发板,并且与各种IDE集成良好,如VSCode, Atom等,使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…...
In install.packages(“devtools“, verbose = TRUE) :
错误于curl::curl_download("https://r-lib.github.io/gert/libgit2-1.1.0.x86_64_legacy-linux.tar.gz", : Timeout was reached: [] Connection timed out after 10004 milliseconds 停止执行 Using PKG_CFLAGS Using PKG_LIBS-lgit2 ----------------------------…...
计算机网络 访问控制列表以及NAT
一、理论知识 1. 单臂路由 单臂路由是一种在路由器上配置多个子接口的方法,每个子接口代表不同的 VLAN,用于在一个物理接口上支持多 VLAN 通信。此方法使得不同 VLAN 之间可以通过路由器进行通信。 2. NAT (网络地址转换) NAT 是一种在私有网络和公共…...
使用Oracle IMP导入数据
使用Oracle IMP导入数据 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊一聊如何使用Oracle的IMP工具来导入数据。 一、什么是Oracle IMP Oracle…...
C++ 100 之 容器插入和删除
vector插入和删除操作 insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele. push_back(ele); //尾部插入元素ele pop_back();//删除最后一个元素 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 erase(c…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
IP选择注意事项
IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...
