1,http过程明明白白:http://blog.51cto.com/linux5588/1351007
1)域名解析,浏览器会解析www.xxxx.com这个域名对应的ip,
1,查看浏览器的自身的缓存
2,操作系统自身的缓存
3,host文件
4,本地配置的dns服务器,发起递归请求,dns服务器寻找自己的缓存
5,不行就根据,com,xxxx.com,www.xxxx.com这样dns服务器寻找
6,结果运营商的dns服务器,windows系统内核,浏览器
捉包的时候会看到一个ARP请求,因为局域网通信靠MAC地址,需要网关我们才能和外围的ip通信
有时也会看到期望得到ipv6弟子,但是有时候没有
2)发起tcp3次握手,user-Agent会以一个随机端口(1024~65535)向服务器的web程序(nginx)的80端口发起连接请求,这个连接请求经过tcp/ip模型层层封包,通过各种路由设备,进入网卡,然后层层解封包,最终到达web程序,最终建立了tcp/ip的链接。
简单描述下过程:
1,前两个操作需要SYN=1,后面两个操作需要ACK=1,前一个搞个ACK=0代表没有开始
2,一开始发出seq=x,x代表序列,如果一开始x就是0
3,server也发出seq=y,同理上面,还有ack=x+1表示收到x和期望收到下一个是x+1
4,client这边也受到ack=y+1,seq是刚刚的seq=x+1
为什么要三次握手
两次的话,不知道client能否收到server
4次的话,太多了
3)那么好了Nginx在收到 浏览器 GET / 请求时,会读取http请求里面的头部信息,根据Host来匹配 自己的所有的虚拟主机的配置文件的server_name,看看有没有匹配的,有匹配那么就读取该虚拟主机的配置
4)拿到index.html文件后,就开始解析,遇到了js/css/image等静态资源时候,就向服务器区请求下载,(静态资源在上一次没有修改的时候会返回304状态码(表示没有修改,浏览器直接读取本地的资源缓存文件)。
2,http1.1新特性
默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
3,http优化
- TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
- 内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
- SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
相关的状态码查询:https://segmentfault.com/a/1190000013271378#articleHeader9
4,get和post
1)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
2 )GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !参数保留在浏览器历史中。
3)比如一个网页地址是:
http://www.taobao.com?itemId=123
你把它发给朋友,说这个东西很酷!这就是用get来获取数据最正确的方式,它有利于传播。
但如果你用post请求获取到一个商品页面,url还是
http://www.taobao.com
那你把这个url分享给朋友是没有意义的。
反过来说,如果你用
http://www.weibo.com?uid=1&content=haha&token=xxxxxxxxxx
来发一条内容为haha的微博,并且这个url被其他人看到了。
那他直接把url在他那儿复制一下就可以帮你发微博了,是不是也很不合理?
比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
参考:https://www.zhihu.com/question/28586791
5,https
也就是在HTTP上又加了一层处理加密信息的模块
SSL协议主要确保几件事情:
-
服务器认证:客户端知道他们是在和真正的服务器通话;3
-
客户端认证:服务器知道他在和真正的客户端通话;5
-
完整性:客户端和服务器之间传输的信息不会被篡改;
-
加密:客户端和服务器之间的对话是私密的,无需担心被窃听;7
1,客户端发出https请求
2,采用https协议的服务器有有一套数字证书,可以自己制作,也可以申请,有一套公钥和私钥
3,传递证书,就是公钥,包括证书的颁发机构,过期时间,
4,客户端解析证书,验证公钥是否有效,没有问题的话生成一个随机值(后面用来对称加密),用证书(公钥)把他加密
5,传递加密信息
6,服务端用私钥解密后,得到客户端传过来的随机值,用随机值使用对称加密
7,传输加密后的信息
8,客户端用随机数加密信息
6,加密和签名
对称加密中有私钥和公钥,公钥和私钥是成对的,它们互相解密。签名的时候,用私钥加密,
公钥解密,就能保证我是“我”发出的
7,jwt
https保证了传输中的安全,jwt是在应用层面的安全
资料:https://www.cnkirito.moe/jwt-learn-3/