总结
- 应用层概述 客户/服务器架构,P2P架构,套接字
- FTP
- Web 和 HTTP 非持续HTTP,持续HTTP,响应时间,请求/响应报文
- Email SMTP,POP3,IMAP
- DNS 域名系统 层级结构,迭代查询,递归查询
架构概述
客户/服务器架构
graph TD Client --> Server Server --> Database Database --> Server --> Client
- 特点:
- 明确的角色划分,客户端发起请求,服务器提供服务。
- 服务器负责资源的管理和访问控制。
- 客户端依赖于服务器提供的功能和数据。
- 客户端和服务器之间通过网络连接进行通信。
- P2P架构:
graph TD Peer1 <--> Peer2 Peer1 <--> Peer3 Peer2 <--> Peer3
- 特点:
- 没有明确的服务器,各节点(peer)地位平等。
- 节点既可以作为客户端,也可以作为服务器。
- 节点直接相互连接和交换数据,无需中心服务器。
- 节点自主管理资源和连接,具有更好的灵活性。
- 适用于分布式、协作性强的应用场景。
- 套接字(Socket):
- 套接字是网络通信的抽象概念,用于描述 IP 地址和端口号。
- 套接字提供了应用程序与网络协议之间的接口,屏蔽了底层实现细节。
- 常见的套接字类型有 Stream Socket (TCP) 和 Datagram Socket (UDP)。
- 套接字API提供了丰富的功能,如连接建立、数据收发、状态查询等。
- 套接字是客户/服务器架构和P2P架构实现网络通信的基础。
HTTP链接
- RTT(Round Trip Time):一个非常小的分组从客户端传输 到服务器,再返回来所需要的往返时间
内容
HTTP头报文由请求行或状态行、多个首部字段、一个空行和可选的请求体或响应体组成。
请求头(Request Headers)
-
请求行(Request Line):
- 包含请求方法、请求目标(URI)和HTTP版本。
- 格式:
<method> <request-target> <HTTP-version>
- 例如:
GET /index.html HTTP/1.1
-
首部字段(Header Fields):
- 包含多个键值对,用于传递请求的元信息。
- 格式:
<field-name>: <field-value>
- 常见的请求头字段包括:
Host
: 指定服务器的域名(必须字段)User-Agent
: 客户端软件的信息Accept
: 客户端可接受的MIME类型Accept-Encoding
: 可接受的内容编码(如gzip)Connection
: 连接管理(如keep-alive
或close
)Authorization
: 身份验证信息
-
空行:
- 用于分隔请求头和请求体(如果有请求体的话)。
-
请求体(Request Body)(可选):
- 包含请求的实际数据(如POST请求中的表单数据)。
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
响应头(Response Headers)
-
状态行(Status Line):
- 包含HTTP版本、状态码和状态描述。
- 格式:
<HTTP-version> <status-code> <reason-phrase>
- 例如:
HTTP/1.1 200 OK
-
首部字段(Header Fields):
- 包含多个键值对,用于传递响应的元信息。
- 格式:
<field-name>: <field-value>
- 常见的响应头字段包括:
Date
: 生成响应的日期和时间Server
: 服务器软件的信息Content-Type
: 响应内容的MIME类型Content-Length
: 响应内容的长度Connection
: 连接管理(如keep-alive
或close
)Set-Cookie
: 设置HTTP cookie
-
空行:
- 用于分隔响应头和响应体。
-
响应体(Response Body)(可选):
- 包含实际的响应数据(如HTML文档、图像、JSON数据等)。
HTTP/1.1 200 OK
Date: Mon, 10 Jun 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Connection: keep-alive
<html>
<head><title>Example</title></head>
<body><h1>Hello, World!</h1></body>
</html>
非持续HTTP(HTTP1.0)
仅对一个对象进行传输,没有等待,请求完成后自动关闭 HTTP响应时间 = 建立TCP连接所需的RTT + HTTP请求/响应所需的RTT + 对象传输时间 = 2RTT + 传输时间 一个用于建立连接,一个用于断开连接
sequenceDiagram participant Client participant Server Note over Client, Server: HTTP1.0 Client->>Server: 创建TCP套接字,向服务端的80端口发起TCP连接 Server->>Client: 发送ACK 表示接受连接 Client->>Server: TCP套接字发送包含URL的HTTP 请求报文和请求对象/ Server->>Client: 将所请求的对 象封装成响应报文, 并发送给TCP套接字。
持续HTTP(HTTP1.1)
在需要传输的数据较多时,非连接HTTP每传输一个就要断开重连,有很多不必要的开销 一个TCP连接用于请求/响应多个对象 每个对象的HTTP响应时间 = RTT + 传输时间 仅需要建立连接 流程中,类似流水线的工作方式,在一个对象请求的响应到达之前,发送 其他对象的请求。
sequenceDiagram participant Client participant Server Note over Client, Server: HTTP1.1 Client->>Server: 创建TCP套接字,向服务端的80端口发起TCP连接 Server->>Client: 发送ACK 表示接受连接 Client->>Server: 请求1 Client->>Server: 请求2 Client->>Server: 请求3 Client->>Server: ...... Server->>Client: 请求的数据1 Server->>Client: 请求的数据2 Server->>Client: 请求的数据1
信道利用率
信道利用率=信道被占用的时间/周期=𝑛个分组的传输时间/传输一对分组使用及确认的时间 其中 是处理ACK使用的时间,有时会忽略ACK的时间
文件传输
FTP(File Transfer Protocol)
使用两个端口进行通信:控制端口(通常是21)用于命令和响应,数据端口(动态分配)用于实际的数据传输。 客户端使用控制端口(21)与FTP服务器建立连接,进行用户认证。
一个邮件从发送到接收的过程如下
graph TB A(用户发送邮件) --SMTP--> B(邮件到达邮件服务器的报文队列) B --SMTP--> C(SMTP客户端建立一个目的邮件服务商的TCP连接\n 并发送邮件) C --SMTP--> E(目的服务商接收到邮件\n 将报文储存在接收人的邮箱) E --POP3/IMAP--> F(接收人打开邮箱客户端\n 客户端向服务商发送TCP请求) F --POP3/IMAP--> G(接收人看到邮件)
这个过程中 三个协议起着不同的作用
- SMTP (Simple Mail Transfer Protocol):
- 只支持传输 7 比特 ASCII 码内容
- 支持在邮件服务器之间发送邮件
- SMTP 负责邮件的发送和中继传输。
- 当用户发送邮件时,邮件客户端会使用 SMTP 协议将邮件发送到 SMTP 服务器。
- SMTP 服务器会根据收件人地址,将邮件转发给目标域的 SMTP 服务器。
- 只支持传输 7 比特 ASCII 码内容
- POP3 (Post Office Protocol version 3):
- POP3 协议负责邮件的接收和下载。
- 当收件人想要读取邮件时,邮件客户端会使用 POP3 协议连接到收件人的邮箱服务器。
- IMAP (Internet Message Access Protocol):
- IMAP 协议也负责邮件的接收,但IMAP 允许收件人在服务器上管理和访问邮件。
- 收件人可以在服务器上查看、回复、删除邮件,而不需要将邮件完全下载到本地。
DNS域名系统(Domain Name System)
IP对于人来说比较难记,因此就出现了域名,电脑实际上是不认识域名的,这里就需要将域名转换为IP.
![[./img/DNS分布.png|500]] 当主机做DNS查询时,请求会先发往本地域名服务器,域名地址映射也会有缓存,使得经常被访问的地址可以不用查找, 代理查询: 委托DNS服务器查找
- 迭代查询
- 减轻了根域名服务器和顶级域名服务器的负载。
- 客户端可以自主控制查询过程,提高了灵活性。
graph TD Client --第一次--> DNS[DNS 客户端] DNS --没有找到\n去问问Root--> Client Client --第二次--> Root[根域名服务器] Root --没有找到\n去问问.cn--> Client Client --第三次--> TLD["顶级域名服务器(.cn)"] TLD --没有找到\n 去xxx--> Client Client --第四次--> Auth["授权域名服务器(xxx.cn)"]
- 递归查询
- 对客户端来说更加简单,不需要自己控制查询过程。
- 可以缓存查询结果,提高后续查询的速度。
graph TD Client --第一次委托--> DNS[DNS 服务器] DNS --第二次委托--> Root[根域名服务器] Root --第三次委托--> TLD[顶级域名服务器] TLD --第四次委托--> Auth[授权域名服务器] Auth --返回--> TLD TLD --返回--> Root Root --返回--> DNS DNS --返回--> Client