计算机网络自顶向下方法6——应用层 进程通信与运输服务
应用层探秘(二):进程通信与运输服务
本文深入解析网络应用的基石:进程如何通过网络通信,以及如何选择合适的运输服务。
一、进程通信:网络应用的实质
网络应用的本质,是运行在不同主机上的应用进程之间的通信。“客户端”和“服务器”实际上是进程的角色。
1. 客户端与服务器进程
客户端进程:通信的发起者。
通常由用户触发,间歇性运行。
主动向服务器发起通信。
动态获取IP地址。
服务器进程:通信的等待者。
总是运行在后台,等待连接请求。
拥有固定的、众所周知的IP地址。
关键点:我们常说的“客户端”和“服务器”,指的是承担相应角色的进程,而非整个主机。一台主机可以同时运行多个客户端和服务器进程。
2. 进程与网络之间的接口:套接字
进程通过一个称为套接字的软件接口向网络发送和接收报文。
// 一个简化的视角:你的项目中的通信
// 客户端进程
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字
connect(sockfd, &server_addr, sizeof(server_addr)); // 连接服务器进程
send(sockfd, json_request, strlen(json_request), 0); // 通过套接字发送数据// 服务器进程
int client_fd = accept(server_sockfd, NULL, NULL); // 接受连接,创建新的套接字用于通信
recv(client_fd, buff, sizeof(buff), 0); // 通过套接字接收数据套接字是应用层与运输层之间的门户。开发者可以控制套接字这一端的几乎所有东西(选择运输协议、设定参数),但对套接字另一端的运输层基础设施几乎无法控制。
3. 进程编址:如何找到对方?
为了向特定主机上的特定进程发送报文,需要两种信息:
主机的地址:IP地址。
进程的标识符:端口号。
HTTP服务器使用端口80
SMTP服务器使用端口25
二、应用程序需要的运输服务
不同的网络应用对数据传输有不同的要求。在选择运输协议时,主要从以下四个维度考量:
1. 可靠数据传输
需求:数据能否容忍丢失?
可靠:确保由发送进程发送的数据最终完整地交付给接收进程。
适用场景:文件传输、电子邮件、Web文档传输。
不可靠:可能发生数据丢失。
适用场景:语音/视频通话(丢失少量数据影响不大,重传反而有害)。
2. 吞吐量
需求:应用对传输速率有无最低要求?
带宽敏感的应用:需要吞吐量保证在某数值以上。
适用场景:多媒体应用(如视频流)。
弹性应用:能够利用任何可用的吞吐量。
适用场景:电子邮件、文件传输。
3. 定时
需求:数据对传输延迟是否敏感?
要求低延迟:数据必须在某个时间范围内到达。
适用场景:网络游戏、语音通话(延迟>400ms体验就很差)。
对延迟不敏感:没有严格的延迟上限。
适用场景:文件下载。
4. 安全性
需求:数据是否需要保密、完整或认证?
需要安全:对传输数据进行加密,防止窃听和篡改。
适用场景:网上银行、电子商务、企业敏感信息。
不需要安全:数据可以明文传输。
适用场景:非敏感信息的普通浏览。
三、因特网提供的运输服务
因特网的运输层主要为我们提供了两个协议:TCP和UDP。它们为应用层提供了截然不同的服务模型。
1. TCP服务
TCP是一个面向连接的、可靠的运输协议。
面向连接:在数据传输前,客户端和服务器会交换控制信息,进行三次握手,建立一个TCP连接。数据传输结束后,会关闭连接。
可靠数据传输:通过确认、重传等机制,确保数据正确、有序地从发送进程到达接收进程。
拥塞控制:当网络出现拥堵时,TCP会抑制发送进程,缓解网络压力。这不仅是为了对方考虑,也是为了整个网络的健康。
流量控制:协调发送和接收速率,防止发送方过快地发送数据而淹没接收方。
TCP像是可靠的“快递服务”:你寄出的包裹(数据)保证不丢失、不损坏、按顺序送达,但可能需要付出一些时间(延迟、开销)的代价。
2. UDP服务
UDP是一个无连接的、不可靠的运输协议。
无连接:发送数据前没有握手过程,直接发送。
不可靠数据传输:不保证数据一定能到达接收进程,也不保证按序到达。
没有拥塞控制和流量控制:发送进程可以按任何速率发送数据。
UDP像是普通的“邮政平信”:成本低、速度快,但可能丢失、乱序,且不通知你。
3. TCP与UDP对比速查表
| 特性 | TCP | UDP |
|---|---|---|
| 连接建立 | 需要(三次握手) | 不需要 |
| 可靠性 | 可靠,保证交付 | 不可靠,可能丢失 |
| 吞吐量 | 受拥塞控制调节 | 不受限制,但可能因丢包而不稳定 |
| 定时 | 不保证 | 不保证 |
| 拥塞控制 | 有 | 无 |
| 头部开销 | 较大(20字节) | 较小(8字节) |
| 数据流 | 面向字节流,无消息边界 | 面向报文,保留消息边界 |
四、运输服务选择指南
作为应用开发者,如何为你的应用选择合适的运输协议?
| 应用 | 应用层协议 | 底层运输协议 | 选择原因 |
|---|---|---|---|
| 电子邮件 | SMTP | TCP | 可靠性至关重要,不能丢失邮件内容 |
| Web应用 | HTTP | TCP | 可靠性至关重要,需要保证网页完整加载 |
| 文件传输 | FTP | TCP | 可靠性和完整性是首要目标 |
| 远程终端 | SSH/Telnet | TCP | 可靠性很重要,打错的命令后果严重 |
| 流媒体 | HTTP, RTP | TCP 或 UDP | 时效性和吞吐量是关键,可容忍少量丢失 |
| 网络电话 | SIP, RTP | 通常UDP | 低延迟和时效性是关键,重传无意义 |
| 域名解析 | DNS | 通常UDP | 请求-响应模式,简单快速,一次交换即可完成 |
总结
进程通信是网络应用的实质,通过套接字接口实现。
运输服务的选择是在可靠性、吞吐量、定时、安全性等多个维度间的权衡。
TCP提供可靠的、面向连接的字节流服务,是大多数数据应用的首选。
UDP提供简单的、无连接的不可靠报文服务,适用于实时性要求高、可容忍丢失的应用。
理解这些基础原理,是设计高效、健壮网络应用的第一步
