第一步:域名解析
第二步:建立TCP连接
第三步:发起HTTP请求
第四步:服务器响应HTTP请求,浏览器得到html代码
第五步:浏览器解析html代码,渲染网站
域名解析
1.浏览器会先在自身DNS域名缓存中寻找url
2.如果没有,就会找Window系统自身的DNS缓存
3.再没有, 系统会检查本地hosts是否存在域名映射(Host文件在C盘中,用来保存常用网站对应的IP地址)
4.还是没有,浏览器就会发起DNS系统调用,像本地运营商发起域名解析请求,找到域名注册商提供的DNS地址。
一般如上步骤走过后, 就能找到域名所对应的IP地址并就行链接。
(DNS是域名系统协议, 用于域名和IP地址的相互转换)
建立TCP连接
TCP协议是一个有保障的协议,会进行三次挥手。
第一次挥手:Client将发送一个SYN包和随机序列号A, 进入SYN_SENT 状态
第二次挥手: 服务端收到后,会回复SYN-ACK包,以及一个A+1用来确认, 同时发送一个随机序列号B
第三次挥手: 客户端收到后会再发一个ACK包以及A + 1, B + 1给服务端
为什么需要三次挥手:
假设是两次挥手的情况:
A发送 "我想跟你讲话 ", 结果这条信息因为某些原因被滞留了, 过了一天才到达B, 这时候B回复 "好的, 开始建立链接 ”,可是由于A只想在一天前跟B讲话,就算B建立了链接, A也不会发数据了。这样,作为B,服务器端就白白浪费了很多资源。
因此,第三次挥手确保了这一信息的即时性,B浪费资源建立连接白白等待A
四次分手

为什么要四次分手
TCP协议是一种可靠的运输协议,是全双工模式,双方必须都确定不再发送,不再接受数据。第一次挥手的时候, A 告诉 B, 不再给他发消息了,B说知道了,但A还是能接受B的消息, B关闭了接受A的消息。然后B告诉A,我不再给你发消息了,A说知道了,于是乎,B不再给A发消息了,A关闭了接受B的消息。
发送http请求
HTTP的特点是,无连接无状态,每次只处理一个请求。

通常用的三种请求方法是:
GET: 请求获取Request-URl中标识的资源
POST: 新创建资源,在Request-URI后附加新的数据
PUT: 更新资源, 后面更新资源的地址。
DELETE: 请求服务器删除Request-URI所标识资源
这里,不得不提到RESTful API了,即Representational State Transfer.
Representation 是表现,会把一种资源,或者一种请求,表现出来
State Transfer 则指的是服务器端的状态转化。
所以可以理解为:通过单一的URl,单一的请求,让服务器的一种状态发生转化。
通常,representation代表的是名词,所以RESTful URI中不应该有动词。
用RESTful的好处:
每个URI都是单独的一次请求操作,没有说URI中有多种操作。
作为服务端来讲, 不需要解析URI(如果其中包含多个操作), 并且服务器可以无状态运行,可伸展性强。
服务器响应HTTP请求
接下来用Java的Spring框架为例子, 走一遍服务器响应HTTP请求。
首先, Spring框架中的filter会过滤掉一些恶意的URI, 详情可以看
XSS 网页攻击
https://www.jianshu.com/p/05aa942718ea
接着, 根据MVC的思想,每一个controller对一个域名, spring会根据URL mapping从controller中调用GET,POST,DELETE,PUT的函数。
然后这一函数又会向下走,调用service层,接着service层调用DAO层的函数,进行数据的获取或者存放。
最后,controller中的函数会返回一个结果,首先通过view resolver把jsp file和数据整合,生成html 返还给浏览器,然后浏览器进行渲染。
网友评论