计算机网络相关(1)

1.get和post的区别

GET POST
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

从标准上来看,GET 和 POST 的区别如下:

GET 用于获取信息,是无副作用的,是幂等的,且可缓存 POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存

2.http和https的区别

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

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

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

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

3.TCP和udp的区别

  • TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
  • TCP要求的系统资源较多,UDP较少
  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  • TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  • UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  • TCP首部开销20字节;UDP的首部开销小,只有8个字节
  • TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道

4.说说浏览器输入网址到返回页面的过程?

1
2
3
4
5
基础版本:
浏览器根据请求的 URL 交给 DNS 域名解析,找到真实 IP ,向服务器发起请求;
服务器交给后台处理完成后返回数据,浏览器接收⽂件( HTML、JS、CSS 、图象等);
浏览器对加载到的资源( HTML、JS、CSS 等)进⾏语法解析,建立相应的内部数据结构 (如 HTML 的 DOM);
载⼊解析到的资源⽂件,渲染页面,完成。

1、用户在输入栏输入地址

  (1) 如果有 beforeunload 事件会先执行判断继续还是跳出操作

  (2) 浏览器进程识别是 地址还是关键字检索

  (3) 将正确的 url 地址发送给网络进程

2、网络进程查看有没有缓存

  (1) 有缓存直接返回数据

  (2) 没有缓存直接进入网络进程请求流程

3、浏览器进程查询 DNS 获取服务器 ip 地址

  (1) 如果请求协议是 https 那么还需要建立TLS连接

  (2) 利用ip地址和服务器建立 tcp 连接

  (3) 如果浏览器的 tcp 连接请求有超过浏览器设定限额,则需要排队等待

4、tcp 连接协议通过与服务器进行3次握手确立连接

  (1) 浏览器即用户端发起第一次握手

  (2) 服务器接收到用户端的消息发起接收到信息

  (3) 用户端接收到信息后向服务器发起第三次握手表示已经接收到信息可以连接

  (4) 如果第二次握手发送数据包丢失或者用户端发起第三次握手数据包丢失,服务器在长时间未接收到信息会再次发起,总共会尝试6次

5、tcp 接受信息

6、网络进程接收到数据后将返回头和返回体发送给浏览器

7、浏览器进程读取返回头查看返回信息,是否重定向或者响应数据类型处理

  (1) 重定向即回到第3步

  (2) 会根据 Content-Type 的值来决定如何显示响应体的内容。

  (3) Content-Type 为下载类型就会把请求交给浏览器的下载管理器,导航结束

  (4) 如果是 HTML,那么浏览器则会继续进行导航流程

8、准备渲染进程

9、浏览器进程接收到网络进程的响应头数据之后,便向渲染进程发起“提交文档”的消息

10、渲染进程就和网络进程直接建立连接进行管道数据传输

11、数据传输完成后tcp发起4次挥手断开连接并且渲染进程同时向浏览器进程发起确认提交

12、浏览器进程收到确认提交后会更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态。

13、渲染进程开始页面解析和子资源加载

相关的题目

浏览器发出一个请求到收到响应经历了哪些步骤?

1
2
3
4
5
6
1.浏览器解析用户输入的URL,生成一个HTTP格式的请求
⒉先根据URL域名从本地hosts文件查找是否有映射IP,如果没有就将域名发送给电脑所配置的DNS进行域名解析,得到IP地址 3.浏览器通过操作系统将请求通过四层网络协议发送出去
4.途中可能会经过各种路由器、交换机,最终到达服务器
5.服务器搜到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序,比如8080被tomcat占用了 6.tomcat接收到请求数据后,按照http协议的格式进行解析,解析得到所要访问的servlet
7.然后servlet来处理这个请求,如果是SpringMVC中的DispatcherSservlet,那么则会找到对应的Controller中的方法,并执行该方法得到结果 8.Tomcat得到响应结果后封装成HTTP响应的格式,并再次通过网络发送给浏览器所在的服务器
9.浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染

5.cookie做什么的?session又是什么?它们直接的关系?

什么是Cookie?
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。

当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
信息保存的时间可以根据需要设置.

如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.
如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.

Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.

由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,
因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性

什么是Session?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。

Session和Cookie的区别?

1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

6.跨域请求是什么?有什么问题?怎么解决?

跨域是指浏览器在发起网络请求时,会检查该请求所对应的协议、域名、端口和当前网页是否一致,如果不一致则浏览器会进行限制,比如在
www.baidu.com的某个网页中,如果使用ajax去访问www.jd.com是不行的,但是如果是img、iframe、scipt等标签的sc属性去访问则是可以的,之所以浏览器要做这层限制,是为了用户信息安全。但是如果开发者想要绕过这层限制也是可以的:

