HTTP协议
HTTP请求
- 请求行
- 请求方法:GET、POST、HEAD、OPTIONS、TRACE 等等
- HEAD:比如我们只是确认一个内容是否正常存在,不需要返回照片内容,这时候用HEAD比较合适
- TRACE:是你用了代理上网,比如用代理访问new.163.com,你想看看代理有没有修改你的HTTP请求。可以用TRACE来测试一些,163.com的服务器就会把最后收到的请求返回给你
- 这些请求方法虽然HTTP协议里规定的,但WEB SERVER未必允许或支持这些方法,OPTIONS是返回服务器可用的请求方法
- 请求路径(即请求的相对路径)
- 请求协议:HTTP/1.1、HTTP/1.0 等等
- 请求方法:GET、POST、HEAD、OPTIONS、TRACE 等等
- 请求头信息
- HOST(必须)
- Cookie(模拟登录)
- Content-Type(POST必须)
- Content-Length(POST必须)
- Referer(代表网页的来源,即上一页的地址,如果直接在浏览器上输入网址进来,则没有Referer信息,这也是为什么服务器我们的图片是从哪里引用的,也知道我们的客户从哪个网站链接点击过来的)
- Others
- 请求主体信息(POST必须)
- JSON
- XML
注意:请求头与请求主体之间必须要有一个空行隔开
GET和POST请求最常用
请求行与请求头信息:GET实例
GET / HTTP/1.1
HOST:localhost
csrftoken:......
请求行与请求头信息:POST实例
POST / HTTP/1.1
HOST:localhost
csrftoken:......
Content-Length:20
Content-Type:application/x-www-form-urlencoded
HTTP响应
- 响应行
- 协议版本
- 状态码
- 1XX:接受到请求,继续处理
- 2XX:请求成功
- 3XX:请求重定向
- 302:请求被临时重定向到另一个地址
- 304:Not Modifiled(资源未修改,从本地取缓存)
- 301:请求被永久重定向到另一个地址
- 307:重定向中保持原有的post数据,防止数据丢失
- 4XX:客户端请求错误
- 404:没有找到请求文件
- 403:客户端访问错误
- 5XX:服务端出现问题
- 503:服务器暂时不可用
- 500:服务器内部错误
- 状态文字:对于状态码的文字解释
- 响应头信息
- 响应主体信息
- 文本
- 二进制文件
当输入网址回车会发生什么
输入一个网址并按回车的时候浏览器会根据输入的URL去查找对应的IP,具体过程如下:
(1)首先是查找浏览器缓存,浏览器会保存一段时间内访问过的一些网址的DNS信息,不同浏览器保存的时常不等。
(2)如果没有找到对应的记录,这个时候浏览器会尝试调用操作系统缓存来继续查找这个网址的对应DNS信息。
(3)如果还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息。
(4)如果还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商,就是网络运营商,中国电信中国移动等),ISP也会有相应的ISP DNS服务器,就是本地DNS服务器,请求的域名基本上都能在这里找得到。
(5)如果还是没有的话, ISP的DNS服务器会将请求发向根域名服务器进行搜索。根域名服务器就是面向全球的顶级DNS服务器,共有13台逻辑上的服务器,从A到M命名,真正的实体服务器则有几百台,分布于全球各大洲。
(6)如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。或者域名过期了。
浏览器终于得到了IP以后,向服务器发送TCP连接,TCP连接经过三次握手。
浏览器和服务器建立连接以后,浏览器接着给这个IP地址给服务器发送一个http请求,方式为get,例如访问www.baidu.com。其本质是在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求。
这个get请求包含了主机(Host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的”代理人”,Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。可能还会有Cookies,Cookies保存了用户的登陆信息,一般保存的是用户的JSESSIONID,在每次向服务器发送请求的时候会重复发送给服务器。
在建立连接发送请求时每个服务端需要和客户端保持通信,有很多客户端都会和服务器进行通信。服务器为了识别是哪个客户端与它通信,就必须用一个标识记录客户端的信息。客户端首次访问服务器,服务端返回响应时通过附带一个记录的客户端信息的标识来返回给客户端,这个标识就是JSESSIONID,JSESSIONID就放在了客户端的Cookies里。当客户端再次向服务器发送请求时上就使用上次记录的Cookies里面的JSESSIONID,这样服务器就知道是哪个浏览器了。这样他们之间就能保持通信了。
HTTPS加密
HTTPS使用了对称加密+非对称加密+hash+CA证书