HTTP协议,协议说白了就是协议浏览器和服务器之间约好的暗号。你输入网址,协议敲下回车,协议浏览器就按这套暗号把请求递过去,协议服务器再按同一套暗号把内容扔回来。协议整个过程快得你感觉不到,协议但背后每一行代码都在严格遵循这套规矩。协议
这套规矩的协议核心就八个字:请求什么,返回什么。协议你访问`https://example.com`,协议浏览器会发一条请求行,协议上面写着方法(GET)、协议路径(/)和协议版本(HTTP/1.1)。协议服务器收到后,协议先回一个状态行,比如`HTTP/1.1 200 OK`,意思是“我这儿有你要的东西,给你”。然后是一堆响应头,像`Content-Type: text/html`告诉你这是网页,`Content-Length: 1234`告诉你内容多大。最后空一行,才是真正的网页代码。
你可能会问,为什么搞这么复杂?直接传内容不就行了?不行。因为互联网上不只有网页,还有图片、视频、API接口。服务器得先告诉浏览器“我返回的是图片,不是文本”,否则浏览器会乱成一锅粥。HTTP头就是干这个的——它像快递单上的备注栏,写着“易碎品”“冷藏”“本人签收”。
这里有个细节很多人不知道:HTTP本身是无状态的。什么意思?就是服务器记不住你。你上一次访问时往购物车加了三件商品,下一次访问时服务器根本不记得你是谁。早期网站就是这么傻,每次请求都是独立的,谁也不认识谁。后来工程师忍不了,发明了Cookie——服务器在响应头里塞一个小纸条,浏览器存下来,下次请求时再带回去。服务器一看纸条,哦,是你小子,购物车还在。
我见过最典型的HTTP误用,是有人用GET方法去删除数据库记录。GET本意是“获取资源”,结果被当成了“执行操作”的万能钥匙。这就像你让人家“把盐递过来”,结果对方直接把盐罐子砸你头上。语义错了,整个系统就乱了。后来RESTful风格流行起来,大家才重新规范:GET拿数据,POST提交新数据,PUT整体更新,DELETE删除。规矩明确了,代码才好维护。
HTTP还有一个脾气:它不保证内容完整到达。网络传输是有损耗的,数据包可能丢,可能乱序。但HTTP自己不管这事,它把责任推给下一层的TCP协议。TCP像个强迫症快递员,一个一个包清点,丢了就重发,乱序就重排。HTTP只管站在TCP肩膀上,轻松地发号施令。这种分层设计是计算机科学里最优雅的思想之一——每层只干自己的事,别越界。
近些年HTTPS普及,给HTTP套了一层加密壳。原来你发的请求是明文,抓包工具一抓,密码全裸奔。现在有了TLS加密,即使抓了包,看到的也是一堆乱码。这层壳加得值——我亲眼见过一个老系统因为没上HTTPS,用户密码被中间人截获,整个账号体系差点被拖垮。那之后我把所有个人项目都切到了HTTPS,麻烦是麻烦点,但晚上睡得踏实。
说了这么多,HTTP其实就一句话:一套约定好格式的文本交换规则。它不聪明,不神秘,甚至有点啰嗦——每个请求都要带上完整的头信息。但正是这种笨拙的直白,让全世界几十亿台设备能顺畅对话。下次你打开网页觉得卡,可以打开开发者工具看看Network面板,那些密密麻麻的请求列表,就是HTTP在默默干活。它不声不响,但整个互联网都站在它肩膀上。