《网络是怎样连接的》(六)

本文主要取材于  《网络是怎样连接的》 第六章。

目录

6.1 服务器概览

6.2 服务器的接收操作

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

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

简述:本文主要内容是解释 网络包到达服务器之后,如何给客户端响应的。

服务器与客户端的不同点 在于服务器是在启动之后创建套接字等待连接。当客户端发起连接时,等待模块会接受连接,然后启动与客户端的通信模块。服务器需要同时为多个客户端服务,对于每个客户端都要创建一个通信模块。

数据包到达服务器之后,需要经过FCS校验、MAC校验、IP校验然后交给TCP/UDP模块处理。

之后服务器会根据请求内容,生成响应消息再返回给客户端。客户端根据响应的数据类型展示数据内容。

6.1 服务器概览

服务器在启动之后就要准备各项工作,等待客户端的访问。在连接过程中,客户端发起连接操作,而服务器则是等待连接操作,因此在Socket库的用法上还是有一些区别的,即应用程序调用的Socket库的程序组件不同。

根据用途,服务器可以分为多种类型,其硬件和操作系统和客户端有所不同。但是与网络相关的部分,如网卡、协议栈、Socket库等功能和客户端一样。即无论硬件和OS如何变化,TCP和IP的功能都是一样的。

服务器需要同时和多个客户端通信,但一个程序来处理多个客户端的请求是很难的,因为服务器必须把握每一个客户端的操作状态。因此一般的做法是,每有一个客户端连接进来,就启动一个新的服务器程序,确保服务器程序和客户端是一对一的状态

