佛山门户网站建设,深圳公共交易资源平台,用织梦做网站有后台吗,亚马逊网上商城是正品吗助记提要
服务器程序的结构套接字的指代方式MAC模块的接收过程IP模块的接收过程TCP模块处理连接包TCP模块处理数据包TCP模块的断开操作URI转换为实际文件路径URI调用程序Web服务器访问控制响应内容的类型
6章 请求到达服务器#xff0c;响应返回浏览器
1 服务器概览
在数据…助记提要
服务器程序的结构套接字的指代方式MAC模块的接收过程IP模块的接收过程TCP模块处理连接包TCP模块处理数据包TCP模块的断开操作URI转换为实际文件路径URI调用程序Web服务器访问控制响应内容的类型
6章 请求到达服务器响应返回浏览器
1 服务器概览
在数据收发层面不需要区分客户端和服务器。连接操作上需要区分发起连接的是客户端等待连接的是服务器。 服务器和客户端的网络相关的组件是相同的但用法不同。 服务器可以与多台客户端通信它的程序结构和客户端也不同。
1.1 服务器程序结构
服务器程序分为等待连接模块和与客户端通信的模块。程序启动并完成初始化后就运行等待连接模块创建套接字后进入等待连接的暂停状态。 客户端发起连接时该模块恢复运行并接受连接启动客户端通信模块并移交完成连接的套接字。 客户端通信模块使用已连接的套接字和客户端进行通信。通信结束后通信模块会退出。 每次有新的客户端发起连接都会启动一个新的客户端通信模块与客户端是一对一的关系。 1.2 服务器程序调用socket库的通信操作 #mermaid-svg-ZXG59VUhdQViGVam {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZXG59VUhdQViGVam .error-icon{fill:#552222;}#mermaid-svg-ZXG59VUhdQViGVam .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZXG59VUhdQViGVam .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ZXG59VUhdQViGVam .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZXG59VUhdQViGVam .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZXG59VUhdQViGVam .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZXG59VUhdQViGVam .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZXG59VUhdQViGVam .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZXG59VUhdQViGVam .marker.cross{stroke:#333333;}#mermaid-svg-ZXG59VUhdQViGVam svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZXG59VUhdQViGVam .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZXG59VUhdQViGVam .cluster-label text{fill:#333;}#mermaid-svg-ZXG59VUhdQViGVam .cluster-label span{color:#333;}#mermaid-svg-ZXG59VUhdQViGVam .label text,#mermaid-svg-ZXG59VUhdQViGVam span{fill:#333;color:#333;}#mermaid-svg-ZXG59VUhdQViGVam .node rect,#mermaid-svg-ZXG59VUhdQViGVam .node circle,#mermaid-svg-ZXG59VUhdQViGVam .node ellipse,#mermaid-svg-ZXG59VUhdQViGVam .node polygon,#mermaid-svg-ZXG59VUhdQViGVam .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZXG59VUhdQViGVam .node .label{text-align:center;}#mermaid-svg-ZXG59VUhdQViGVam .node.clickable{cursor:pointer;}#mermaid-svg-ZXG59VUhdQViGVam .arrowheadPath{fill:#333333;}#mermaid-svg-ZXG59VUhdQViGVam .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZXG59VUhdQViGVam .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZXG59VUhdQViGVam .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ZXG59VUhdQViGVam .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ZXG59VUhdQViGVam .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZXG59VUhdQViGVam .cluster text{fill:#333;}#mermaid-svg-ZXG59VUhdQViGVam .cluster span{color:#333;}#mermaid-svg-ZXG59VUhdQViGVam div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZXG59VUhdQViGVam :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端通信模块 等待连接模块 和客户端不同的地方 转移控制 断开 close() 发送数据 write(...) 接收数据 read(...) 创建套接字 socket(...) 接受连接 accept(...) 等待连接 listen(...) 绑定端口 bind(...) 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模块发给客户端。应用程序调用readTCP模块把接收缓冲区的数据转交给应用程序。
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: 主类型/子类型; charsetutf-8Content-Type定义的数据类型
主类型含义子类型text文本数据htmlHTML文档plain纯文本image图像数据jpegJPEG格式图片gifGIF格式图片audio音频数据mpegMP2、MP3格式的音频video视频数据mpegMPEG格式的视频quicktimeQuicktime格式的视频model对物体的形状和动作进行建模的数据vrmlVRML格式的建模数据application应用程序数据pdfPDF文档数据mswordMS-WORD格式的文档数据message直接存放邮件等消息时使用的类型rfc822一般的邮件数据包含From、Date等头部数据multipart消息体中包含多个部分的数据mixed消息体中包含不同格式的数据其中每部分数据都有单独定义的媒体类型 当数据类型为文本时需要用charset附加文本的编码信息。utf-8表示Unicodeeuc-jp表示EUC编码ISO-022-jp表示JIS编码shift_jis表示JIS编码。 如果消息的内容是通过压缩或编码技术转换过的还需要检查Content-Encoding字段得知如何将消息中的数据还原为原始数据。
4.2 浏览器在网页显示内容
HTML文档按照标签表示文档的布局和字体等样式信息。浏览器解释这些标签并按照指定的样式显示文档内容。 HTML文档中有表示图片和视频的标签。浏览器遇到这些标签时会向服务器请求其中的图片或视频数据。Web服务器返回数据后浏览器解压该数据然后委托操作系统显示。 Web服务器还会返回一些应用程序的数据浏览器会调用相应的程序或者是自身的插件。不同类型的数据和不同程序的对应关系在浏览器中已经设置好了。 显示操作实际上是操作系统完成的浏览器负责对系统发出指令。