HTTP 起步:从手搓协议到超文本传输——URL、域名与 DNS
我的github:(https://github.com/xcx55/ubuntu-linux-project)
感谢各位大佬参观我的github!!
源笔记:http1(26-9-7)
前几篇我们手搓了一个应用层协议——JSON +\r\n。搓完再抬头看:HTTP 也是一个应用层协议,只不过不是我们定的,而是大佬们早就定义好、非常常用、供我们直接参考使用的现成协议。手搓的意义在这一刻兑现:有了亲手搓协议的经验,再看 HTTP 就不是背报文格式,而是"哦,原来这里是这样约定的"。
一、HTTP 是什么:超文本传输协议
HTTP,HyperText Transfer Protocol,超文本传输协议。它定义了客户端(比如浏览器)与服务器之间如何通信,以交换或传输超文本(比如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础:客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。
三个关键词先钉死:
- 无连接、无状态:每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息;
- 明文传输:HTTP 传输数据不会加密,HTTPS 才会进行加密——协议之间的差异,往往就是加密方式与轻便程度的取舍(笔记原话:协议是加密方式的不同于轻易程度);
- 客户端知道的,服务端肯定知道:双方对报文格式的约定必须完全一致,这一点和手搓协议时一模一样。
二、URL:给你一个链接,就是给你一个资源
一般我们给同学分享资源,就是传过去一个链接——这个链接(资源)就是 URL。
拿一个真实的 URL 拆开看:
https://www.baidu.com/s?wd=new%20year&...&ie=utf-8 └─协议┘└────域名────┘└路径┘└────────参数────────┘https://:用什么协议通信;www.baidu.com:访问的域名;- 后面一长串
?wd=...:请求的参数(搜索词、编码方式等等)。
URL 就是互联网世界的"资源地址",HTTP 的一切工作,都围绕"把 URL 对应的资源从服务器搬到浏览器"展开。
三、域名与 IP:计算机只认 IP,人类只记域名
先说一个冷酷的事实:访问目标服务器,永远只能用 IP 地址,因为计算机只认 IP。浏览器里的1.2.3.4才是真正被拨号的目标。
那为什么我们平时从来不输 IP,输的都是www.xxxx.com这种域名?笔记里的回答:
- 域名就是浏览器使用的入口,浏览器喜欢使用域名;
- 直接用 IP 不行吗?行,但不方便人类的理解——域名对人友好,转换后适用于计算机;
- 这是物联网产品化的特点:产品要给人用,就得迁就人的记忆方式。
一句话总结:域名,就是 IP 的化身。
四、DNS:把域名翻译回 IP 的那一步
既然计算机只认 IP,那浏览器发起请求之前,必须先把域名变回 IP。将域名转换为 IP 的工作,叫做域名解析(DNS),干这个活的机器叫域名解析服务器。
完整的访问流程就变成了这样:
浏览器 域名解析服务器 目标服务器(1.2.3.4) │ │ │ │── DNS查询: www.baidu.com 是哪个IP? ─→│ │ │←────── 返回: 1.2.3.4 ──────────────│ │ │ │ │ │──────────── HTTP request ──────────────────────→│ │ │←─────────── HTTP response ──────────────────────│ │- 浏览器想要和服务端发起请求,就要先得到 IP:把域名转换为 IP 的工作先交给域名解析服务器,再传回来——这个工作就叫 DNS;
- 域名解析服务器的 IP 地址一般为8.8.8.8(笔记里浏览器旁边记的这串数字就是它)。
谁提供域名解析?根域名服务器
那域名解析这件事,一般是谁提供的?——根域名服务器。而且解析是有层级、可以逐级向上的:一个找不到,就以 UDP 协议向上查找(DNS 查询本身跑在 UDP 上,轻量、快、一次问一次答)。
这带出一个脆弱性:要是一个根域名解析服务器自己关闭了,就可能导致无法上网——除非你懂行,直接用 IP 访问,跳过整个翻译环节。
五、协议观的升级
手搓协议 → 学 HTTP,最大的收获不是记住 HTTP 有哪些字段,而是验证了一个方法论:
协议,本质就是双方的约定。约定的内容可以是报文格式(JSON 还是报文头),可以是加密方式(HTTP 明文还是 HTTPS 加密),可以是传输方式(无连接还是有连接)。谁定义协议,谁就定义了客户端和服务端如何对话。
我们自己搓的len\r\n value \r\n和 HTTP 的报文格式,在"约定"这个层面上是平等的民族——区别只在于一个是我们自己定的,一个是全世界公认的。
总结
- HTTP = HyperText Transfer Protocol,定义客户端与服务器如何通信;无连接、无状态、明文(HTTPS 才加密);
- URL 是资源的地址:协议 + 域名 + 路径 + 参数;给链接就是给资源;
- 计算机只认 IP,域名是为了对人友好——域名就是 IP 的化身,这是产品化的妥协;
- DNS 把域名翻译回 IP:浏览器先问域名解析服务器(常见 8.8.8.8),根域名服务器逐级向上查(UDP),根服务器挂了可能全网上不了;
- 协议 = 约定:格式、加密、传输方式,都是约定的不同侧面。
下一篇继续拆 HTTP:请求报文到底长什么样,以及浏览器和服务器之间那些约定好的细节。