我们将程序分成两个模块,即等待连接模块(图6.1(a))和负责与客户端通信的模块(图6.1(b)。

当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块(a)。这个模块会创建套接字,然后进入等待连接的暂停状态。

当客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块(b),并移交完成连接的套接字。接下来,客户端通信模块(b)就会使用已连接的套接字与客户端进行通信。

服务器的Socket调用流程。

(1)创建套接字(创建套接字阶段)

(2-1)将套接字设置为等待连接状态(等待连接阶段)

(2-2)接受连接(接受连接阶段)

(3)收发数据(收发阶段)

(4)断开管道并删除套接字(断开阶段)

6.2 服务器的接收操作

数字还原 :到达服务器的网络包其本质是电信号或者光信号,接收操作的第一步是网卡接收到信号,然后将其还原成数字信息。

FCS校验:接下来需要根据包末尾的帧校验序列(FCS)来校验错误,即根据校验公式[插图]计算刚刚接收到的数字信息,然后与包末尾的FCS值进行比较。

MAC校验:当FCS一致,即确认数据没有错误时,接下来需要检查MAC头部中的接收方MAC地址,看看这个包是不是发给自己的,如果不是则丢弃。还原后的数字信息被保存在网卡内部的缓冲区中。网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈。

IP校验:当网络包转交到协议栈时,IP模块会首先开始工作,检查IP头部。IP模块首先会检查IP头部的格式是否符合规范,然后检查接收方IP地址,看包是不是发给自己的。确认包是发给自己的之后,接下来需要检查包有没有被分片。检查IP头部的内容就可以知道是否分片,如果是分片的包,则将包暂时存放在内存中,等所有分片全部到达之后将分片组装起来还原成原始包;如果没有分片,则直接保留接收时的样子,不需要进行重组。接下来需要检查IP头部的协议号字段,并将包转交给相应的TCP模块或者UDP模块。

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

在收发阶段,收到数据包时,TCP模块会(1)根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;(2)将数据块拼合起来并保存在接收缓冲区中;(3)向客户端返回ACK。

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

服务器程序会根据收到的请求消息中的内容进行相应的处理,并生成响应消息,再通过write返回给客户端。请求消息包括一个称为“方法”的命令,以及表示数据源的URI(文件路径名),服务器程序会根据这些内容向客户端返回数据,但对于不同的方法和URI,服务器内部的工作过程会有所不同。

如请求方法为GET,URI为一个HTML文件名。这种情况只要从文件中读出HTML文档,然后将其作为响应消息返回就可以。为了不暴露磁盘全部内容,Web服务器公开的目录其实并不是磁盘上的实际目录,而是如图6.9这样的虚拟目录,而URI中写的就是在这个虚拟目录结构下的路径名。因此,当读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将URI转换成实际的文件名后,才能读取文件并返回数据。

URI指定的文件内容不仅限于HTML文档,也有可能是一个程序。在这个情况下,服务器不会直接返回文件内容,而是会运行这个程序,然后将程序输出的数据返回给客户端。

Web服务器还可以检查事先设置的一些规则,并根据规则允许或禁止访问。Web服务器的访问控制规则主要有以下3种。(1)客户端IP地址(2)客户端域名(3)用户名和密码

Web服务器完成对消息的处理之后,调用Socket库的write,将响应消息交给协议栈。这时,需要告诉协议栈这个响应消息应该发给谁,但我们并不需要直接告知客户端的IP地址等信息,而是只需要给出表示通信使用的套接字的描述符就可以了。套接字中保存了所有的通信状态,其中也包括通信对象的信息。

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

Web服务器发送的响应消息会被分成多个包发送给客户端,然后客户端需要接收数据。首先,网卡将信号还原成数字信息,协议栈将拆分的网络包组装起来并取出响应消息,然后将消息转交给浏览器。这个过程和服务器的接收操作相同。

要显示内容需要先判断数据类型,如文字、图像、声音、视频等多种类型,每种数据的显示方法都不同。数据类型 原则上可以根据响应消息开头的Content-Type头部字段的值来进行判断。判断类型之后,只要根据数据类型调用用于显示内容的程序,将数据显示出来就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目-苍穹外卖-Day10-SpirngTask及WebSocket

文章目录 前言SpringTask介绍SpringTask_corn表达式Spring_Task入门案例 订单状态定时处理需求分析代码开发功能测试 前言 本章实现的业务功能 超时未支付订单自动取消,配送中订单商家忘点完成自动再固定时间检查且修改成完成状态 来单提醒功能 催单提醒功能 …

摆动输入连杆夹持机构

1、运动与受力分析 import sympy as sy import numpy as np import matplotlib.pyplot as plt a,a1,b,b1,c,c1,d2,d3,fi,F,L,e sy.symbols(a,a1,b,b1,c,c1,d2,d3,fi,F,L,e)A(-d2,0) D(0,d3) B(-d2a*cos(fi),a*sin(fi)) C(-c*cos(pu),d3c*sin(pu)) B(-d2a*cos(fipi),a*sin(fipi…

轻松敏捷开发流程之Scrum

Scrum是一种敏捷开发流程,它旨在使软件开发更加高效和灵活。Scrum将软件开发过程分为多个短期、可重复的阶段,称为“Sprint”。每个Sprint通常为两周,旨在完成一部分开发任务。 在Scrum中,有一个明确的角色分工: 产品…

浏览器跨域问题

文章目录 什么是跨域跨域的原理跨域出现的场景跨域的解决 什么是跨域 违背同源策略就是跨域。 同源策略: 网页的url 和 该网页请求的url 的协议、域名、端口必须保持一致。 协议、域名、端口必须保持一致. 同源策略存在的原因: 保护用户隐私和防范网络攻击(https://editor.csd…

用C语言实现牛顿摆控制台动画

题目 用C语言实现牛顿摆动画,模拟小球的运动,如图所示 拆解 通过控制台API定位输出小球运动的只是2边小球,中间小球不运动,只需要固定位置输出左边小球上升下降时,X、Y轴增量一致。右边小球上升下降时,X、…

IDEA中debug调试模拟时显示不全(不显示null)的解决

IDEA中debug调试模拟时显示不全(不显示null)的解决 1、在IDEA中找到File(文件)->Settings(设置) 2、依次找到以下内容进行设置(原版、汉化版): 打开Build, Executio…

分页功能实现

大家好 , 我是苏麟 , 今天聊一聊分页功能 . Page分页构造器是mybatisplus包中的一个分页类 . Page分页 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</ver…

SpringMVC之CRUD------增删改查

目录 前言 配置文件 pom.xml文件 web.xml文件 spring-context.xml spring-mvc.xml spring-MyBatis.xml jdbc.properties数据库配置文件 generatorConfig.xml log4j2日志文件 后台 PageBaen.java PageTag.java 切面类 biz层 定义一个接口 再写一个实现类 …

[Spring] @Configuration注解原理

文章目录 1.Configuration注解介绍1.1 容器注入ConfigurationClassPostProcessor后置处理器1.2 ConfigurationClassPostProcessor介绍 2.ConfigurationClassPostProcessor解析2.1 Parse12.2 Parse22.3 Parse32.4 Parse42.5 Parse5 3.ConfigurationClassParser解析4.Configurati…

形态图像处理

形态图像处理 预备知识 反射、平移结构元 腐蚀和膨胀 腐蚀 将 B 平移&#xff0c;当其原点位于 z 时&#xff0c;其包含在 A 中&#xff0c;则 z 为一个有效的位置&#xff0c;所有有效的z构成了腐蚀之后的结果腐蚀缩小或细化了二值图像中的物体可以将腐蚀看作形态学滤波操…

[docker]笔记-portainer的使用

1、安装完成后输入ip加端口号打开网页&#xff0c;并再相应位置输入初始密码&#xff0c;初始密码自行设置。 2、进入主页后可以看到如下图标&#xff1a; 3、选择docker环境&#xff0c;即可展示目前docker信息 可以看到目前有1个容器&#xff0c;3个卷和4个镜像&#xff0c…

2023高教杯数学建模1:ABC题目+初步想法

2023 ABC题目初步想法 写在最前面A题&#xff1a;定日镜场的优化设计问题1&#xff1a;建模将其抽象为数学公式问题2&#xff1a;固定部分参数&#xff0c;约束条件下的局部最优化问题可尝试方法 问题3&#xff1a;约束条件下的局部最优化问题附录&#xff1a;相关计算公式参考…