抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

OSI参考模型

从下往上分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。其中

物理层在通信信道中传输原始比特流。

数据链路层进行物理寻址,并且将原始比特流转化为逻辑链路。

网络层进行路由选择和分组转发。

传输层建立端到端的数据链接。

会话层在用户间建立和管理会话,

表示层进行数据格式转化和数据加密。

应用层为应用程序提供服务。

TCP/IP网络模型

链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
网络层:负责路由以及把分组报文发送给目标网络或主机。
传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。

HTTP请求/响应的步骤

  1. 用户在浏览器地址栏输入URL,URL由协议、域名、端口号、文件路径组成,没有文件路径的时候,就会访问根目录下的默认文件,例如index.html
  2. 浏览器检查本地缓存是否有该域名对应的IP地址。如果缓存中没有,浏览器会通过递归方式请求本地DNS服务器、本地DNS服务器通过迭代方式请求根域名服务器、顶级域名服务器、权威域名服务器等,最终将IP地址返回给客户端,这个过程中浏览器、操作系统、各级DNS服务器都会先查看本地缓存,没有记录再去查询
  3. 浏览器通过IP地址和端口号与服务器建立TCP连接。也就是”三次握手“过程,如果是HTTPS协议,还会进行TLS/SSL握手,确保通信安全。
  4. 浏览器向服务器发送HTTP请求,请求头中包含浏览器信息、支持的编码格式、Cookie等。服务器接收到请求后,根据路径和参数处理请求,生成响应内容。
  5. 服务器将响应数据和HTTP状态码返回给浏览器。响应头中包含内容类型、缓存策略等信息。
  6. 览器接收到响应后,开始解析HTML文件。解析过程中,浏览器会加载HTML中的CSS、JavaScript、图片等资源。浏览器构建DOM树、CSSOM树,合并生成渲染树,最后进行布局和绘制,将页面显示在屏幕上。
  7. 当所有资源加载完毕,页面完全渲染后,浏览器触发load事件,页面加载完成。
  8. TCP连接关闭(四次挥手)

在浏览器中输入URL到显示页面涉及到哪些协议?

浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,

DNS服务器是基于UDP的,因此会用到UDP协议。

得到IP地址后,浏览器就要与服务器建立一个http连接。因此要用到http协议。

http生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。

然后会发送给IP层,用到IP协议。IP层通过路由选路,一跳一跳发送到目的地址。

当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP),

以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。

HTTP 的 5 种方法

GET—获取资源
POST—传输资源
PUT—更新资源
DELETE—删除资源
HEAD—获取报文首部

POST请求和GET请求

  • GET传递的参数在url后拼接,不安全。POST传递的参数在request body中,更安全。

  • GET对数据进行查询,POST主要对数据进行增删改!

  • GET在浏览器回退时是无害的,而POST会再次提交请求

  • GET请求会被浏览器主动缓存,POST不会,要手动设置

  • GET请求长度有限制,POST没有

HTTP报文的组成成分

请求报文{ 请求行、请求头、空行、请求体 }

响应报文{ 状态行、响应头、空行、响应体 }

Request Header:
GET /sample.Jsp HTTP/1.1 //请求行:{http方法、页面地址、http协议、http版本}
Host://请求的目标域名和端口号
Origin: //请求的来源域名和端口号 (跨域请求时,浏览器会自动带上这个头信息)
Referer: //请求资源的完整URI
User-Agent: //浏览器信息
Cookie: 当前域名下的Cookie
Accept: //代表客户端希望接受的数据类型
Accept-Encoding: //代表客户端能支持的压缩格式
Accept-Language://代表客户端可以支持的语言
Connection: keep-alive //告诉服务器,客户端需要的tcp连接是一个长连接

