网络是如何连接的--第六章 请求到Web服务器响应返回浏览器

第六章 请求到Web服务器响应返回浏览器

本章概要

本章主要介绍了web服务器接收数据和返回响应的内容主要是四个方面:1)服务器是什么? 2)服务器如何进行接收操作? 3) 服务器里的解释程序是如何运行的? 4)返回到客户端是如何显示在浏览器里的

6.1 服务器的概览

Ⅰ 客户端与服务器的区别

一方面操作系统和硬件与客户端不相同,另一方面网络相关的部分比如网卡,协议栈,Socket库是相同的;在连接的时候,客户端是请求连接,服务器是等待连接。

Ⅱ 服务器程序的结构

正常情况下,服务端由两个模块组成,一个是等待连接的模块,一个是与客户端通讯的模块。

服务端系统在初始化后执行等待模块程序并且进入等待状态,当有客户端连接的时候,由等待状态变为运行状态并且生成一个新的客户端通信模块,让新连接的客户端能够一对一连接到服务端的套接字上。

Ⅲ 服务端的套接字与端口号

因为从数据的收发操作是无法区分是服务端还是客户端的,所以是通过连接时候等待连接与请求连接来区分的。

在连接的过程中:

服务端先创建套接字: 1) 创建套接字;2)将套接字设置位等待连接的状态;3)接受连接; 4) 收发阶段;5)断开管道并删除套接字

客户端请求连接的状态:1)创建套接字;2)使用管道向服务端发起请求连接;3) 收发数据;4) 断开管道并删除套接字

端口是用来识别套接字的,进行连接对象的判断:客户端IP/端口号 + 服务端IP/端口号

使用描述符的原因:在等待连接的时候不知道客户端的IP地址和端口号;使用描述符这个信息比较简单

6.2 服务器的接收操作

Ⅰ 网卡将收到的信号转换成数字信息

先将接收到的信号转化成数字信息并根据FCS来校验错误,接着检查MAC头部中接收方的MAC地址,最后将数据放在网卡的缓冲区内,向操作系统发起中断请求。

这里有两步:第一步,网卡中的MAC模块将网络包从信号还原成数字信息,校验数据包的完整性并放入缓存中;第二步,网卡驱动模块根据MAC头部来判断协议类型后交给对应的协议栈(TCP,UDP,IP等)

Ⅱ IP模块的接收操作

数据从网卡缓存中出来之后进入内存中,先先查IP头部格式是否规范,然后检查目的IP地址(在这里,如果服务端启用了包转发的规则对于不是自己的包可以进行转发;客户端对于不是自己的包直接丢弃),接下来确定是否有分片以便进行重组,最后根据协议交给对应的模块(TCP/UDP)

Ⅲ TCP 模块如何处理连接包

所谓连接包是客户端第一次向服务端发起请求的包。
此时SYN = 1,在服务端收到包后,先检查接收方的端口号。确定该端口号存在并且是等待连接模块的端口号。

如果存在,则为这个套接字复制一个副本,并将IP地址,端口号,窗口大小,序列号初始值等信息写入套接字中,分配存储空间。

最后打包生成ACK号,序列初始值,剩余窗口大小到TCP头部委托IP模块发送给客户端。

Ⅳ TCP模块如何处理数据包

首先看套接字,套接字唯一性: 发送方IP地址/端口号 + 接收方IP地址/端口号;

接着查看TCP的头部信息(套接字中保存着一个序号数和数据的长度计算下一个序列号,并检查与收到的TCP头部信息是否一致);

最后将数据放在缓冲区中还原成包之前的状态

当TCP模块完成操作的同时,应用程序会直接调用read来等待应答

Ⅴ 断开操作

HTTP1.0 是服务器先发起断开操作;HTTP1.1 是客户端调用Socket的close 先发起断开操作,设置TCP模块的FIN字段全位1;客户端收到之后,返回ACK号并调用close,服务端返回给客户端ACK号;几分钟后套接字就删除了。

6.3 web 服务器程序解释请求并做出响应

这里主要是偏软的所写的核心服务程序

Ⅰ 将请求的URL转换成实际的文件名

对于web服务器收到请求的HTTP消息进行处理:比如GET,URL是一个文件名,将文件读取返回给客户端就好了

此时对于客户端看到的目录对于服务端其实是一个虚拟的路径并非真实的目录

Ⅱ 运行 CGI 程序

当发起请求的时候,服务端会运行对应的CGI程序并把结果返回给客户端

过程: 浏览器访问web服务器时,通过GET/POST 的方法将请求消息体中添加数据;服务端收到消息后先看文件名是不是程序名;接着将消息体的数据作为输入,委托操作系统运行程序最后将处理的结果返回给web服务器(这个地方没懂)(比如直接嵌入到HTML返回给客户端)。

Ⅲ web服务器的访问控制

访问控制,确定是否允许访问,常见三种机制:1)检查客户端的IP地址;2)检查客户端的域名;3)检查用户名和密码

对于IP地址,设置规则就可以

对于客户端的域名,客户端向web服务器发起请求;web服务器根据源IP地址,向Web DNS服务器查询,Web DNS服务器来访问客户端的DNS服务器查询;然后依次返回给web服务器,服务器根据返回的域名响应客户端的HTTP请求。

对于用户名/密码 验证,返回请求认证的数据包,HTTP头部是 401 Authorization Required,最后根据数据库等返回响应请求。

Ⅳ 返回响应消息

在完成请求请求后会有响应消息发送给客户端;web服务器将会调用 write 将消息发送给协议栈并通过对应描述符告诉协议栈关于客户端的信息,最终打包/分包,添加头部信息通过路由发送到客户端。

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

Ⅰ 通过响应的数据类型判断内容

返回的数据最终是一个HTTP消息,一个二进制的字符串。所以先要判断是什么样的类型,比如文字,图像,音频,视频等。

一般常用的方式是查看消息头的 Content-Type 字段,常见的格式: text/html | image/png | image/jpeg | audio/mpeg | application/pdf | multipart/mixed

第二种方式是通过文件的扩展名来确定数据的类型

最后一战,浏览器显示网页的内容,访问完成

此时返回的HTTP请求消息已经到了浏览器中,有些内容是浏览器自身负责(比如解释HTML中的标签,以及如何渲染CSS等等),有些是其他的应用程序负责(比如幻灯片,文字处理等)。

显示完成之后,就等待着下一个操作了。此时从客户端的请求到返回服务端响应消息到客户端这个过程结束了。