网络是怎么连接的
目录
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 连接。 这通过调用