计算机网络 - HTTP
HTTP的特点
HTTP = hypertext transfer protocol,即超文本传输协议。在网络分层模型里面有说到,HTTP是应用层协议。它的主要特点如下:
- 无状态
HTTP是建立在TCP协议上的,我们知道TCP协议是有状态的。有状态意味着内部存在一些数据结构去维护这个状态。而HTTP是无状态的,没有记忆能力。 - 请求-应答
“一发一收,有来有回”,连接是请求方主动发起,应用方收到请求后被动答复 - 灵活可扩展
报文的各个组成部分都没有严格的语法语义限制,可以自由发挥。只规定了一些基本的,例如空格分隔单词,换行分隔字段,“header+body”等。 - 可靠传输
依靠TCP协议的“可靠性” - 明文传输
键入网址回车 - 发生了啥?
步骤如下:
- 浏览器查找域名的IP地址
先是浏览器自己的缓存,然后检查系统缓存(本机域名解析文件hosts),然后查找路由器缓存,然后向根域名服务器请求,然后递归向其他域名服务器请求。这里就会涉及到DNS解析。 - 浏览器向服务器发送HTTP请求
- TCP连接
- HTTP请求
- 收到服务器返回的HTTP报文(HTML响应)
- 根据HTML渲染解析页面
状态码
DNS解析
DNS解析指的就是域名到IP地址的解析,如下图所示:
图片来源:https://segmentfault.com/a/1190000006879700
域名解析系统是一个分层级的庞大系统:
- 本地DNS服务器
我们的电脑和手机里面都设置了本地DNS服务器,简称(LDNS) - 权威域名服务器
- 顶级域名服务器
- 根域名服务器
全世界有13个根DNS,10个在美国,英国瑞典1个,日本1个。但每个根都有镜像,全世界有一千多个物理服务器。我国境内对根DNS的请求,基本都由国内的镜像完成了,没有路由到国外的根服务器上去。
相关阅读:美国能让俄罗斯在网络上消失吗?
Cookie机制
Cookie是存在浏览器里的,是服务器委托浏览器存储在客户端里的一些数据。我们知道HTTP是无状态的,所以需要像Cookie这样传个小纸条,告诉服务器我这个客户端不是新人,以前有一些属性,可以根据这些属性提供个性化服务。
与之经常一起比较的是Session,Session是存储在服务端的,一般会用内存或者数据库(Redis一类的)来保存,也是记录用户的状态。例如购物车场景,通过Session标识并跟踪这个用户。
Nginx
参考资料
这里只是一些科普类的感性认知:
Nginx是个“轻量级”的Web服务器,它的CPU,内存占用都很少,同样的配置下能为更多的用户提供服务。
“进程池+单线程”工作模式
启动时预先创建好固定数量的worker进程,并绑定到独立的CPU上,除了worker进程,还有一个master进程来管理进程池,其作用是监控worker使worker异常后能自动恢复。
I/O多路复用
多线程虽然可以很容易处理并发,但也存在缺点:如数据竞争,同步,模型复杂等。Nginx采用单线程的方式,没有互斥锁,减少系统消耗,其利用了Linux内核的I/O多路复用接口epoll()。
Web服务器主要是“I/O密集型”而不是“CPU密集型”。一般的单线程处理,就会导致CPU“停下来”等待I/O,造成浪费。epoll让Nginx能把多个HTTP请求打散,都复用到一个单线程里,不按照先来后到,只有当连接真正可读可写才处理。如果阻塞,就立刻切换去处理其他请求。
epoll还有个特点是,大量连接管理都是在操作系统内核做的,减轻应用程序负担,每个连接仅仅需要很小的内存维护状态。
多阶段处理 - 责任链模式
HTTP处理的四大类模块:
- handler 模块:直接处理 HTTP 请求;
- filter 模块:不直接处理请求,而是加工过滤响应报文;
- upstream 模块:实现反向代理功能,转发请求到其他服务器;
- balance 模块:实现反向代理时的负载均衡算法。