Response Header:
HTTP/1.1 200 OK // 响应状态行:{http协议、http版本 响应码 状态}
Date: //服务端发送资源时的服务器时间
Expires: //比较过时的一种验证缓存的方式,与浏览器(客户端)的时间比较,超过这个时间就不用缓存(不和服务器进行验证),适合版本比较稳定的网页
Cache-Control: // 控制缓存的方式
etag: // 一般是Nginx静态服务器发来的静态文件签名,浏览在没有“Disabled cache”情况下,接收到etag后,同一个url第二次请求就会自动带上“If-None-Match”
Last-Modified://是服务器发来的当前资源最后一次修改的时间,下次请求时,如果服务器上当前资源的修改时间大于这个时间,就返回新的资源内容
Content-Type: text/html; charset=utf-8 //如果返回是流式的数据,我们就必须告诉浏览器这个头,不然浏览器会下载这个页面,同时告诉浏览器是utf8编码,否则可能出现乱码
Content-Encoding: gzip //告诉客户端,应该采用gzip对资源进行解码
Connection: keep-alive //告诉客户端服务器的tcp连接也是一个长连接

http 和 https 的区别?

• http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
• https 协议需要 ca 证书,费用较高。
• http 协议的端口为 80,https 的端口为 443。
• http 的连接很简单,是无状态的。

三次握手

  1. 一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口(HTTP默认端口号80,HTTPS默认端口号是443),处于LISTEN状态
  2. 然后客户端主动发起连接SYN,之后处于SYN-SENT状态。
  3. 服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态
  4. 容户端收到服务端发送的SYN和ACK之后,发送对SYN确认的ACK,之后处于ESTABLISHED状态。
  5. 服务端收到ACK的ACK之后,处于ESTABLISHED状态

TCP 四次挥手

  1. 客户端进程发出连接释放报文,进入FIN-WAIT-1状态,并且停止发送数据。服务器收到连接释放报文,发出确认报文, 此时,服务端就进入了CLOSE-WAIT状态。这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  2. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  3. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,此时,服务器就进入了LAST-ACK状态,等待客户端的确认。
  4. 客户端收到服务器的连接释放报文后,必须发出确认,此时,客户端就进入了TIME-WAIT状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。可以看到,服务器结束TCP连接的时间要比客户端早一些。

Cookie、sessionStorage、localStorage 的区别

相同点:存储在客户端
不同点:

  • sessionStorage和localStorage的存储比cookie大得多
  • cookie设置的过期时间之前一直有效;localStorage永久存储,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage数据在当前浏览器窗口关闭后自动删除
  • cookie的数据会自动的传递到服务器;sessionStorage和localStorage数据保存在本地

HTTP状态码及常见状态码

HTTP状态码

• 1xx:指示信息类,表示请求已接受,继续处理
• 2xx:指示成功类,表示请求已成功接受
• 3xx:指示重定向,表示要完成请求必须进行更近一步的操作
• 4xx:指示客户端错误,请求有语法错误或请求无法实现
• 5xx:指示服务器错误,服务器未能实现合法的请求

常见状态码

• 200 OK:客户端请求成功
• 301 Moved Permanently:所请求的页面已经永久重定向至新的URL
• 302 Found:所请求的页面已经临时重定向至新的URL
• 304 Not Modified 未修改
• 403 Forbidden:对请求页面的访问被禁止
• 404 Not Found:请求资源不存在
• 500 Internal Server Error:服务器发生不可预期的错误原来缓冲的文档还可以继续使用
• 503 Server Unavailable:请求未完成,服务器临时过载或宕机,一段时间后可恢复正常

HTTP 请求跨域问题

跨域的原理

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。跨域访问是被各大浏览器所默认禁止的。
同源策略,是浏览器对 JavaScript 实施的安全限制,只要协议、域名、端口有任何一个不同,都被当作是不同的域。
跨域原理,即是通过各种方式,避开浏览器的安全限制。

同源策略的作用

①无法用js读取非同源的Cookie、LocalStorage 和 IndexDB
这个主要是为了防止恶意网站通过js获取用户其他网站的cookie等用户信息。

②无法用js获取非同源的DOM
防止恶意网站通过iframe获取页面dom,从而窃取页面的信息。

③无法用js发送非同源的AJAX请求获取数据
防止恶意的请求攻击服务器窃取数据信息。

注意:

同源策略仅存在于浏览器端,服务器端不存在同源策略

即使跨域了,Ajax请求也可以正常发出,但浏览器会进行校验,不会将响应数据交给开发者

<link> script> <img>等标签发出的请求也可能发生跨域,但是浏览器对标签跨域不做限制

比方说通过内容分发网络引用jQuery