请求到达Web服务器,响应返回浏览器
学习笔记
6.1 服务器概览
首先要大体弄懂服务器是个啥
6.1.1客户端与服务器的区别
服务器启动之后,需要进行各种准备工作,弄懂包括这些准备工作在内的服务器整体结构是很重要的。
话说回来,到底啥区别呢?
- 硬件与操作系统可能有所不同的
- 客户端发起连接,而服务器等待连接,也就是调用Socket库的方式不一样吧
有何相同之处?
- 网卡、协议栈、Socket库等功能与客户端别无二致
- 因此,客户端也可以作为服务器使用
6.1.2 服务器程序的结构
- 服务器一般会有多个客户端连接,为了把握每个客户端的运行状态,一般采用一对一的形式。
- 服务器程序的结构分为两个模块,等待连接模块和与客户端通信的模块
- 看懂下面的图:
一对一
6.1.3 服务器端的套接字和端口号
我理解的流程:
- 协议栈调用Socket创建套接字;
- 调用bind写入端口号,端口号根据服务器的种类,根据规则确定,如Web服务器的端口号80;
- 调用listen来写入等待连接状态;
-
当包到达时,调用accept,复制套接字,将控制信息写入新的套接字中
服务器端的通信操作
复制套接字
分配接受到的包
注意事项:
- 为了让客户端正确识别程序,套接字副本的端口号必须和原套接字一致;
- 如果有多个客户端连接,可以用客户端的ip和端口号来区分不同的套接字;
为什么使用描述符呢?
我的想法:1.为了提高效率,套接字可能会复制多个副本,由于还未连接,没有客户端ip和端口号信息,而这些套接字的服务器端口号又是相同的,为了区分它们,就使用描述符;2.使用描述符这一种信息比较简单
6.2 服务器的接受操作
主要是对包的操作
网卡→IP模块→TCP/UDP模块
包
6.2.1 网卡将接受到的信号转换成数字信息
1.把光信号或者电信号还原成数字信息
不同格式的信号工作方式会有些许差异,10BASE-T工作方式如下
- 根据报头的变化频率同步时钟信号,再根据时钟信号把信号还原为数字信息;
- 校验包末尾的FCS和MAC头部中的MAC地址;
- 还原后的数字信息被保存在网卡的缓冲区中;
- 通过中断通知CPU,读取缓冲区的数据,根据MAC头部的以太类型字段判断协议种类,并调用相应软件;如字段值表示IP协议,就会调用TCP/IP协议栈
6.2.2 IP模块接受操作
协议栈的IP模块会检查IP头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转发给TCP或者UDP模块
6.2.3 TCP模块如何处理连接包
如何处理发起连接的包,即如何处理控制为SYN为1的包
TCP模块会(1)确认TCP头部的控制位SYN;(2)检查接收方端口号;(3)未响应的等待连接套接字复制一个新的副本;(4)记录发送方IP地址和端口号等信息。
注意:如果相应端口没有处于等待连接模块的套接字则会返回错误
6.2.4 TCP如何处理数据包
- 根据四种信息找到套接字
- 校验控制信息,如包的序号是否可以衔接,判断是否丢失
- 拼合包,保存在缓冲区
- 向客户端返回ACK
6.2.5 TCP模块的断开操作
在HTTP1.1 中 客户端先发起FIN, 服务器返回ACK,然后发送FIN,客户端返回ACK。一段时间后套接字被删除。
6.3 Web服务器程序解释请求消息并作出响应
6.3.1 将请求的URL转换为实际的文件名
Web服务器公开的目录不一定是磁盘上的真是目录,需要经过一定的转换
6.3.2 运行CGI程序
- URL不一定指向文件,还可能指向程序,如果是指向程序,则运行相应程序
- 如果方法为GET,则将URL后面的参数传递给程序;如果方法为POST,则将消息体中的数据传给程序
-
运行结果返回服务器
示例
流程
6.3.3 Web服务器的访问控制
不能让服务器中的数据不加限制的完全暴露
三种方式:客户端IP,客户端域名、用户名和密码
注意:第二种方式需要向DNS服务器发送IP地址反查域名,再根据域名再查询IP是否与之前IP一致,这是为了防止注册虚假域名攻击。
6.3.4 返回响应消息
调用Socket库中的write,将消息传给协议栈,同时给出描述符。协议栈根据描述符对应套接字内控制信息,进行发送操作。
6.4 浏览器接受响应并显示内容
先记住这些:
- 根据Content-Type判断数据类型
- 浏览器对操作系统发出指令在屏幕上显示信息
完。
网友评论