栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

六. 请求到达Web服务器,响应返回浏览器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

六. 请求到达Web服务器,响应返回浏览器

六. 请求到达Web服务器,响应返回浏览器

1. 服务器概览

网络包到达服务器后,服务器会接受并处理,在这之前它会做一些准备;服务器程序结构如下图:

服务器操作系统具有多任务、多线程功能,可以同时运行多个程序,服务器程序的设计正是利用了这一功能。可以在客户端连接上之后在启动一个模块并移交套接字,也可以事先建立好模块,当客户端来连接时直接移交套接字(线程池);

2. 服务器的接收操作

介绍服务器的协议栈是如何接收数据的:首先看服务器怎么接收电信号并将其还原成数字形式的网络包,然后从里面提取出Http消息;
之后看协议栈是如何将接受的消息通过Socket库传递给Web服务器程序的;

1)网卡将接收到的电信号转换成数字信号

网卡接收到的是电信号或者光信号,她会先转成数字信号,然后根据校验公式计算出数字信息并与包末尾的FCS指进行对比,如果不一致就说明这个包可能收到噪声影响而失真并需要丢弃,然后对方会超市重传;(包末尾的FCS值是在发送方将数字信号转换成电信号之前计算得出的);

如果FCS值一致,就开始检查MAC头部的接收方MAC值,确认此包是不是发给自己的,不是就直接丢弃;是就将还原好的数字信息包存在网卡的缓存区中;这些都是网卡中的MAC模块完成的;

然后网卡通过中断操作将网络包到达的信息告诉CPU,CPU中断手上的工作并切换到网卡的任务上,然后,网卡驱动会开始运行,从网卡缓冲区中将接收到的包读取出来,根据MAC头部的字段判断协议的种类,并调用负责处理该协议的软件。这里,应该是表示IP协议,因此会调用TCP/IP协议栈,并将包转交给它。

2)IP模块的接收操作

当网络包转交到协议栈时,IP模块会先查看IP头部格式是否正确,然后看接收方IP,看是不是发给自己的,如果不是就会向路由器一样对包进行转发(只要开启此功能);

之后检查包是否被分片,如果分片了就将包暂存在内存中,等所有的分片包到达后在组合成原始包;接下来需要检查IP头部的协议号字段,并将包转交给相应的模块。例如,如果协议号为06(十六进制),则将包转交给TCP模块;如果是11(十六进制),则转交给UDP模块。

3)TCP模块处理网络包

网络包到达TCP模块后的操作根据包内容的不同会有所区别,先看看连接包的处理(当TCP头部标志位SYN == 1时就是连接包):
先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正在处于等待连接状态的套接字。如果指定端口号没有等待连接的套接字,则向客户端返回错误通知的包。

如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字中,同时分配用于发送缓冲区和接收缓冲区的内存空间。然后生成代表接收确认的ACK号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口大小,并用这些信息生成TCP头部,委托IP模块发送给客户端。

当连接完成之后就进入包的收发阶段,下来看看服务器是怎么处理数据包的:

  1. TCP模块会检查收到的包对应哪一个套接字。需要根据IP头部中的发送方IP地址和接收方IP地址,以及TCP头部中的接收方端口号和发送方端口号共4种信息,找到上述4种信息全部匹配的套接字。
  2. 根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的TCP头部中的序号是否一致。如果一致,就说明包正常到达了服务器,没有丢失。
  3. TCP模块从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。这样一来,数据就被还原成分包之前的状态了。
  4. TCP模块就会生成确认应答的TCP头部,并根据接收包的序号和数据长度计算出ACK号,然后委托IP模块发送给客户端。
  5. 应用程序调用Socket库的read函数来获取收到的数据,如果应用程序不来获取数据,则数据会被一直保存在缓冲区中,但一般来说,应用程序会在数据到达之前调用read等待数据到达,在这种情况下,TCP模块在完成接收操作的同时,就会执行将数据转交给应用程序的操作。
  6. 服务器程序对收到的数据进行处理,也就是检查HTTP请求消息并返回应答消息;
  7. 数据收发完成之后,TCP模块便开始执行断开操作:就是四次挥手的过程;

3. Web服务器程序解释请求消息并作出响应

1)将请求的URI转换为实际的文件名

Web服务器公开的目录其实并不是磁盘上的实际目录,而是虚拟目录,而URI中写的就是在这个虚拟目录结构下的路径名。因此,当读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将URI转换成实际的文件名后,才能读取文件并返回数据。

2)运行CGI程序

如果URI指定的文件内容为HTML文档或图片,那么只要直接将文件内容作为响应消息返回客户端就可以了。但URI指定的文件也有可能是一个程序(CGI程序)。

CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。具体过程如下:

  1. Web服务器检查URI指定的文件名,看这个文件是不是一个程序;
  2. 如果判断要访问的文件为程序文件,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序。如果方法为GET,则将URI后面的参数传递给程序;如果方法为POST,则将消息体中的数据传递给程序,如下图:
  3. 运行的程序收到数据后会进行一系列处理,并将输出的数据返回给Web服务器。这些输出的数据一般来说会嵌入到HTML文档中,因此Web服务器可以直接将其作为响应消息返回给客户端。

3)Web服务器的访问控制

在执行接收请求消息并返回响应之前,Web服务器还可以检查事先设置的一些规则,并根据规则允许或禁止访问,这就是访问限制;比如会员制的信息服务就需要这一功能,规则主要有三种:

  1. 客户端IP地址:accept时就已经知道,只需要检查此客户端是否允许访问就行;
  2. 客户端域名:根据客户端IP地址查询客户端域名,这需要使用DNS服务器。为了保险起见,还需要用这个域名查询一下IP地址,看看结果与发送方IP地址是否一致。这是因为有一种在DNS服务器上注册假域名的攻击方式,因此我们需要进行双重检查,如果两者一致则检查相应的访问控制规则,判断是否允许访问。整个过程比较耗时,因此Web服务器的响应速度也会变慢。
  3. 用户名密

    4. 浏览器接收响应消息并显示内容

Web服务器发送的响应消息会被分成多个包发送给客户端,然后客户端需要接收数据。首先,网卡将信号还原成数字信息,协议栈将拆分的网络包组装起来并取出响应消息,然后将消息转交给浏览器。

浏览器首先需要判断响应消息中的数据属于哪种类型。因为Web可以处理的数据包括文字、图像、声音、视频等多种类型,每种数据的显示方法都不同,因此必须先要知道返回了什么类型的数据,否则无法正确显示。原则上可以根据响应消息开头的Content-Type头部字段的值来进行判断。

接下来只要根据数据类型调用用于显示内容的程序,将数据显示出来就可以了。

到这里,浏览器的显示操作就完成了,可以等待用户的下一个动作了。当用户点击网页中的链接,或者在网址栏中输入新的网址时,访问Web服务器的操作就又开始了。

5.网络包的旅程

如图,计算机生成的网络包其内容是不变的,但在传输到Web服务器的过程中,其形态会发生变化。


6. 说明

本文为《网络是怎样连接的》读书笔记,如有错误,还请兄弟们指正,大家一起进步。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号