1.response添加header,比如resp.setHeader(“Access-Control-Allow-Origin”*);表示可以访问所有网站,不受是否同源的限制

2.jsonp的方式,该技术底层就是基于script标签来实现的,因为script标签是可以跨域的

3.后台自己控制,先访问同域名下的接口,然后在接口中再去使用HTTPClient等工具去调用目标接口

4.网关,和第三种方式类似,都是交给后台服务来进行跨域访问

7.Netty是什么?和Tomcat有什么区别?特点是什么?

Netty是一个基于NIO的异步网络通信框架,性能高,封装了原生NIO编码的复杂度,开发者可以直接使用Netty来开发高效率的各种网络服务器,并且编码简单。
Tomcat是一个Web服务器,是一个Servlet容器,基本上Tomcat内部只会运行Servlet程序,并处理HTTP请求,而Netty封装的是底层IO模型,关注的是网络数据的传输,而不关心具体的协议,可定制性更高。

Netty的特点:

  • 异步、NIO的网络通信框架
  • 高性能
  • 高扩展,高定制性
  • 易用性

8.TCP的三次握手和四次挥手过程

TCP协议是7层网络协议中的传输层协议,负责数据的可靠传输。在建立TCP连接时,需要通过三次握手来建立,过程是:

  1. 客户端向服务端发送一个SYN
  2. 服务端接收到SYN后,给客户端发送一个SYN_ACK
  3. 客户端接收到SYN_ACK后,再给服务端发送一个ACK

在断开TCP连接时,需要通过四次挥手来断开,过程是:

  1. 客户端向服务端发送FIN
  2. 服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还
    有数据正在处理
  3. 服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
  4. 客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了

SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。

额外问题: 为什么要三次握手?两次握手不行吗?

三次握手的目的是为了确认客户端和服务端的接收能力和发送能力。

第一次握手成功时,服务端确认客户端的发送能力和服务端的接收能力;

第二次握手成功时,客户端确认服务端的发送能力和接收能力和客户端的发送能力和接收能力,但此时服务端不能确认客户端的接收能力和服务端的发送能力;

第三次握手成功时,服务端和客户端都确认了双方的发送能力和接收能力。

如果是两次握手还会出现一个问题,客户端的第一次SYN请求在网络中阻塞时,客户端重新发送第二次SYN请求,服务器收到第二次SYN请求后,成功与客户端两次握手,双方建立连接,在数据传输结束后,双方断开链接,这时,第一次的SYN请求在服务端到来,服务端会认为客户端想要重新建立链接,给客户端发出确认建立连接,会一直等待客户端发送数据,而客户端已经完成了自己的数据传输任务,不会再给服务端发信息,于是服务端就一直等待,造成了资源的浪费。

9.大文件上传如何做断点续传?

不管怎样简单的需求,在量级达到一定层次时,都会变得异常复杂

文件上传简单,文件变大就复杂

上传大文件时,以下几个变量会影响我们的用户体验

  • 服务器处理数据的能力

  • 请求超时

  • 网络波动

  • 上传时间会变长,高频次文件上传失败,失败后又需要重新上传等等

为了解决上述问题,我们需要对大文件上传单独处理

这里涉及到分片上传断点续传两个概念分片上传

分片上传

分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(Part)来进行分片上传

如下图

img

上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件

大致流程如下:

将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;

初始化一个分片上传任务,返回本次分片上传唯一标识;

按照一定的策略(串行或并行)发送各个分片数据块;

发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件

断点续传

断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分

每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传或下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度

一般实现方式有两种:

服务器端返回,告知从哪开始

浏览器端自行处理

上传过程中将文件在服务器写为临时文件,等全部写完了(文件上传完),将此临时文件重命名为正式文件即可

如果中途上传中断过,下次上传的时候根据当前临时文件大小,作为在客户端读取文件的偏移量,从此位置继续读取文件数据块,上传到服务器从此偏移量继续写入文件即可
img

10.为什么Https用两种加密算法?

HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

① 证书验证阶段:

1
2
3
4
5
1)浏览器发起 HTTPS 请求;

2)服务端返回 HTTPS 证书;

3)客户端验证证书是否合法,如果不合法则提示告警。

② 数据传输阶段:

1
2
3
4
5
6
7
8
9
1)当证书验证合法后,在本地生成随机数;

2)通过公钥加密随机数,并把加密后的随机数传输到服务端;

3)服务端通过私钥对随机数进行解密;

4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。

5) 客户端再用生成的随机值对返回内容进行对应的对称解密,获取内容

为什么数据传输是用对称加密?

首先:非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。

另外:在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密

内容使用对称加密是为了传输效率

非对称加密是为了验证证书合法性