请求到达Web服务器,响应返回浏览器
思维导图
问题
服务器向客户端返回的响应消息不一定和客户端向服务器发送的请求消息通过相同的路由传输
客户端计算机也可以当作服务器来使用
一台服务器可以同时用作Web服务器和邮件服务器
看点
- 服务器概览
- 服务器的接收操作
- Web服务器程序器解释请求消息并作出响应
- 浏览器接收响应消息并显示内容
服务器概览
其硬件和操作系统不同
应用程序调用的Socket库的程序组件不同
服务器的程序可以同时和多台客户端计算机进行通信
服务器操作系统具有多任务、多线程功能,可以同时运行多个程序
每一个客户端连接进来,就启动一个新的服务器程序
模块:等待连接模块 通信模块
区别(数据收发的角度):发起连接的一方是客户端,等待连接的一方是服务器
客户端数据收发需要经过的4个阶段
(1)创建套接字(创建套接字阶段)
(2)用管道连接服务器端的套接字(连接阶段)
(3)收发数据(收发阶段)
(4)断开管道删除套接字(断开阶段)
服务器是将阶段(2)改成了等待连接
(1)创建套接字(创建套接字阶段)
(2-1)将套接字设置为等待连接状态(等待连接阶段)
(2-2)接受连接(接受连接阶段)
(3)收发数据(收发阶段)
(4)断开管道并删除套接字(断开阶段)
服务器创建过程:
协议栈调用socket创建套接字
调用bind将端口号写入套接字中
协议栈会调用listen向套接字写入等待连接状态控制信息
协议栈会调用accept来接受连接
一旦客户端的包到达,就会返回响应包并开始接受连接操作
协议栈会给等待连接的套接字复制一个副本,然后将连接对象等控制信息写入新的套接字中
当accept结束之后,等待连接的过程也就结束了,这时候等待连接模块会启动客户端通信模块
套接字的识别:
客户端IP地址
客户端端口号
服务器IP地址
服务器端口号
使用描述符来指代套接字的原因(应用程序和协议栈之间是使用描述符来指代套接字的)
(1)等待连接的套接字中没有客户端IP地址和端口号
(2)使用描述符这一种信息比较简单
服务器的接收操作
接收操作:
网卡接收到信号,将其还原成数字信息
(报头部分提取出时钟信号,并在每个时钟周期位置检测信号的变化方向)
需要根据包末尾的帧校验序列(FCS)来校验错误
检查MAC头部中的接收方MAC
网卡需要通过中断将网络包到达的事件通知给CPU
(网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈)
检查IP头部格式,检查接收方IP地址
检查包有没有被分片
检查IP头部的协议号字段,并将包转发给相应的模块(TCP模块 UDP模块)
TCP头部中的控制位SYN为1时(发起连接的包),检查包的接收端口号并进行与进行等待连接的套接字进行对比
为套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等参数写入套接字中,同时分配用于
发送缓冲区和接收缓冲区的内存空间。
然后生成代表接收确认的ACK号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口号大小,并用
这些信息生成TCP头部,委托IP模块发送给客户端
客户端会返回表示接收确认的ACK端口号,当这个ACK号返回服务器后,连接操作就完成了
服务器端的程序进入调用accept的暂停状态,当将新套接字的描述符转交给服务器程序之后,服务器程序就会恢复运行
根据四种信息匹配套接字
TCP模块会对比该套接字中保存的数据收发状态和收到的包的TCP头部中的信息是否匹配
从包中提取数据,存放到接收到缓冲区中,与上次收到的数据快连接起来
TCP模块会生成确认应答TCP头部,并根据接收包的序号和数据长度计算出ACK号,然后委托IP模块发送给客户端
应用程序会调用Socket库的read来获取收到的数据
控制流程会转移到服务器程序,对收到的数据进行处理(检查HTTP请求消息的内容),并根据请求的内容向浏览器返回相应的
数据
HTTP1.0中,服务器先发起断开操作
服务器程序会调用调用Socket库的close,TCP模块会生成一个控制位FIN为1的TCP,并委托IP模块发送给客户端
当客户端收到这个包后,会返回一个ACK号。
客户端调用close,生成一个FIN为1的TCP头部发给服务器,服务器再返回ACK,这时断开操作就完成了
Web服务器程序解释请求消息并作出响应
虚拟目录与实际目录进行转化
GET方法 输入的数据作为参数添加在URI后面发送给服务器
POST方法 将数据放在HTTP请求消息的消息体中发送给服务器
Web服务器的访问规则
(1)客户端IP地址
(2)客户端域名
(2)用户名和密码(Web服务器提供的密码认证功能 Web服务器运行的CGI认证程序来验证密码)
根据客户端域名设计规则
(使用DNS服务器,通过IP查域名)
Web服务器调用Socket库的write,将响应消息交给协议栈
浏览器接收响应消息并显示内容
网卡将信号还原成数字信息,协议栈将拆分的网络包组装起来并取出响应消息,然后将消息转交给浏览器
根据响应消息开头的Content-Type头部字段的值来进行判断 charset附加表示文本编码方式
Content-Encoding(压缩或编码技术转化方式)
实际的显示操作是由操作系统来完成的,浏览器负责对操作系统发出指令