Q:当浏览器中输入一个网址后按下回车,发生了什么。
(1) DNS域名解析:浏览器缓存→系统缓存→路由器→ISP(互联网提供商,如移动,电信之类的)的DNS服务器→根域名服务器(面向全球的顶级DNS服务器)。如果走到最后,还是没有,则说明这个域名没有被注册。另外,域名的解析顺序是从后往前。比如“www.mp3.baidu.com” 先解析的是.com,然后去管理.com寻找.baidu,最后才是找.mp3
所以域名结构为:三级域名.二级域名.一级域名。
(2) 与IP地址对应的服务器建立TCP连接,经历三次握手:SYN(请求),ACK+SYN(应答),ACK(再确认)
第一次握手:客户端首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示客户端自己的初始序号(seq = 0 就代表这是第0号帧),这时候客户端进入syn_sent状态,表示客户端等待服务器的回复。
第二次握手:服务器监听到连接请求报文后,如同意建立连接,则向客户端发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个帧),seq = y 表示服务器自己的初始序号(seq=0就代表这是服务器这边发出的第0号帧)。这时服务器进入syn_rcvd,表示服务器已经收到客户端的连接请求,等待客户端的确认。
第三次握手:客户端收到确认后还需再次发送确认,同时携带要发送给服务器的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个帧),客户端自己的序号seq= x + 1(表示这就是我的第1个帧,相对于第0个帧来说的),一旦收到客户端的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了
(3) 以get,post方式发送HTTP请求,get方式发送主机,用户代理、connection属性,cookie等(获得html代码)
client发送请求 (浏览器)→ server用80端口接受请求(服务器)
server响应请求(发送页面)→client负责下载响应页面 (拿到html的代码)
HTTP作用是浏览器和服务器进行沟通
GET / HTTP/1.1 //HTTP版本 get发起请求
Host: www.baidu.com //请求的地址
User-Agent: curl/7.54.0 //用的什么软件.什么版本
Accept: */* //接受返回的任何内容
ps:HTTP1.0协议和 HTTP1.1协议区别。
1.0协议,客户端与web服务器建立连接后,只能获取一个web资源
1.1协议,客户端与web服务器建立连接后,在一个连接上获取多个web资源
(4) 浏览器拿到代码后,开始解析HTML代码,并请求HTML代码中的资源。
浏览器拿到代码后,开始解析,如果遇到JS/CSS/Image等静态资源,就像服务器端去请求下载。
浏览器在请求静态资源的时候,回向服务器发起一个http请求,询问自从上次修改时间到现在有没有对资源进行修改,如果服务器端返回304状态码(告诉浏览器没有修改)那么浏览器会直接读取本地该资源的缓存文件。
(5) 浏览器对页面进行渲染,呈现给用户。
(6) 传输完成,断开四次挥手
断开可以是客户端发起,也可以服务器发起。现在假设是客户端发起。
第一次挥手 :客户端发送FIN报文,告诉服务器,我不会给你发数据了。(如果在FIN包之前发送出去的数据,如果没有收到确认的ack报文,客户端会依然重发。)但是这个时候,客户端还是可以接受数据。
第二次挥手:服务器端收到FIN报文后,如果还有数据没法玩,则不着急关闭,可以继续发送。所以服务器先发送SCK,告诉客户端,我已经收到你的请求了,但是还没准备好,请继续等待停止的消息。这个时候客户端就进入了 FIN_WAIT的状态,等待服务器端的FIN报文。
第三次挥手: 当服务器端 确定数据发送完成了,则像客户端发送FIN报文,告诉他,这边数据发完了,可以关闭连接了。
第四次挥手:客户端接收到FIN报文后,知道可以关闭连接了,但是他还是会发送一个ACK报文,进入一个TIME_WAIT状态。服务器端接收到ACK后,就知道可以断开连接,就会断开连接。客户端等了2MSL后没有收到回复,则证明了服务器端正常关闭,则客户端也会关闭连接。至此,TCP连接就完全关闭了。