note-网络是怎样连接的6 请求到达服务器,响应返回浏览器

助记提要
  1. 服务器程序的结构
  2. 套接字的指代方式
  3. MAC模块的接收过程
  4. IP模块的接收过程
  5. TCP模块处理连接包
  6. TCP模块处理数据包
  7. TCP模块的断开操作
  8. URI转换为实际文件路径
  9. URI调用程序
  10. Web服务器访问控制
  11. 响应内容的类型

6章 请求到达服务器,响应返回浏览器

1 服务器概览

在数据收发层面,不需要区分客户端和服务器。连接操作上需要区分:发起连接的是客户端,等待连接的是服务器。
服务器和客户端的网络相关的组件是相同的,但用法不同。
服务器可以与多台客户端通信,它的程序结构和客户端也不同。

1.1 服务器程序结构

服务器程序分为等待连接模块和与客户端通信的模块。程序启动并完成初始化后,就运行等待连接模块,创建套接字后进入等待连接的暂停状态。
客户端发起连接时,该模块恢复运行,并接受连接,启动客户端通信模块,并移交完成连接的套接字。
客户端通信模块使用已连接的套接字和客户端进行通信。通信结束后,通信模块会退出。

每次有新的客户端发起连接,都会启动一个新的客户端通信模块,与客户端是一对一的关系。

1.2 服务器程序调用socket库的通信操作
客户端通信模块
等待连接模块
和客户端不同的地方
转移控制
断开 close()
发送数据 write(...)
接收数据 read(...)
创建套接字 socket(...)
接受连接 accept(...)
等待连接 listen(...)
绑定端口 bind(...)

accept接受到客户端的包时,协议栈会给等待连接的套接字复制一个副本,并把连接对象等控制信息写到新的套接字中。这时等待连接模块会启动客户端通信模块,并将套接字副本会转交给客户端通信模块。

1.3 多个套接字副本的端口号

复制出套接字副本后,原先的套接字仍然处于等待连接状态。新的客户端的包到达时,它又会执行接受连接操作,再次复制一个套接字副本。

  • 套接字的指代方式
    新创建的套接字副本和原来等待连接的套接字具有一样的的端口号,以让客户端判断收到的包是正确的程序发来的,比如http的连接套接字都使用80端口号。但是当客户端的包到达时,服务器仅凭接收方端口号无法判断该把包交给哪一个套接字。
    服务器的套接字可能有相同的端口号,但是客户端的套接字都是对应不同的端口号的。因此能通过客户端的端口号确定服务器上的某个套接字。
    在有多个客户端时,不同客户端的端口号可能是重复的,所以必须再加上客户端的IP地址才能判断。

IP头部和TCP头部包含了4项信息:接收方IP、接收方端口号、发送方IP、发送方端口号。通过这4项信息就能确定某个套接字。

  • 描述符指代套接字
    描述符也用来指代套接字。因为在等待连接的时候,没有客户端IP和端口号。而且描述符仅使用一种信息,表示起来比4种信息简单。

2 服务器的接收操作

2.1 网卡把信号还原为数字信息
  1. 从报头读取识别时钟信号,按相同的周期延长时钟信号;
  2. 在每个时钟周期位置检测信号的变化方向,根据信号变化方向还原出0和1;
  3. 根据校验公式计算数字信息,与包尾的帧校验序列比较;如果不一致,说明数据错误,包会被丢弃(TCP检测到丢包后会自动处理)。
  4. 校验成功后,就检查MAC头部的接收方MAC地址,确认这个包是发给自己的。
  5. 都确认无误后,把数字信息保存在网卡的缓冲区中。
  6. 网卡通过中断,告知CPU有网络包到达;
  7. CPU切换到网卡驱动程序,从网卡缓冲区读取包,根据MAC头部的以太类型字段判断协议种类,然后交给相应的协议栈。
2.2 IP模块接收步骤
  1. 检查IP头部格式是否符合规范;
  2. 查看接收方IP地址是不是自己;
  3. 检查包有没有被分片,如果是分片的包,就把包暂存在内存中,等所有分片到达后组装为原始包。
  4. 检查IP头部的协议号字段,交给对应的模块。如协议号为06交给TCP模块,协议号为11交给UDP模块。
2.3 TCP模块的操作
TCP模块处理连接包

