1.输入url地址
在我们输入url地址的适合,浏览器就会根据自身本地缓存匹配可能的url值,让你选择
2. 域名解析,获取IP
域名只是为了便于我们记忆的,所以浏览器首先要做的就是解析域名,转换为IP,所以发起请求之后,首先就是查找域名对应的IP。
a.本地hosts匹配
它会优先查找本地的hosts
(windows:C:\Windows\System32\drivers\etc\hosts,Linux:/etc/hosts)文件看下是否有对应的IP,如果本地没有找到对应的IP地址,浏览器会发出一个 DNS请求到本地DNS服务器 。
b.本地dns缓存解析
本地DNS服务器一般都是你的网络接入服务器商提供,比如电信等。本地DNS服务器收到请求之后,首先会查找DNS缓存,如果缓存中有,则直接返回,没有则向本地DNS服务器还要向DNS根服务器进行查询。
c.远程dns解析获得服务器ip地址
先向DNS根服务器查询,如果DNS根服务器无法找到对应的IP,则告诉本地DNS服务器,域服务器的地址,让本地DNS服务器去域服务器查询IP地址,本地DNS服务器请求域服务器之后,域服务器告诉本地DNS服务器域名解析服务器的地址,然后本地DNS服务器向域名解析服务器请求,获得IP并缓存起来。
3. 向服务器发起HTTP请求
拿到域名对应的IP之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(Apache,Nginx等)80端口发起TCP的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。
TCP连接建立过程
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。
位码即TCP标志位,有6种标示:SYN(synchronous发起一个新连接) ACK(acknowledgement 确认) PSH(push接收方应该尽快将这个报文交给应用层) FIN(finish释放一个连接) RST(reset重置连接) URG(urgent紧急)
TCP三次握手
1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
2.第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number(ack)为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3.第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
TCP四次挥手
1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2.第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3.第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
为什么建立连接是三次握手,而关闭连接是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送
4. 服务器返回一个永久重定向响应
服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.google.com/” 而非“http://google.com/”。
为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。
5. 浏览器跟踪重定向地址
现在浏览器知道了 “http://www.google.com/"才是要访问的正确地址,所以它会发送另一个http请求。
6. 服务器处理请求
7. 服务器返回一个 HTTP 响应
8. 浏览器显示 HTML
本文档作为个人学习笔记之用,有理解不当之处,欢迎指正。
参考文档