基础
-
应用层 (Application Layer):
- 作用: 应用层是网络体系结构中最靠近用户的层。它为网络或互联网应用程序提供服务接口和协议。
- 基本协议:
- HTTP (HyperText Transfer Protocol): 用于网页传输。
- HTTPS (HTTP Secure): 加密的HTTP,用于安全的网页传输。
- FTP (File Transfer Protocol): 用于文件传输。
- SMTP (Simple Mail Transfer Protocol): 用于发送邮件。
- IMAP (Internet Message Access Protocol) / POP3 (Post Office Protocol version 3): 用于接收邮件。
-
POP3 (Post Office Protocol version 3): 另一种用于电子邮件接收的协议。
-
DHCP (Dynamic Host Configuration Protocol): 用于在网络上分配IP地址。
-
DNS (Domain Name System): 用于将域名解析为IP地址。
-
SNMP (Simple Network Management Protocol): 用于网络管理。
-
Telnet: 一种旧的远程终端访问协议。
-
SSH (Secure Shell): 用于安全地访问远程计算机。
-
LDAP (Lightweight Directory Access Protocol): 用于访问和管理目录信息服务。
-
SIP (Session Initiation Protocol): 用于建立、管理和终止网络电话和视频会话。
-
RTP (Real-time Transport Protocol): 用于交付音频和视频数据。
-
RTSP (Real Time Streaming Protocol): 用于控制媒体流的播放。
-
XMPP (Extensible Messaging and Presence Protocol): 用于即时通讯。
-
NNTP (Network News Transfer Protocol): 用于阅读和发布新闻文章。
-
NTP (Network Time Protocol): 用于网络时间同步。
-
BGP (Border Gateway Protocol): 用于路由和自治系统之间的通信。
-
MQTT (Message Queuing Telemetry Transport): 一种轻量级的消息传输协议,常用于物联网。
-
TFTP (Trivial File Transfer Protocol): 一种简化的、无需认证的文件传输协议。
-
RDP (Remote Desktop Protocol): 微软开发的远程桌面协议。
-
IMAPS, POPS3, SMTPS: 分别为IMAP, POP3, SMTP的安全版本。
-
IRC (Internet Relay Chat): 用于实时消息交流的协议。
-
RSVP (Resource Reservation Protocol): 用于网络资源预留的协议。
-
SSDP (Simple Service Discovery Protocol): 在局域网中用于发现网络服务和设备的协议。
-
SOAP (Simple Object Access Protocol): 用于Web服务的消息协议,基于XML。
-
REST (Representational State Transfer): 不是协议而是一种架构风格,常用于API设计。
-
CoAP (Constrained Application Protocol): 用于受限环境(如低功耗、低带宽设备)的Web协议。
-
BitTorrent: 用于P2P文件共享的通信协议。
-
WebSocket: 提供在单个TCP连接上进行全双工通信的协议。
-
SMB (Server Message Block): 主要用于提供网络文件共享和打印服务的协议。
-
AFP (Apple Filing Protocol): 苹果公司用于网络文件共享的协议。
-
NFS (Network File System): 用于文件系统访问的网络协议。
-
WebDAV (Web Distributed Authoring and Versioning): 基于HTTP的协议,用于用户在网络上协同编辑和管理文档。
-
CardDAV: 用于访问和共享联系人信息的WebDAV扩展。
-
CalDAV: 用于访问日历数据的协议,也是WebDAV的扩展。
-
AMQP (Advanced Message Queuing Protocol): 用于消息传递的开放标准协议。
-
STUN (Session Traversal Utilities for NAT): 用于NAT(网络地址转换)穿越的协议。
-
TURN (Traversal Using Relays around NAT): 一种NAT穿越协议,用于在防火墙和NAT设备后面的设备间进行音视频通信。
-
ICE (Interactive Connectivity Establishment): 用于NAT穿越的框架,结合了STUN和TURN。
-
QUIC (Quick UDP Internet Connections): 基于UDP的传输层协议,由Google开发,旨在减少连接和传输延迟。
-
SPDY (Speedy): 被HTTP/2采纳的网络协议,由Google开发,旨在降低Web页面加载时间。
-
Kerberos: 网络认证协议,用于节点间安全的身份验证。
-
Gopher: 一种分布式文档搜索和检索的协议,现已基本被HTTP所取代。
-
Z39.50: 用于图书馆等信息检索系统的应用层协议。
-
WHOIS: 用于查询域名的注册信息和IP地址分配的协议。
-
RADIUS (Remote Authentication Dial-In User Service): 用于提供中央认证和授权管理的网络协议。
-
这些协议各自针对特定的网络服务和应用,展示了应用层协议在提供丰富的网络功能和服务方面的多样性。随着技术的发展,不断有新的应用层协议被开发出来,以适应日益增长和变化的网络通信需求。
-
表示层 (Presentation Layer):
- 作用: 确保从应用层发送的信息可以被接收端的应用层读取。主要处理数据格式转换、数据加密和解密。
- 基本协议:
- SSL (Secure Sockets Layer) / TLS (Transport Layer Security): 用于会话加密。
- MIME (Multipurpose Internet Mail Extensions): 用于电子邮件中的多媒体数据。
- JPEG, GIF, TIFF (图像格式): 用于图像数据格式转换。
-
会话层 (Session Layer):
- 作用: 管理和控制应用程序之间的对话(会话),确保会话有效,并负责建立、维护和终止会话。
- 基本协议: 通常与应用层协议捆绑,如 NetBIOS (Network Basic Input/Output System),主要用于Windows网络。
-
传输层 (Transport Layer):
- 作用: 提供端到端的通信服务。确保数据完整性和传输的可靠性。
- 基本协议:
- TCP (Transmission Control Protocol): 提供可靠、有序且无重复的数据传输。
- UDP (User Datagram Protocol): 提供快速、无连接的数据传输,但不保证可靠性。
-
网络层 (Network Layer):
- 作用: 负责数据包从源到目的地的逻辑地址和路径选择。
- 基本协议:
- IP (Internet Protocol): 为数据包寻址并路由。
- ICMP (Internet Control Message Protocol): 用于错误报告和诊断。
- ARP (Address Resolution Protocol): 用于将网络地址转换为物理地址。
-
数据链路层 (Data Link Layer):
- 作用: 在物理网络层的上方,负责节点间的数据传输、错误检测和纠正。
- 基本协议:
- Ethernet: 广泛应用于局域网 (LAN)。
- PPP (Point-to-Point Protocol): 在点对点链接中用于封装网络层协议。
-
物理层 (Physical Layer):
- 作用: 负责原始比特流的传输。
- 基本协议和标准:
- Ethernet标准: 包括电缆、卡和连接器。
- IEEE 802.11: 无线局域网标准,即Wi-Fi。
应用举例
创建一个简单的网络代码示例,涉及多个网络层的作用,可以是一个基本的客户端-服务器通信模型。这里,我将使用C++编写一个简单的TCP客户端和服务器。这个示例将展示传输层(使用TCP协议)、网络层(使用IP协议)、数据链路层和物理层(这些通常是由操作系统和硬件处理,代码层面不直接涉及)的作用。
服务器端代码
服务器端将创建一个套接字,绑定到一个地址和端口,然后开始监听连接。当接收到客户端的连接请求时,它将接受连接并发送一条消息。
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <cstring>
#include <unistd.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *message = "Hello from server";
// 创建套接字文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 强制将套接字绑定到端口 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// 绑定套接字到端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 开始监听端口
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受来自客户端的连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 读取发送的数据
read(new_socket , buffer, 1024);
std::cout << buffer << std::endl;
// 回应客户端
send(new_socket, message, strlen(message), 0);
std::cout << "Message sent\n";
close(new_socket);
close(server_fd);
return 0;
}
客户端代码
客户端将创建一个套接字,并尝试连接到服务器端。连接成功后,它将发送一条消息并接收服务器的响应。
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
const char *message = "Hello from client";
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cout << "Socket creation error" << std::endl;
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
// 将套接字地址转换为其二进制形式
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
std::cout << "Invalid address/ Address not supported" << std::endl;
return -1;
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cout << "Connection Failed" << std::endl;
return -1;
}
// 发送数据
send(sock, message, strlen(message), 0);
std::cout << "Message sent" << std::endl;
// 接收服务器响应
int valread = read(sock, buffer, 1024);
std::cout << buffer << std::endl;
close(sock);
return 0;
}
各层的作用
- 应用层: 客户端和服务器应用程序(代码本身)。
- 传输层: 通过TCP提供可靠的、面向连接的数据传输服务。
- 网络层: 通过IP地址和路由协议将数据包从源传送到目的地。
- 数据链路层和物理层: 由底层网络硬件和操作系统处理,负责在物理媒介上发送和接收数据帧。
请注意,运行这些示例代码需要Linux环境或类似的兼容环境。这些代码片段仅作为演示网络层级结构中不同层如何协同工作的简单示例。在实际应用中,网络编程可能会更加复杂,并需要考虑更多的错误处理和安全问题。
网络协议细节
HTTP
HTTP(HyperText Transfer Protocol)是Web上使用的主要协议,经历了多个版本的迭代,每个版本都引入了新的特性和改进。以下是HTTP协议的主要版本及其特性:
-
HTTP/0.9 – “The One-line Protocol”
- 时间:1991年左右。
- 特性:
- 只支持GET请求。
- 没有请求或响应的头部信息。
- 服务器发送完所请求的资源后立即关闭连接。
-
HTTP/1.0 – 改进和标准化
- 时间:1996年(RFC 1945)。
- 特性:
- 引入了方法(GET, POST, HEAD)。
- 引入了状态码(如404 Not Found, 200 OK)。
- 头部信息的引入,提供了请求和响应的元数据。
- 支持非HTML类型的数据(如图片、视频等)。
-
HTTP/1.1 – 当前Web的核心
- 时间:1997年(RFC 2068),1999年修订(RFC 2616)。
- 特性:
- 持久连接(Persistent Connections),减少了建立和关闭连接的开销。
- 管道化请求(Pipelining),允许多个请求在同一个连接中依次发送。
- 分块传输编码(Chunked transfer encoding)。
- 缓存处理更加精细(Cache-Control)。
- 增加了更多的请求方法(OPTIONS, PUT, DELETE, TRACE, CONNECT)。
- 改进了连接管理和错误处理。
-
HTTP/2 – 性能优化的重大改进
- 时间:2015年(RFC 7540)。
- 特性:
- 二进制协议,不再是纯文本,提高了解析效率。
- 多路复用(Multiplexing),在一个连接上同时发送多个请求和响应。
- 服务器推送(Server Push),服务器可以主动向客户端发送资源。
- 头部压缩,减少了额外的网络开销。
- 强制要求加密通信,通常与TLS(传输层安全性协议)结合使用。
-
HTTP/3 – 基于QUIC协议
- 时间:尚在开发中,目前为草案阶段。
- 特性:
- 基于QUIC(一种基于UDP的多路复用和低延迟的传输协议)。
- 旨在解决HTTP/2中TCP层的队头阻塞问题。
- 改进的连接迁移和恢复能力。
- 继续支持HTTP/2的功能,如服务器推送、头部压缩等。
每个HTTP版本的出现都是为了解决前一版本的限制,提高Web的性能和效率。随着Web技术的不断演进,HTTP协议也在不断地发展和适应新的需求。
HTTPS
HTTPS(全称是 HyperText Transfer Protocol Secure)是HTTP的安全版本。它是一个应用层协议,结合了HTTP和SSL/TLS协议,用于在客户端与服务器之间进行安全通信。HTTPS的关键特性是:
-
加密:通过SSL/TLS协议提供对数据传输的加密,保证数据在互联网传输过程中不会被窃听。
-
完整性:确保数据在传输过程中不被更改。
-
身份验证:通过证书验证机制帮助用户确认他们正在与预期的服务器通信,而不是一个中间人。
在HTTPS中,SSL/TLS协议是工作在传输层的,它为HTTP提供了一个加密的通道,使得HTTP请求和响应都在这个加密通道中传输。这使得HTTPS在保护网页数据安全方面非常有效,尤其是在传输敏感信息(如登录凭据、支付信息等)时。
SSL
HTTPS本身没有不同的版本,因为它基本上是HTTP协议通过SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议进行加密实现的。HTTPS的安全特性和性能主要取决于底层使用的SSL或TLS协议的版本。以下是SSL和TLS的主要版本:
SSL版本:
-
SSL 1.0:
- 这是SSL协议的最初版本,由Netscape开发,从未公开发布。
-
SSL 2.0:
- 发布于1995年,是第一个公开发布的版本。
- 存在许多安全漏洞,已经被淘汰。
-
SSL 3.0:
- 于1996年发布,解决了SSL 2.0中的许多安全问题。
- 后来也被发现有漏洞(如POODLE攻击),不再被推荐使用。
TLS版本:
-
TLS 1.0:
- 于1999年发布,是SSL 3.0的后续版本。
- 对SSL 3.0进行了改进,但在安全性上仍有限制。
-
TLS 1.1:
- 于2006年发布。
- 提供了对密码和密钥的改进,解决了TLS 1.0中的一些安全问题。
-
TLS 1.2:
- 于2008年发布。
- 引入了更强的加密算法和更好的安全控制。
- 目前被广泛支持并推荐使用。
-
TLS 1.3:
- 于2018年发布。
- 提供了改进的安全性和性能,包括减少握手时间和更强的加密技术。
- 正在逐渐获得更广泛的应用和支持。
每个新版本的TLS都旨在提高安全性和性能。在实践中,Web服务器和浏览器通常支持多个版本的TLS,以确保兼容性和安全性。在HTTPS通信过程中,客户端和服务器会协商使用最强的共同支持的协议版本。