问题盘点

客户端访问一个页面的全过程

整体过程分为五个部分:

1.DNS域名解析成IP地址;

(链接:https://www.nowcoder.com/questionTerminal/f09d6db0077d4731ac5b34607d4431ee?pos=146&orderByHotValue=0
来源:牛客网
 

主要考察五层协议栈的理解
1、应用层:DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输

2、运输层:HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作

3、网络层:为数据包选择路由,IP协议进行主要工作

4、数据链路层:相邻结点的可靠传输,ARP协议将IP地址转成MAC地址。

链接:https://www.nowcoder.com/questionTerminal/f09d6db0077d4731ac5b34607d4431ee?pos=146&orderByHotValue=0
来源:牛客网
 

事件顺序

(1) 浏览器获取输入的域名www.baidu.com

(2) 浏览器向DNS请求解析www.baidu.com的IP地址

(3) 域名系统DNS解析出百度服务器的IP地址

(4) 浏览器与该服务器建立TCP连接(默认端口号80)

(5) 浏览器发出HTTP请求,请求百度首页

(6) 服务器通过HTTP响应把首页文件发送给浏览器

(7) TCP连接释放

(8) 浏览器将首页文件进行解析,并将Web页显示给用户。

2.与目的主机进行TCP连接(三次握手);

3.发送与接收数据(浏览器与目的主机开始HTTP访问过程);

4.浏览器解析HTML代码并请求代码中资源,浏览器对页面渲染呈现页面;

5.与目的主机断开TCP连接(四次挥手)。

下面对每一个过程进行分别说明:

DNS域名解析过程如下:

  • 在客户端缓存查找域名对应的IP:浏览器缓存--->系统缓存(Hosts文件)--->路由器缓存
  • ISP DNS缓存:在(电信)的DNS缓存服务器中寻找;
  • 根域名服务器:全球13台(1主12辅),根域名收到请求后会查找区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;
  • 顶级域名服务器:顶级域名服务器收到请求后查看区域文件记录,若无则将管辖范围内主域名服务器的IP地址告诉本地DNS服务器;
  • 主域名服务器:主域名服务器接收到请求后查找自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录;
  • 保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与服务器建立连接。

三次握手过程如下: 

TCP首部:20字节,全双工,占用2个计算机之间的通信线路,知道它被一方或双方关闭为止

IP地址:唯一标识主机

TCP协议+端口号:唯一标识主机中的一个进程

IP地址+协议+端口号(socket):网络中的唯一进程 

先来介绍一下常用的标识:

seq:序号,TCP中传送的字节流中的每一个字节都要按顺序去编号,例如一段报文的序号字段值为107,而带有数据100字段,下一段不出意外序号会从207开始。

ack:确认号,期望收到对方下一个报文的第一个数据字节的序号。例如,B收到A收到的报文,序列号字段301,数据长度200字节,B收到序号到500的字节,所以B期望收到A下一个发送过来报文的ack为501,于是B发送给A的ack=501。

offset:数偏移,由于头部有可选字段,长度不固定,因此它指出TCP报文的数据距离TCP报文的起始处有多远

reserve:保留,目前为止标位0

TCP控制位(重要的):

  • ACK:确认位,只有当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1;
  • SYN:同部位,SYN=1表示这是一个连接请求或连接接收报文。SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1;
  • FIN:终止位,用来释放一个连接。FIN=1表明此报文段的发送方的数据已经发送完毕,并要求释放传输连接。

三次握手:

一开始Client和Server都处于Closed状态,假设Client主动打开连接(客户端向服务器端发送TCP连接请求)

1.Client将标志位SYN置为1,随机产生一个值seq=x(序号),并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认(这个过程中ACK=0,不写出);

2.之前Server处于Listen状态,在收到数据包后由SYN=1知道是Client在请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1表示期望下次收到Client发过来的序列号为x+1,并随机生成一个自己的seq=y,并将该数据包发送给Client以确认连接请求,然后Server进入SYN-RCVD状态;

(两步都要检查ACK  ack↓)

3.Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server之间可以开始传输数据了。

发送与接收数据(浏览器和目的主机开始HTTP访问过程)过程如下:

1.TCP连接建立成功后,客户端向WEB服务器发送请求(get/post),GET 路径/文件名 HTTP/1.0 ; 例如:GET /mydir/index.html HTTP/1.0

2.web服务器收到请求并处理请求,将从它的子目录中搜索index.html文件,如果找到该文件,web服务器把该文件内容传送给相应的web浏览器

3.为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(应答码/状态码)

浏览器解析HTML,并且请求HTML中需要的数据,然后渲染HTML页面,渲染过程如下:

浏览器得到HTML代码之后:

1.解析HTML代码,构建DOM树(document)

2.将DOM树和Css样式进行附着构建呈现树

3.布局:计算每个呈现树节点的大小和位置信息

4.绘制:背景颜色,背景图片,边框,子呈现树节点,轮廓(按顺序绘制)

四次挥手过程:

1.Client将标志位FIN=1, 生成seq = u(u为前面传输的数据最后一个序号+1),将报文发送给Server,Client进入了FIN-WAIT-1状态;

2.Server收到FIN后,将ACK置为1,ack=u+1,带上序列号seq=v,将报文发给Client,进入CLOSE-WAIT状态;

3.Client收到ACK,进入FIN-WAIT-2状态,等待Server发送释放连接报文并且将未发送完的数据都发送完

4.Server将最后的数据发送完,想Client发送一个FIN=1,ack=u+1,此时序列号假设为seq=w,发送报文,Server进入LAST-ACK状态,等待Client确认;

5.Client收到Server的报文,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时Client进入TIME-WAIT状态,等待时间为2MSL(最长报文寿命)

6.Server收到Client发出的确认,立即进入CLOSED状态。结束TCP连接

TIME-WAIT(2MSL)为什么?

①确保有足够的时间让对端收到ACK,被动关闭那段未收到ACK则触发被动端重发FIN,一来一去刚好是2MSL

②防止新旧连接混淆

为什么四次挥手?

因为TCP是全双工,发送方和接收方都需要finish报文和ACK报告,所以发送方和接收方各两次即可,但一方是被动的,所以则需要四次。

 

以上,是客户端访问一个页面的全过程。

 

GET和POST的区别(在web专题写过,这里简写) 

1.传送方式:get是通过地址栏传送,post是通过报文传输;

2.传送长度:get参数有长度限制一般为1024byte,post无限制2M;

3.安全性:get方式的安全性低,post安全性高(如果包含机密信息建议用post);

4.用途:get一般用于数据查询,post一般用于数据添加、修改、删除。

 

TCP和UDP的区别:

 1.TCP有连接,可靠  //  UDP无连接,不可靠

2.TCP面向字节流,提供可靠的交付服务,数据无差错、不丢失、不重复且有序  //  UDP面向报文,无拥塞控制,无连接状态,适用于媒体通信

3.TCP只支持点对点通信(一对一,全双工) //  UDP支持一对一、一对多、多对多的通信

4.TCP首部最低20字节(重量级) //  UDP首部开销小(8字节)轻量级

 

HTTP和HTTPS:

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPs的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道来保证数据传输的安全;另一种就是确认网站的真实性。

HTTP 和 HTTPS的区别主要如下:

(1)https协议需要到ca申请证书,一般免费的证书比较少,因此需要一定的费用

(2)http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议。

(3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443

(4)http的连接很简单,是无状态的;https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议要安全。