输入地址再按下回车键发生了什么
- 浏览器判断是否是
ip
地址,如果不是就进行域名解析,最后获得ip
地址和服务端口号; - 浏览器用
TCP
的三次握手和服务器建立连接; - 浏览器向服务器发送拼好的报文;
- 服务器收到报文后处理请求,同样拼接好报文再发送给浏览器;
- 浏览器解析报文,渲染输出页面。
域名解析的过程
由于大家伙对IP
这种东西比较难记,于是出现了域名这种东西,域名可以映射到IP
。域名解析分为几部分:
- 先浏览器先看自己有没有缓存该域名对应的
ip
; - 如果没有,询问操作系统有没有该缓存该域名对应的
ip
; - 如果没有,询问本机域名解析文件
hosts
有没有缓存该域名对应的ip
; - 如果没有,请求本地域名服务器有没有缓存该域名对应的
ip
; - 如果没有,则本地域名服务器请求根域名服务器(
com
),如果根域名服务器也没有,则将主域名服务器返回给本地域名服务器; - 本地域名服务器发送请求询问主域名服务器(
baidu.com
),主域名服务器将对应的网站注册服务器发送给域名服务器; - 本地域名服务器发送请求询问网站注册的域名服务器(
www.baidu.com
),域名服务器将ip
地址返回给本地域名服务器; - 本地域名服务器缓存这个域名和
ip
地址; - 本地域名服务器将解析的结果返回给用户,用户根据TTL值缓存再本地系统缓存中,域名解析至此结束。
CDN
浏览器个服务器是HTTP协议的两个端点,这两者之间有一个重要角色CDN
。CDN
的全称是内容分发网络。它应用了HTTP协议里的缓存和代理结束,代替源站响应客户端的请求。
CDN
可以缓存源站数据,减少浏览器请求的路径。
代理
代理是HTTP协议中请求方和应答方中间的一个环节,可以转发客户端的请求,也可以转发服务端的应答。
代理分为:
- 匿名代理:完全隐藏了被代理的机器,外界只能看到代理服务器;
- 透明代理: 外界既知道代理,也知道客户端;
- 正向代理:靠近客户端,代表客户端向服务端发送请求;
- 反向代理:靠近服务端,代表服务端响应客户端的请求。
CDN
就属于透明代理和反向代理。
HTTP报文格式
HTTP
协议规定报文必须有header
,但可以没有body
,且header
之后必须有一个空行
。所以HTTP
报文的格式是:
起始行
头部
空行
实体
请求行
GET / HTTP/1.1
由 方法 + 请求路径 + 协议版本号
组成。
状态行(服务器响应的状态)
HTTP/1.1 200 OK
由 协议版本号+状态码+原因
组成。
头部
HTTP
协议里面有很多的头部字段,用key: value
组成。(:前面不能有空格)。
在HTTP1.1
中,HOST
字段必须出现。
常见的请求方法
目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式,主要列举几种常见的:
GET
:请求资源;HEAD
:也是请求资源,不同的是只会传回响应头,即元信息,比如检查一个文件是否存在,可以使用HEAD
,或者检查文件是否有最新版本,可以在HEAD
返回文件的修改时间;POST
:创建文件;PUT
:更新文件;DELETE
:删除文件,因为这个动作危险性太大,所以通常服务器不会执行真正的删除操作,而是对资源做一个删除标记。
网址的组成
URI
的全称是Uniform Resource Identifier
,即统一资源标志符;URL
的全称是Uniform Resource Locator
,即统一资源定位符。URI是URL的超集,但是由于URL
太普及,现在两者可以简单得视为相等。
URI的格式:
scheme + :// + host:port + path + ?query
即方案名 + :// + 主机:端口 + 路径 + 参数
。
比如http://nginx.org
,scheme
是http
,host
是nging.org
,端口号默认为80
,路径默认为/
(根目录)。
比如file:///D:/http_study/www/
,scheme
是file
,由于是file
,所以host
默认为localhost
,所以路径为/D:/http_study/www/
。
响应状态码
状态码分为5类:
类比 | 描述 |
---|---|
1xx | 提示信息,表示目前是协议处理的中间状态,还需要后续的操作。 |
2xx | 成功,报文已经收到并被正确处理。 |
3xx | 重定向,资源位置发生变动,需要客户端重新发送请求。 |
4xx | 客户端错误,请求报文有误,服务器无法处理。 |
5xx | 服务器错误,服务器在处理请求时内部发生了错误。 |
常见状态码:
状态码 | 数字 | 描述 |
---|---|---|
101 | Switching Protocols | 切换协议,比如使用了webscoket |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
204 | No Content | 无内容。服务器成功处理,响应头后没有 body 数据 |
206 | Partial Content | 部分内容。是 HTTP 分块下载或断点续传的基础。服务器成功处理了请求,但 body 里的数据不是资源的全部,而是其中的一部分。 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
304 | Not Modified | 它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件” |
400 | Bad Request | 示请求报文有错误 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页) |
405 | Method Not Allowed | 不允许使用某些方法操作资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 表示客户端请求的功能还不支持,这个错误码比 500 要“温和”一些,和“即将开业,敬请期待”的意思差不多,不过具体什么时候“开业”就不好说了。 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
HTTP的特点
- 简单、灵活、易扩展;
- 应用广泛、环境成熟;
- 无状态(可以使用
cookie
解决); - 明文;
- 不安全(使用
HTTPS
); - 性能不算差,也不够好。