
1.在浏览器中输入网址
浏览器会从历史记录、书签等地方通过已输入的字符串自动匹配url,给出智能提示,可以补全url。
对于chrome浏览器,甚至会从缓存中把网页展示出来。
2.浏览器到DNS查找域名对应的IP地址
首先查找本地的hosts文件是否有对应ip地址。
如果没有,浏览器会发出dns请求到本地dns服务器,本地dns服务器一般为网络接入服务商,如中国移动。
请求到达本地dns服务器后,本地dns服务器会首先查询缓存记录,若有直接返回结果,否则本地dns服务器向dns根服务器进行查询。
根dns服务器没有记录域名和ip对应关系,而是告诉dns服务器可以到域服务器上继续查询,并给出域服务器的地址。
com域服务器收到请求之后,告诉本地dns服务器,你的域名的解析服务器的地址
本地dns服务器向域名的解析服务器发出请求,这时才能收到一个域名和ip的对应关系。
本地dns服务器把ip地址返回给用户电脑,并且把对应关系保存到缓存中,以备下次查询。
3. 浏览器打开TCP连接,向该IP的服务器发送一条HTTP请求(包含三次握手阶段)
浏览器以一个随机端口(1024<端口<65535)向服务器的web程序(如nginx)80端口发起tcp连接请求。
连接请求到达服务器端后,进入到网卡,然后进入到内核的tcp/ip协议栈,还有可能经过防火墙的过滤,最终到达web程序建立tcp/ip连接
发起一个http请求(包括请求行、请求头、请求体)
如果浏览器存储了该域名下的cookie,那么cookie也会放入http请求中
4. 服务器给浏览器进行一个301永久重定向响应
浏览器会访问www.google.com而不是google.com
重定向原因:
网站调整(如盖面网页目录结构)
网页被移到一个新地址。
网页扩展名改变(如.php改成.html .shtml)
移到新地址原因:一个原因是和搜索引擎排名有关,其他原因是用不同地址会造成缓存友好性变差
5. 浏览器根据重定向地址再次进行HTTP请求。
浏览器向正确地址发送一个http请求
6. 服务器分析HTTP请求,生成HTTP响应,将响应发给客户端。
服务器收到并处理请求,返回一个http响应(http响应和http请求类似)
7. 浏览器现实html,生成主页框架
8. 对于静态的页面内容,浏览器通常进行缓存,对于动态的内容通常不缓存,缓存的时间也是有期限的。
9. 浏览器向服务器发送异步请求,因为有些页面显示完成之后客户端仍需要与服务端保持联系。
10.整个过程结束之后,关闭tcp连接。
因为TCP是全双工的,所以客户端和服务端都可以先进行挥手。
小知识点:
三次握手也就是发送三次请求连接的报文才能连接。四次挥手也就是发送四次报文请求才能断开连接。
三次握手目的:防止已失效的连接请求报文突然又传送到了服务端,因而产生了错误。
为什么建立连接是三次,而关闭却是四次呢?
因为服务端在listen状态下,建立连接时:syn和ack放在一个报文发送给客户端,关闭连接时ack和fin一般都会分开发送。
三次握手:
第一次握手:客户端向服务器端发送连接请求包SYN(syn=j),等待服务器回应;
第二次握手:服务器端收到客户端连接请求包SYN(syn=j)后,将客户端的请求包SYN(syn=j)放入到自己的未连接队列,此时服务器需要发送两个包给客户端;
(1)向客户端发送确认自己收到其连接请求的确认包ACK(ack=j+1),向客户端表明已知道了其连接请求
(2)向客户端发送连接询问请求包SYN(syn=k),询问客户端是否已经准备好建立连接,进行数据通信;
即在第二次握手时服务器向客户端发送ACK(ack=j+1)和SYN(syn=k)包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服务器同意建立连接,此时需要发送连接已建立的消息给服务器;
向服务器发送连接建立的确认包ACK(ack=k+1),回应服务器的SYN(syn=k)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
ACK(ack=k+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。

四次挥手:
第一次挥手:Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭(Socket),可以继续发送数据。
第二次挥手:server发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续等我的消息"。
wait:这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
第三次挥手:当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。
第四次挥手:Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

| TCP | Transmission Control Protocol | 传输控制协议 |
| ACK | acknowledgement | 确认字符 |
| SEQ | Sequence number | 顺序的 |
| SYN | synchronize sequence numbers | 同步序列编号 |
| FIN | finsh | 结束标志 |
浙公网安备 33010602011771号