TCP 是面向字节流的通信协议,这意味着它本身不具备消息边界。为了实现可靠的应用层通信,我们需要定义应用层协议。虽然我们可以自定义协议,但为了通用性,直接使用现成的标准协议更为高效,比如 HTTP(超文本传输协议)。
常见应用层协议概览
| 协议名称 | 默认端口 | 说明 |
|---|---|---|
| HTTP | 80 | 网页访问(明文) |
| HTTPS | 443 | 加密网页 |
| FTP | 21 / 20 | 文件上传下载 |
| SSH | 22 | 加密远程连接 |
| DNS | 53 | 域名解析 |
这些是网络开发中经常接触的基础协议。
认识 URL 与 DNS
当我们通过浏览器访问 https://www.baidu.com/ 时,本质上并不是直接访问这个字符串。浏览器需要先将域名解析为对应的 IP 地址才能建立连接。
具体流程如下:
- 客户端向本地 DNS 服务器发送解析请求。
- 若本地无缓存,会依次查询根域名、顶级域名及权威域名服务器。
- 最终获取 IP 地址并返回给客户端。
拿到 IP 后,客户端通过 IP 地址 + 端口号 定位服务。例如 HTTPS 默认端口是 443,浏览器会自动补全,无需显式写出。
IP 地址负责定位主机,端口号负责定位主机上的具体服务,二者缺一不可。
HTTP 协议结构
HTTP 通信本质是在 TCP 之上,按照固定格式传输的'结构化字符串'。一次完整的交互包含请求报文和响应报文。
请求报文结构
- 请求行:包含请求方法(GET/POST)、资源路径及 HTTP 版本。
- 请求报头:多行 key:value 形式,携带额外信息(如 Host、User-Agent),以
\r\n分隔。 - 空行:标志报头结束。
- 请求正文:可选,通常用于 POST 请求的数据载荷。
响应报文结构
- 状态行:包含 HTTP 版本、状态码(如 200 OK)及描述。
- 响应报头:说明返回数据的类型、长度等。
- 空行:分隔元数据与内容。
- 响应正文:客户端真正关心的数据(HTML、JSON 等)。

HTTP 服务器实现思路
HTTP 服务器本质上是一个 TCP 服务器,核心差异在于增加了请求解析与符合协议的响应构建。
整体流程:
socket → → → ↓ 创建线程 ↓ → 解析 →


