访问Web通讯过程(http/tcp传输全过程,三次握手、请求、数据传输、四次挥手)

从输入域名到最后呈现经历的过程:

域名解析 --> 
发起TCP的3次握手 -->
创建TCP链接后发起http请求 -->
服务器响应http请求,浏览器获得html代码 -->
浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) -->
浏览器对页面进行渲染呈现给用户 -->
四次挥手结束

1.域名解析

首先浏览器会解析 www.zipackage.com 这个域名对应的IP地址。
① 浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),
看自身的缓存中是否有www.zipackage.com 对应的条目,并且没有过时,若是有且没有过时则解析到此结束。
② 若是浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操做系统自身的DNS缓存,若是找到且没有过时则中止搜索解析到此结束.
③ 若是在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),
看看这里面有没有该域名对应的IP地址,若是有则解析成功。
④ 若是在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,
就会向本地配置的首选DNS服务器(通常是电信运营商提供的)发起域名解析请求(经过的是UDP协议向DNS的53端口发起请求,
这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给咱们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,
找到对应的条目,且没有过时,则解析成功。
若是没有找到对应的条目,则有运营商的DNS代咱们的浏览器发起迭代DNS解析请求,
它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),找到根域的DNS地址,就会向其发起请求

(请问www.zipackage.com这个域名的IP地址是多少啊?)
根域发现这是一个顶级域com域的一个域名,
因而就告诉运营商的DNS我不知道这个域名的IP地址,可是我知道com域的IP地址,你去找它去,
因而运营商的DNS就获得了com域的IP地址,又向com域的IP地址发起了请求

(请问www.zipackage.com这个域名的IP地址是多少
?),
com域这台服务器告诉运营商的DNS我不知道www.zipackage.com这个域名的IP地址,可是我知道zipackage.com这个域的DNS地址,你去找它去,
因而运营商的DNS又向zipackage.com这个域名的DNS地址(这个通常就是由域名注册商提供的,像万网,新网等)发起请求

(请问www.zipackage.com这个域名的IP地址是多少?)
这个时候zipackage.com域的DNS服务器一查,
诶,果然在我这里,因而就把找到的结果发送给运营商的DNS服务器,
这个时候运营商的DNS服务器就拿到了www.zipackage.com这个域名对应的IP地址,
并返回给Windows系统内核,内核又把结果返回给浏览器,
终于浏览器拿到了www.zipackage.com 对应的IP地址,该进行一步的动做了。

2.发起TCP的3次握手

拿到域名对应的IP地址以后,User-Agent(通常是指浏览器)
会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(经常使用的有httpd,nginx等)80端口发起TCP的链接请求。
这个链接请求(原始的http请求通过TCP/IP4层模型的层层封包)到达服务器端后(这中间经过各类路由设备,局域网内除外),进入到网卡,
而后是进入到内核的TCP/IP协议栈(用于识别该链接请求,解封包,一层一层的剥开),
还有可能要通过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序。
1) Client首先发送一个链接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个链接请求或链接接受报文,
同时表示这个数据报不能携带数据,seq = x 表示Client本身的初始序号(seq = 0 就表明这是第0号帧),
这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到链接请求报文后,如赞成创建链接,则向Client发送确认。
TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示指望收到对方下一个报文段的第一个数据字节序号是x+1
同时代表x为止的全部数据都已正确收到(ack=1实际上是ack=0+1,也就是指望客户端的第1个帧),
seq = y 表示Server 本身的初始序号(seq=0就表明这是服务器这边发出的第0号帧)。
这时服务器进入syn_rcvd,表示服务器已经收到Client的链接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(表明指望收到服务器的第1个帧),
Client本身的序号seq= x + 1(表示这就是个人第1个帧,相对于第0个帧来讲的),一旦收到Client的确认以后,
这个TCP链接就进入Established状态,就能够发起http请求了。

3.创建TCP链接后发起http请求

进过TCP3次握手以后,浏览器发起了http的请求(第4帧),使用的http的方法 GET 方法,协议是HTTP/1.1

4.服务器端响应http请求,浏览器获得html代码

服务器端WEB程序接收到http请求之后,就开始处理该请求,处理以后就返回给浏览器html文件。

 

前面3个tcp包为3次握手的过程,主机向服务器发送一个http应用请求,服务器收到请求后,返回一个tcp确认帧(第5帧),
接着发送一个http应答给主机(载有实际数据,第6,7帧,因为数据较大,分红多个包传输),
主机收到服务器的http应答数据后,又发送一个tcp确认帧(第8帧),确认收到了数据,反复进行传输,应答,直到全部数据传输完成(6到18帧)。 第4号包是http请求包,第19号包是http响应包

如下是数据传输包含的内容:

5. 浏览器解析html代码,并请求html代码中的资源

浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,
每一个浏览器的线程数不同),这个时候就用上keep-alive特性了,创建一次HTTP链接,能够请求多个资源,下载资源的顺序就是按照代码里的顺序。 浏览器在请求静态资源时(在未过时的状况下),向服务器端发起一个http请求(询问自从上一次修改时间到如今有没有对资源进行修改),
若是服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。
HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器创建链接后,只能得到一个web资源。
HTTP1.1协议,容许客户端与web服务器创建链接后,在一个链接上获取多个web资源。

6.浏览器对页面进行渲染呈现给用户

浏览器利用本身内部的工做机制,把请求到的静态资源和html代码进行渲染,渲染以后呈现给用户。

7.传输完成,断开四次挥手

断开链接端能够是Client端,也能够是Server端。假设Client端发起中断链接请求:
第一次挥手:客户端先发送FIN报文(第24帧),用来关闭主动方到被动关闭方的数据传送,也就是客户端告诉服务器:
我已经不会再给你发数据了(固然,在fin包以前发送出去的数据,
若是没有收到对应的ack确认报文,客户端依然会重发这些数据),但此时客户端还能够接受数据。
第二次挥手:Server端接到FIN报文后,可是若是还有数据没有发送完成,则没必要急着关闭Socket,能够继续发送数据。
因此服务器端先发送ACK(第25帧),告诉Client端:请求已经收到了,可是我还没准备好,请继续等待中止的消息。
这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
第三次挥手:当Server端肯定数据已发送完成,则向Client端发送FIN报文(第26帧),告诉Client端:服务器这边数据发完了,准备好关闭链接了。
第四次挥手:Client端收到FIN报文后,就知道能够关闭链接了,可是他仍是不相信网络,因此发送ACK后进入TIME_WAIT状态(第27帧), Server端收到ACK后,就知道能够断开链接了。Client端等待了2MSL后依然没有收到回复,则证实Server端已正常关闭,最后,Client端也能够关闭链接了至此,TCP链接就已经彻底关闭了!
相关文章
相关标签/搜索