TCP模块发现TCP头部控制位的SYN为1时,说明是一个发起连接的包。

  1. TCP模块检查包的接收方端口号,看该端口上有没有正处于等待连接状态的套接字。如果没有等待连接的套接字,则像客户端返回错误通知。
  2. 如果存在等待连接的套接字,就为这个套接字复制一个新的副本,将发送方IP、端口、序号初始值、窗口大小等信息写入这个套接字,并分配用于发送缓冲区和接收缓冲区的内存空间。
  3. 生成代表确认的ACK号,和发送数据的序号初始值、接收缓冲区的窗口大小等信息生成TCP头部,委托IP模块发给客户端。
  4. 客户端收到后,返回表示确认的ACK号。ACK号到达服务器后,连接就完成了。
TCP模块处理数据包
  1. 根据包的IP头部的发送方IP、接收方IP,和TCP头部的接收方端口、发送方端口找到数据包对应的套接字。
  2. 根据套接字中保存的上一个序号和数据长度计算下一个序号,检查该序号和包的TCP头部中的序号是否一致。一致说明包未丢失,这时TCP模块从包中提取数据放到接收缓冲区,和之前的数据连接起来。
  3. 数据进入接收缓冲区后,TCP模块生成确认应答的TCP头部,根据接收包的序号和数据长度计算出ACK号,委托IP模块发给客户端。
  4. 应用程序调用read,TCP模块把接收缓冲区的数据转交给应用程序。
TCP模块的断开操作
  1. 服务器程序调用close时,TCP模块生成控制位FIN为1的TCP头部,委托IP模块发送给客户端;
  2. 客户端收到后,返回一个ACK号,确认收到;
  3. 客户端调用close,生成一个FIN为1的TCP头部发送给服务器;
  4. 服务器返回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服务器还会返回一些应用程序的数据,浏览器会调用相应的程序,或者是自身的插件。不同类型的数据和不同程序的对应关系在浏览器中已经设置好了。

显示操作实际上是操作系统完成的,浏览器负责对系统发出指令。

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

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

相关文章

昇思25天学习打卡营第03天 | 张量 Tensor

昇思25天学习打卡营第03天 | 张量 Tensor 文章目录 昇思25天学习打卡营第03天 | 张量 Tensor张量张量的创建张量的属性Tensor与NumPy转换稀疏张量CSRTensorCOOTensor 总结打卡 张量 张量(Tensor)是一种类似于数组和矩阵的特殊数据结构,是神经…

MATLAB|更改绘图窗口的大小和位置

MATLAB绘图 plot、plot3、cdfplot都适用 效果 如下图,运行程序后可以直接得到这两个绘图窗口。 右上角的Figure1是原始图片,右下角的Figure2是调整了位置和大小后的绘图窗口。 完整源代码 % 绘图大小和位置调整 % Evand©2024 % 2024-7-1/Ver1…

Transformer模型原理细节解析

基本原理: Transformer 的核心概念是 自注意力机制(Self-Attention Mechanism),它允许模型在处理每个输入时“关注”输入序列的不同部分。这种机制让模型能够理解每个单词或符号与其他单词或符号之间的关系,而不是逐个地线性处理输入。 Transformer 主要由两个部分组成:…

手把手教你搭建PyTorch环境:MindStudio中PyTorch模型开发实战

本次实验的视频链接如下:​https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次实验在MindStudio上进行,请先按照 教程 配置环境,安装MindStudio。 ​ MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多…

Boost 智能指针

