前言
本文基于 Linux 网络基础系列,讲解 DNS 协议、ICMP 协议、NAT 技术、内网穿透及代理服务器。
一、DNS 协议
TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机上的一个程序(服务),但是我们知道 IP 地址是不便于记忆的,而域名比较容易记忆。例如访问百度,域名为 www.baidu.com;访问 QQ,域名为 www.qq.com。
用户在浏览器输入域名时,浏览器内置了 DNS 服务器的 IP 地址,会自动查询 DNS 服务器。DNS 检索数据库,返回 IP 地址给浏览器,浏览器拿到域名对应的 IP 地址后就可以访问服务器了。
以 www.baidu.com 为例介绍域名结构:
- com 是一级域名,表示企业域名,同级还有 net(网络提供商)、org(非营利组织)等。
- baidu 是二级域名,公司名。
- www 是一种习惯写法。
浏览器中输入 URL 后的过程:
- 浏览器向 DNS 服务器查询域名对应的 IP 地址。
- 获取 IP 地址后构建 HTTP 请求(请求行、请求头、空行、请求体),发送前进行 TCP 三次握手建立连接。
- 对方服务器收到报文后构建 HTTP 响应(状态行、响应头、空行、响应正文),通过连接通道发送回浏览器。
- 浏览器解析响应并渲染展示。
- 若使用 HTTPS,通信前需进行密钥协商加密。
- 应用层数据放入 TCP 发送缓冲区,通过流量控制、拥塞控制、确认应答机制等发送。
- 网络层涉及 IP 协议报文填写、查路由表、网段划分等。
DNS 是将域名和 IP 地址关联起来的系统。
![图片]
二、ICMP 协议
- ICMP 协议定位:在传输层 TCP/UDP 之下,在网络层 IP 之上,隶属于网络层。
- 场景:主机 A 想给主机 B 发送报文,若主机 B 离线,IP 协议不保证可靠性,路由器无法得知主机 B 的 MAC 地址。
- ICMP 与 IP 上层关系类似 ARP 在 MAC 帧的上层。
- 编程中原始套接字可绕过传输层直接调用网络层接口构建 ICMP 报文,ping 指令即采用此方式。
- ping 测试连通性时,ICMP 报文经路由器转发至主机 B,主机 B 发现 ICMP 报头则不进行向上交付,而是发送 ICMP 应答回主机 A。
- ping 指令执行由用户调用,操作系统自动完成剩余工作。
- 面试题:telnet 是 23 号端口,ssh 是 22 号端口,ping 是什么端口?
- 坑点:ping 基于 ICMP 协议,ICMP 是网络层协议,端口号是传输层概念,ICMP 不涉及端口。
- traceroute 命令基于 ICMP 实现,打印从发送端到目标端经历的路由器数量及 IP 地址。
- traceroute 本质是 traceroute IP 地址,域名需先通过 DNS 解析为 IP。
- 原理:维护 TTL 计数(跳数计数器)。初始设置为 1,路由器转发减 1,若为 0 则丢弃并向发送端返回应答(含路由器 IP)。
- 发送端根据应答打印第一跳路由器 IP,接着构建 TTL=2 的报文,以此类推直到到达目标主机。
ping 验证的是 IP 地址对应服务器的网络服务连通性,同时统计响应时间和 TTL(Time To Live)。
![图片]
类型字段表示报文是否到达目标地址及原因。若类型为 3,表征目标不可达。
![图片]
ICMP 告知未成功到达目标地址的原因。路由器丢弃报文的同时会返回 ICMP 应答。
![图片]
网络搭建后常需测试连通性。IP 协议不提供可靠性,丢包时无法告知原因,ICMP 可告知丢包原因。ICMP 功能如下:
- 确认 IP 报文是否成功到达目标地址。
- 通知发送过程中 IP 报文丢弃的原因。
- 基于 IP 协议工作,归到网络层协议。
- 报文分为两类:通知出错原因、诊断查询。
![图片]


