前几天面试的时候,面试官问了我这样一个问题:比如百度,访问一个网址的流程是怎么样子的。
我支支吾吾的只说出了一个三次握手,四次挥手。面试官对我的面试很不满意,于是没有拿到复试资格。
于是回家之后发奋图强,查阅了很多资料,自己总结了一下访问一个网站的流程。
简单地来说过程可以总结是:
DNS协议进行域名解析 —> 建立tcp协议三次握手过程 —> 客户端发出访问网站相应页面请求(发出http协议请求报文)—> 服务端发出相应访问页面请求信息 (发送http)---->断开tcp协议四次挥手过程
一步一步来拆开看
DNS协议进行域名解析。比如csdn的网站,我们在访问的时候输入的是www.csdn.net,但是dns会把这个网站解析成ip地址,csdn解析完之后是39.96.252.213。解析完之后就知道csdn服务器在哪里了,那么怎么找到他呢?有两种方式:1.递归查询 2.迭代查询
这两种查询方式的主要区别就是DNS服务器的动作。
我们来看一下他们的解释说:1、 递归查询:由DNS客户端发起,一级一级的向上提交查询申请,直至查询终止。2. 迭代查询:一般情况下由DNS服务器之间完成,即本地DNS向上一级DNS提交查询,上级DNS并不直接返回查询结果,而是告知DNS应该向哪里去查找。
可以理解成小蝌蚪找妈妈,小蝌蚪去找的时候,向他们的上级问:你知道我妈妈在哪里吗?递归查询的做法就是:你在这坐着,等我问问我领导。然后一点一点的向上问,最终得到个结果:你妈妈在大西洋呢,去吧。而迭代查询的就是:我问问你该去找哪个领导。然后告诉你:在xx领导那里,快去问问他吧。然后让你跑断腿。
但是在真正的dns查询过程中,是要有两者并存的。无论哪一种查找方式需要用到两者并行。在每一个环节,都会先查找缓存。如果dns服务器没有了缓存就没有了意义,查找顺序是这样的
HOSTS–>本地DNS -->上层DNS(包括根DNS)
建立tcp协议三次握手过程:

tcp为什么要搞得这么麻烦,因为tcp协议的作用:保证数据的完整性和可靠性,防止丢包。
那么再一步一步来看,这个三次握手。每一次都干了啥,里面色syn,seq,ack都是什么意思。
(1).clent----->server ///client发送建立tcp连接的一个请求报文,其中seq是序列号,随机生成,syn是报文中的一个字段,设置成1,代表着我想要建立tcp连接。
(2).server----->cilent ///server回应你的请求,server重新生成一个seq,回应报文的字段syn、ACK(验证字段)同样也设置为1,还产生ack控制字段,ack = x+1,确定自己的tcp建立请求得到了确认
(3).client----->server /// seq = x+1 ,ACK = 1 ,ack = y+1
客户端发送访问网站响应该页面请求(发送http协议请求报文)
1.请求行:
请求的方法(get post)
请求的默认信息(默认请求index.xml首页文件)
请求http协议版本(tcp协议分为长连接http1.1)和短连接(http1.0)
2.请求头
3.请求空行
4.请求主体,get方法没有请求主体内容 post方法会有请求主体信息
服务器发送相应访问页面的请求信息(发出http响应报文)
1.起始行(相应行)
http协议版本信息
相应的状态码信息
响应状态码说明信息
2.响应头部
3.空行:
4.相应主体内容:一般为html,js等等代码信息
tcp协议四次分手过程

最后的就走就到了四次挥手了。我们再来拆解这个四次挥手:
第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
5229

被折叠的 条评论
为什么被折叠?