scoped_ptr 不能被复制或赋值给其他 scoped_ptr 对象,不能与其他指针比较 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr {public:// 构造函数:初始化 scoped_ptr 并接管指针的所有权explicit scoped_ptr(T* ptr = nullptr) : ptr_(ptr) …

Flink CDC的使用

MySQL数据准备 create database if not exists test; use test; drop table if exists stu; create table stu (id int primary key auto_increment, name varchar(100), age int); insert into stu(name, age) values("张三",18); insert into stu(name, age) valu…

ESOP 系统助力电子设备公司的管理模式升级

在科技飞速发展的时代&#xff0c;电子设备行业竞争愈发激烈&#xff0c;企业要想在市场中立足并持续发展&#xff0c;不断升级管理模式成为关键。ESOP系统的引入&#xff0c;为电子设备公司带来了全新的机遇&#xff0c;有力地推动了管理模式的升级。 ESOP 系统首先为电子设备…

element el-table表格切换分页保留分页数据+限制多选数量

el-table表格并没有相关的方法来禁用表头里面的多选按钮 那么我们可以另辟蹊径&#xff0c;来实现相同的多选切换分页&#xff08;保留分页数据&#xff09; 限制多选数量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自带…

农村程序员陈随易2024年中总结

今天是 2024年7月1日&#xff0c;时间如白驹过隙&#xff0c;今年已去其一半。 总结一下今年上半年的情况&#xff0c;给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易&#xff0c;有些内容只在公众号发表。 先看看我的年初计划&#xff0c;这个在今年年初的时候&…

泛微E9开发 限制明细表列的值重复

限制明细表列的值重复 1、需求说明2、实现方法3、扩展知识点3.1 修改单个字段值&#xff08;不支持附件类型&#xff09;3.1.1 格式3.1.2 参数3.1.3 案例 3.2 获取明细行所有行标示3.2.1 格式3.2.2 参数说明 1、需求说明 限制明细表的“类型”字段&#xff0c;在同一个流程表单…

【全网首发】双字重叠语序验证码识别

【省流&#xff1a;打算直接测试效果的可以访问这个网址】 http://decaptcha.ai?project_namenetease_zh_overlap 【实现方案】 如图所示&#xff0c;我们能看到&#xff0c;比起以往的“单个字”语序点选&#xff0c;这个验证码的难点在于“重叠汉字“&#xff0c;我们知道…

【Python机器学习】模型评估与改进——简单的网格搜索

为了提升模型的泛化性能&#xff0c;我们可以通过调参来实现。 在尝试调参之前&#xff0c;重要的是理解参数的含义&#xff0c;找到一个模型的重要参数&#xff08;提供最佳泛化性能的参数&#xff09;的取值是一项棘手的任务&#xff0c;但对于几乎所有模型和数据集来说都是…

API-Window对象

学习目标&#xff1a; 掌握Window对象 学习内容&#xff1a; BOM&#xff08;浏览器对象模型&#xff09;定时器-延时函数JS执行机制location对象navigation对象history对象 BOM&#xff08;浏览器对象模型&#xff09;&#xff1a; BOM是浏览器对象模型。 window对象是一个全…

Windows 11的市场份额越来越大了,推荐你升级!

7月1日&#xff0c;系统之家发布最新数据&#xff0c;显示Windows 11操作系统的市场份额正在稳步上升。自2021年10月Windows 11发布以来&#xff0c;Windows 10一直占据着市场主导地位&#xff0c;当时其市场份额高达81.44%。然而&#xff0c;随着时间的推移&#xff0c;Window…

鸿蒙学习1:ArkTS基础入门

1 变量和常量 1.1 变量 常见的基础数据类型&#xff1a; string 字符串、number 数字、boolean布尔 判断。 变量&#xff1a;专门用来存储数据的容器。 语法&#xff1a;let 变量名: 数据类型 值。例如&#xff1a;let name: 张三;let price:number 12.4; let isSuccess …

【triton-inference-server】 官方python_backend 文档及例子

https://github.com/triton-inference-server/python_backend#building-from-source 一。 从源码构建python_backend root@ubuntu-server:/home/ubuntu/hzh# sudo apt-get install rapidjson-dev libarchive-dev zlib1g-dev Reading package lists... Done Building dependency…

vue3中的自定义指令

全局自定义指令 假设我们要创建一个全局指令v-highlight&#xff0c;用于高亮显示元素。这个指令将接受一个颜色参数&#xff0c;并有一个可选的修饰符bold来决定是否加粗文本。 首先&#xff0c;在创建Vue应用时定义这个指令&#xff1a;&#xff08;这里可以将指令抽离成单…

昂科烧录器支持BPS晶丰明源半导体的多相Buck控制器BPD93004E

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中BPS晶丰明源半导体的多相Buck控制器BPD93004E已经被昂科的通用烧录平台AP8000所支持。 BPD93004E是一款多相Buck控制器&#xff0c;支持原生1~4相&#xff0c;数字方式控制&am…

科普文:一文搞懂jvm原理(二)类加载器

概叙 科普文&#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 前面我们介绍了jvm&#xff0c;jvm主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff0c;Execution engine(执行引擎) 子系统&#xff1b;Runtime data area (运行时数据区域)组件&am…

Cambrian-1: A Fully Open, Vision-Centric Exploration of Multimodal LLMs

摘要 https://arxiv.org/pdf/2406.16860v1 我们介绍了Cambrian-1&#xff0c;这是一系列以视觉为中心的多模态大型语言模型&#xff08;MLLMs&#xff09;。尽管更强大的语言模型可以增强多模态能力&#xff0c;但视觉组件的设计选择往往没有得到充分的探索&#xff0c;并且与…