网络是怎么连接的
目录
URL
HTTP(超文本传输协议)
FTP(文件传输协议)
File
mailto
HTTP的方法
Socket
URL
- URL(Uniform Resource Locator)中文名为统一资源定位符,
- 它是互联网上用来标识某一资源的地址。
- 就像是现实生活中家庭住址一样,
- 通过这个地址可以准确地找到对应的资源,
- 比如一个网页、一张图片、一个文件等。
HTTP(超文本传输协议)
HTTP 是用于传输超媒体文档(例如 HTML)的应用层协议。
例如, “http://example.com”
FTP(文件传输协议)
FTP 主要用于在网络上进行文件的上传和下载。
File
“file” 协议主要用于访问本地计算机上的文件。
例如,“file:///C:/Users/Documents/report.html”</span>
mailto
“mailto” 是一种用于启动电子邮件客户端并创建新邮件的协议。
如 “mailto:someone@example.com”
HTTP的方法
GET: 访问Web服务器获取网页数据
POST:在表单中填写数据并发给服务器
PUT:替换服务器上的文件
DELETE:删除服务器上的文件
打开有一个图片和很多文字的网页.
浏览器向网页服务器请求数据,
服务器返回数据,
然后会在请求一次图片的数据,
浏览器再返回图片的数据
IP地址:
互联网协议地址,用于在网络环境中识别和定位这些设备
好像是现实生活中每栋房子都有一个独一无二的门牌号一样
Pv4 地址由 32 位二进制数组成
例如,“192.168.1.1”
IPv6由 128 位二进制数组成
例如,“2001:0db8:85a3:0000:0000:8a2e:0370:7334”
分类:
A类 例如,10.0.0.0 - 10.255.255.255 常用于大型企业内部网络
B类 例如,172.16.0.0 - 172.31.255.255 一些高校或者中型企业的园区网络可能会使用
C类 例如,192.168.1.0 - 192.168.1.255 家庭中的无线路由器通常会设备分配 C 类地址
D类 D 类地址的第一个字节范围是 224 - 239,它主要用于多播(组播)通信。
E类 E 类地址的第一个字节范围是 240 - 255,它是保留地址主要用于实验和研究目的。
DNS:
它就像是一个巨大的电话簿,
将人们容易记忆的域名(如baidu.com)
和计算机在网络中实际使用的 IP 地址(如 14.215.177.38)
相互映射起来。
DNS 是一个分层的分布式数据库系统。
它的最顶层是根域名服务器,
全球共有 13 组根域名服务器(用字母 A - M 表示)
当用户在浏览器中输入一个域名时,首先会向本地 DNS 服务器
(通常由互联网服务提供商提供)发送查询请求。
本地 DNS 服务器会先查看自己的缓存,
如果缓存中有该域名对应的 IP 地址,
就直接返回给浏览器。如果缓存中没有,
本地 DNS 服务器会向根域名服务器发送请求
,根域名服务器会告诉它应该去询问哪个顶级域名服务器。
然后本地 DNS 服务器向顶级域名服务器发送请求,
顶级域名服务器再引导它向二级域名服务器等更低级别的域名服务器询问,
直到找到该域名对应的 IP 地址,
并将其返回给浏览器。
-
用户输入网址
-
域名解析
- 查询浏览器缓存
- 向本地 DNS 服务器查询:
- DNS 服务器查询过程:
- 本地 DNS 缓存查询:如果缓存中有该域名对应的 IP 地址,就直接将结果返回给浏览器。
- 递归查询(如果缓存没有):引导本地 DNS 服务器向更下一级的域名服务器查询,直到找到域名对应的 IP 地址。
- 返回 IP 地址给浏览器:最后,本地 DNS 服务器将查询到的 IP 地址返回给浏览器。
建立连接
-
- 确定通信协议:浏览器根据网址中的协议部分(如 http 或 https)来确定要使用的通信协议。还需要进行 SSL/TLS 加密协议的握手过程。
- TCP 三次握手(以 HTTP 为例):
- 第一次握手:浏览器向服务器发送一个 SYN(同步)数据包,其中包含一个随机生成的序列号。这个序列号用于后续的数据传输顺序和确认。
- 第二次握手:服务器收到 SYN 数据包后,会返回一个 SYN - ACK(同步 - 确认)数据包。这个数据包中包含服务器自己生成的序列号,同时确认浏览器发送的序列号。
- 第三次握手:浏览器收到 SYN - ACK 数据包后,会发送一个 ACK(确认)数据包,确认服务器发送的序列号。通过这三次握手,浏览器和服务器之间建立了一个可靠的 TCP 连接,可以进行数据传输。
发送 HTTP 请求
-
- 构建请求报文:浏览器根据用户输入的网址和要获取的资源类型(如网页、图片、脚本等)构建 HTTP 请求报文。 请求报文包括请求行(包含请求方法,如 GET 用于获取资源;请求的 URL 路径;HTTP 协议版本)、 请求头部(包含如 User - Agent,表示浏览器的类型和版本;Accept,表示浏览器可以接受的内容类型等信息) 和请求体(对于某些请求方法,如 POST,会包含要发送的数据)。
- 发送请求:浏览器通过已经建立的 TCP 连接将请求报文发送给服务器。
服务器处理请求并返回响应
-
- 服务器接收请求:服务器的网络接口接收浏览器发送的请求报文,并将其传递给服务器软件(如 Apache、Nginx 等)进行处理。
- 处理请求:服务器软件根据请求报文中的 URL 路径和请求方法来查找对应的资源。
- 构建响应报文:服务器将找到的资源(或动态生成的内容)构建成响应报文。 响应报文包括响应行(包含 HTTP 协议版本;响应状态码,如 200 表示成功,404 表示未找到资源等;响应状态短语)、 响应头部(包含如 Content - Type,表示响应内容的类型;Content - Length,表示响应内容的长度等信息) 和响应体(包含实际的资源内容)。
- 发送响应:服务器通过 TCP 连接将响应报文发送回浏览器。
浏览器接收并处理响应
-
- 接收响应:浏览器通过 TCP 连接接收服务器发送的响应报文。
- 解析响应:浏览器首先查看响应状态码,判断请求是否成功。如果状态码是 200,表示成功获取资源, 浏览器会根据响应头部中的 Content - Type 来确定如何处理响应体中的内容。例如,如果是 “text/html”, 浏览器会解析 HTML 内容;如果是 “image/jpeg”,会显示图片等。
- 渲染网页(如果是 HTML):
- 解析 HTML:浏览器开始解析 HTML 内容,构建 DOM(文档对象模型)树。它会识别 HTML 标签, 将标签转换为 DOM 节点,并确定它们之间的层次关系。
- 加载外部资源:浏览器在解析 HTML 时,会发现一些标签用于引用外部资源,如
<link>
标签用于 引用 CSS 样式表,<script>
标签用于引用 JavaScript 脚本,<img>
标签用于引用图片等。浏览器 会根据这些标签的属性(如 src 属性用于指定资源的位置)发送新的请求来获取这些外部资源。 - 渲染页面布局和样式:浏览器结合 DOM 树和获取到的 CSS 样式表来确定页面的布局和样式。它会计算 每个元素的位置、大小等属性,并将它们绘制到屏幕上。
- 执行 JavaScript:对于加载的 JavaScript 脚本,浏览器会执行它们。JavaScript 可以用于操作 DOM 树, 实现动态效果,如添加、删除或修改网页元素;也可以用于发送异步请求(如 AJAX 请求)来获取新的 数据并更新页面等。
Socket
- Socket(套接字)是一种在网络编程中用于实现进程间通信(IPC)的机制, 它提供了应用程序和网络协议栈之间的接口。可以把 Socket 想象成一个电话插孔, 不同的应用程序(就像不同的电话)通过这个插孔与网络(电话线网络)进行通信。 它使得应用程序能够在网络上发送和接收数据,无论是在本地网络还是互联网环境中。
建立 Socket 连接的过程(以 TCP 为例)
服务器端操作
- 创建 Socket 对象:服务器首先需要创建一个 Socket 对象。在编程语言中, 通常会调用相关的 Socket 库函数来完成这一操作。例如,在 Python 中, 可以使用
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
来创建一个 TCP Socket。 这里AF_INET
表示使用 IPv4 地址族,SOCK_STREAM
表示使用 TCP 协议。这个操作相当 于在服务器端准备了一个通信端点,等待客户端来连接。 - 绑定地址和端口:创建 Socket 后,服务器需要将这个 Socket 绑定到一个特定的 IP 地址和端口号上。 IP 地址用于在网络中定位服务器,端口号则用于区分不同的服务。例如,Web 服务器通常使用端口 80(HTTP) 或 443(HTTPS)。在 Python 中,可以使用
bind((host, port))
方法来实现绑定,其中host
是服务器的 IP 地址port
是端口号。这一步就好比给电话插孔分配一个唯一的电话号码,使得客户端能够找到这个服务器。 - 监听连接请求:绑定完成后,服务器开始监听来自客户端的连接请求。这通过调用
listen()
函数来实现, 它会将服务器的 Socket 设置为监听状态,等待客户端的连接。在这个阶段,服务器就像一个电话总机, 等待着来电(客户端连接请求)
客户端操作
-
- 创建 Socket 对象:客户端同样需要创建一个 Socket 对象,方式与服务器类似。 例如,在 Python 中也是使用
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
来创建一个 TCP Socket,用于与服务器进行通信。这相当于客户端准备好自己的电话, 以便拨打服务器的 “电话”。 - 发起连接请求:客户端创建 Socket 后,使用
connect((server_host, server_port))
方法向服务器发起连接请求。这里server_host
是服务器的 IP 地址,server_port
是服务器监听的端口号。这个过程就像客户端拨打服务器的 “电话号码”,尝试建立通信连接。
- 创建 Socket 对象:客户端同样需要创建一个 Socket 对象,方式与服务器类似。 例如,在 Python 中也是使用
三次握手过程(TCP 连接建立)
-
- 第一次握手:客户端向服务器发送一个 SYN(同步)数据包。这个数据包中包含一个随机生成的 初始序列号(Sequence Number),用于后续的数据传输顺序和确认。例如,假设客户端生成的序列号为
x
, 这个 SYN 数据包就像是客户端向服务器发出的 “我想和你建立连接,我的初始序列号是x
” 的信号。 - 第二次握手:服务器收到客户端的 SYN 数据包后,会向客户端返回一个 SYN - ACK(同步 - 确认)数据包。 这个数据包包含两个重要信息:一是服务器自己生成的初始序列号(假设为
y
),二是对客户端发送的序列号x
的确认(ACK = x + 1
)。这相当于服务器回复客户端 “我收到你的连接请求了,我的初始序列号是y
, 我确认收到你的序列号x
,现在我们可以开始通信了”。 - 第三次握手:客户端收到服务器的 SYN - ACK 数据包后,会发送一个 ACK(确认)数据包给服务器。 这个 ACK 数据包中的确认号是
y + 1
,用于确认收到服务器的序列号y
。通过这三次握手, 客户端和服务器之间就建立了一个可靠的 TCP 连接,就像双方通过电话建立了稳定的通话通道,可以开始进行数据传输了。
- 第一次握手:客户端向服务器发送一个 SYN(同步)数据包。这个数据包中包含一个随机生成的 初始序列号(Sequence Number),用于后续的数据传输顺序和确认。例如,假设客户端生成的序列号为
数据传输阶段
-
- 发送数据:连接建立后,无论是客户端还是服务器都可以通过已经建立的 Socket 发送数据。 在编程中,通常使用
send()
或write()
函数来发送数据。例如,在 Python 中,客户端 可以使用socket.send(data)
将数据data
发送给服务器。数据会被网络协议栈分割成 合适大小的数据包,并添加 TCP 头部(包括序列号、确认号等信息),然后通过网络发送给对方。 - 接收数据:对方(服务器或客户端)使用
recv()
或read()
函数来接收数据。例如,服务器可以 使用socket.recv(buffer_size)
来接收客户端发送的数据,其中buffer_size
表示接收缓冲区的大小。 当数据包到达接收端时,网络协议栈会根据 TCP 头部的信息进行排序、确认等操作,将数据组装成完整的消息并传递给应用程序。
- 发送数据:连接建立后,无论是客户端还是服务器都可以通过已经建立的 Socket 发送数据。 在编程中,通常使用
关闭 Socket 连接
-
- 主动关闭(以客户端为例):当数据传输完成后,客户端可以主动关闭 Socket 连接。 这通过调用
close()
函数来实现。在关闭之前,客户端会向服务器发送一个 FIN(结束)数据包, 告知服务器自己不再发送数据了。 - 四次挥手过程(TCP 连接关闭)
- 第一次挥手:客户端发送 FIN 数据包,表示自己没有数据要发送了,请求关闭连接。
- 第二次挥手:服务器收到 FIN 数据包后,会发送一个 ACK 数据包给客户端,确认收到客户端的关闭请求。 此时,服务器可能还有数据要发送给客户端,所以连接还不能完全关闭。
- 第三次挥手(如果服务器也没有数据要发送):当服务器发送完剩余的数据后,它会向客户端发送一个 FIN 数据包,表示自己也没有数据要发送了,请求关闭连接。
- 第四次挥手:客户端收到服务器的 FIN 数据包后,会发送一个 ACK 数据包给服务器,确认收到服务器的 关闭请求。经过这四次挥手,TCP 连接才完全关闭,双方释放占用的资源。
- 主动关闭(以客户端为例):当数据传输完成后,客户端可以主动关闭 Socket 连接。 这通过调用
相关文章:
网络是怎么连接的
目录 URL HTTP(超文本传输协议) FTP(文件传输协议) File mailto HTTP的方法 Socket URL URL(Uniform Resource Locator)中文名为统一资源定位符,它是互联网上用来标识某一资源的地址。就…...
Java 实现PDF添加水印
maven依赖: <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.3</version> </dependency>网络地址添加水印代码: public static boolean waterMarkNet(Stri…...

网络安全问题概述
1.1.计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁: (1) 截获——从网络上窃听他人的通信内容。 (2) 中断——有意中断他人在网络上的通信。 (3) 篡改——故意篡改网络上传送的报文。可应用于域名重定向,即钓鱼网站。 (4) 伪造——伪…...

(udp)网络编程套接字Linux(整理)
源IP地址和目的IP地址 唐僧例子1 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址.思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上,但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进…...
Web应用安全入门:架构搭建、漏洞分析与HTTP数据包处理
Web应用安全入门:架构搭建、漏洞分析与HTTP数据包处理 引言 在当今数字化时代,Web应用已成为企业和个人在线交互的核心。然而,随着技术的发展,Web应用面临的安全挑战也日益增加。本文旨在为初学者提供一个关于Web应用架构搭建、…...

[JAVA]MyBatis框架—获取SqlSession对象
SqlSessionFactory作为MyBatis框架的核心接口有三大特性 SqlSessionFactory是MyBatis的核心对象 用于初始化MyBatis,创建SqlSession对象 保证SqlSessionFactory在应用中全局唯一 1.SqlSessionFactory是MyBatis的核心对象 假设我们要查询数据库的用户信息&#x…...
Perl 简介
Perl 简介 Perl 是一种高级、通用、解释型、动态编程语言。由 Larry Wall 于 1987 年首次发布,它结合了 C、sed、awk 和 shell 脚本语言的特性。Perl 最初被设计用于文本处理,如报告生成和文件转换,但随着时间的推移,它已经发展成…...
spring-bean的销毁流程
1 引入 在 Spring 框架中,Bean 的生命周期管理是其核心功能之一,而 Bean 的注销(Destruction)是生命周期的最后一步。无论是关闭数据库连接、释放线程资源,还是执行缓存持久化操作,合适的销毁策略都至关重…...

问:Spring MVC DispatcherServlet流程步骤梳理
DispatcherServlet是Spring MVC框架中的核心组件,负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器(Front Controller)的实现,DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…...

用源码编译虚幻引擎,并打包到安卓平台
用源码编译虚幻引擎,并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目,简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定,然后加入 Epic 邀请的组织,…...

快速搭建Android开发环境:Docker部署docker-android并实现远程连接
目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…...
「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成
本篇将系统介绍Cangjie编程语言中程序的基本组成部分,涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则,帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...

【Linux网络编程】简单的UDP套接字
目录 一,socket编程的相关说明 1-1,sockaddr结构体 1-2,Socket API 二,基于Udp协议的简单通信 三,UDP套接字的应用 3-1,实现英译汉字典 一,socket编程的相关说明 Socket编程是一种网络通信…...

在Vue中使用Excalidraw实现在线画板
概述 Excalidraw是一个非常好用的画图板工具,但是是用React写的,本文分享一种在Vue项目中使用的方法。 效果 实现 Excalidraw简介 这篇文章(Excalidraw 完美的绘图工具:https://zhuanlan.zhihu.com/p/684940131)介绍的很全面,…...

游戏+AI的发展历程,AI技术在游戏行业的应用有哪些?
人工智能(AI)与游戏的结合,不仅是技术进步的体现,更是人类智慧的延伸。从最初的简单规则到如今的复杂决策系统,AI在游戏领域的发展历史可谓波澜壮阔。 早在2001年,就有研究指出游戏人工智能领域࿰…...

Methode Electronics EDI 需求分析
Methode Electronics 是一家总部位于美国的全球性技术公司,专注于设计和制造用于多个行业的电子和电气组件,产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域,提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…...

2023AE软件、Adobe After Effects安装步骤分享教程
2023AE软件是一款由Adobe公司开发的视频编辑软件,也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用,用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式,具有丰富的插件和预设&#…...

【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景
博客主页: [小ᶻZ࿆] 本文专栏: 前端 文章目录 💯前言💯场景一:直接赋值与重新引用为什么结果不是 [3, 4, 5]?1. 引用与赋值的基本概念2. 图示分析 关键总结 💯场景二:引用指向的变化为什么…...
本地项目运行提示跨域问题
项目背景:我使用phpwebstudy在本地搭建了一个项目,然后前端是http://localhost:8080/ 后端我直接创建了一个本地域名,例如www.abc.com 然后vue.config.js配置如下,这个配置在我所有线上环境是没有任何问题的 devServer: {proxy…...

C++ —— string类(上)
目录 string的介绍 string类功能的使用介绍 constructor —— 构造 介绍使用(1)(2)(4) :构造、拷贝构造、带参构造 介绍(3):拷贝string类对象的一部分字符…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...