【网络是怎样连接的】| 【05】服务器响应返回浏览器

1、服务器概述

客户端与服务端的区别

服务器启动之后,需要进行各种准备工作,才能接收客户端的访问;
服务器可分为多种种类,硬件和操作系统和客户端不同;

服务器程序的结构

当服务器同时和多个client通信时,服务器必须把握每一个客户端的操作状态;
	【常见做法】:每有一个client进来,就启动一个新的服务端程序,确保服务器和客户端一对一的状态;

【服务器程序模块】:
	- 连接模块:当server启动并读取配置文件初始化吼就运行等待连接模块,该模块会创建套接字,后进入等待连接的暂停状态;
	- 负责与客户端通信的模块:当客户端发起连接时,该模块就会恢复运行并接受连接,然后启动该模块,并移交完成连接的套接字,
		该模块会使用已连接的套接字与客户端进行通信;

在这里插入图片描述

每当有新客户端发起连接,都会启动一个新的b,b与clent为一对一关系,这样能够降低程序编写难度,具多线程、多任务的功能;
该方法都需要启动新的程序,比较耗时;
【其他方法】:事先启动几个客户端通信模块,当clent发起连接时,从空闲的模块中挑选一个出来将套接字移交给它处理;

服务器端的套接字和端口号
在这里插入图片描述

首先,协议栈创建套接字,在调用bind将端口号写入套接字中,clent发起连接,需要指定服务器端的端口号;后协议栈会调用listen向套接字写入
等待连接状态,即套接字开始等待来自clent的连接网络包;
协议栈在调用accept接受连接,由于等待连接在服务器已启动,即响应连接,协议栈会给等待连接的套接字赋值一个副本,然后将连接对象等信息
写入新的套接字中;
accept结束后,等待连接的过程也结束,此时等待连接模块启动客户通信模块,将连接好的新套接字交给clent通信模块,有该模块负责执行与clent
的通信操作;

【复制新的套接字后,原来的处于等待的连接状态的套接字会如何】:
- 它还会以等待连接的状态继续存在,当再次调用accept,client连接包到达时,可以再次执行接受连接操作;

【若不创建副本,直接连接会如何】:
- 直接连接,会导致没有套接字在等待连接了;

【端口号】:用来识别套接字,新创建的套接字副本必须和原来的等待连接的套接字具有相同的端口号;

【一个端口对应多个套接字该如何判断包要交给哪个套接字】:
- 可以根据客户端IP地址、客户端端口号、服务器IP地址、服务器端口号来判断;

【使用描述符来指定套接字】:
- 等待连接的套接字(信息不全)中没有客户端IP地址和端口号;
- 使用描述符这一信息比较简单;

在这里插入图片描述

2、服务器的接收操作

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

到达服务器的网络包本质是电信号或光信号,接收第一步(网卡)将还原成数字信息;
网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区;
网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈;

IP模块的接收操作

协议栈的IP模块会坚持IP头部:
	- 判断是不是发给自己;
	- 判断网络包是否经过分片;
	- 将包转交给TCP模块或UDP模块;

TCP模块如何处理连接包

如果收到的时候发起连接的包,则TCP模块会:
- 确认TCP头部的控制位SYN;
- 检查接收方端口号;
- 为相应的等待连接套接字复制一个新的副本;
- 记录发送方IP地址和端口号等信息;

TCP模块如何处理数据包

扫描二维码关注公众号,回复: 14208328 查看本文章
当收到的数据进入接收缓冲区后,TCP模块会生成确认应答的TCP头部,并根据接受包的序号和数据长度计算出ACK号,在委托IP模块发送给客户端;
收到数据包时,TCP模块会:
- 根据收到包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;
- 将数据块拼合并保存在接收缓冲区;
- 向客户端返回ACK;

TCP模块的断开操作

断开后,套接字会经过一段时间后被删除;

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

将请求的URI转化为实际的文件名

若URI的路径和服务器上的文件路径一致,那么磁盘上的所有文件都可以访问,会比较危险;
故服务器公开的目录起始并不是磁盘上的实际目录,是虚拟目录;

Web服务器的访问控制

服务器访问控制规则:
- 客户端IP地址;
- 客户端域名;
- 用户名和密码;
该规则能够作为数据源的文件和目录进行设置;

猜你喜欢

转载自blog.csdn.net/weixin_45926547/article/details/124995184