前端知识点之网络相关

67 阅读15分钟

网络相关

1.UDP与TCP的区别

  • UDP:用户数据报协议

    他的特点就是速度快,无需建立连接,没有连接状态,并且首部字段的开销小。

    速度快:没有三次握手,拥塞控制等额外的开销。一有数据就会直接发送。

    无需建立连接:服务器与客户端无需建立连接就可以发送数据。

    没有连接状态:不会像TCP一样维护发送缓存接收缓存,拥塞控制,流量控制等连接状态。

    首部字段开销小:首部字段包括源端口号,目的端口号,长度以及校验和共8个字节。其中,校验和用于在一定程度上保证传输的准确性。校验和的实现思路:发送端对源端口号 + 目的端口号 + 长度 并进行取反,那么在接收端通过校验和 + 源端口号 + 目的端口号 + 长度的最终结果是否全为1来判断数据是否发生改变。虽然说UDP存在校验和,但它并不能保证数据的准确传输,也没有对数据传输的差错恢复能力以及重传机制。

  • TCP:传输控制协议

    与UDP不同,TCP是面向连接的协议,TCP的头部共占20个字节。TCP在进行数据传输前要先进行连接,就是三次握手。

    首先客户端像服务器发送特殊的不包含任何数据的SYN报文段,服务器在收到后对客户端返回SYN + ACK报文段告诉客户端我已经收到你的数据并同意进行连接,此时服务端会分配socket套接字等资源。当客户端收到该报文段后向服务器发送ACK报文段,告诉服务端我已经收到了你发送过来的消息并同意建立连接。此时连接建立可以发送数据。

    当数据发送完毕需要关闭连接时,需要进行四次挥手。首先客户端向服务器发送FIN报文段,当服务端收到FIN报文段时向客户端返回ACK报文段。此时,服务端再向客户端发送FIN报文段表示我也要关闭连接了,当客户端收到FIN报文段时向服务器返回ACK报文段。

    但是在这个过程中,客户端在发送ACK报文段后需要等待2MSL(一条消息能够在网络中存在的最长时间)的时间再关闭socket连接。原因:客户端发给服务端的ACK报文可能丢失,此时服务端需要重发FIN报文。

    TCP的一些其他特性:

    (1)传输的有效性:TCP是通过序号和确认号来保证传输的有效性,TCP会对报文进行拆分,而序号就是被拆分报文的编号,而确认号就是我希望下次收到的报文的序号。TCP通过一问一答的形式来保证传输的有效性。但是,这样的性能肯定是不高的,所以在TCP中引入了窗口的概念,即在一个窗口下,所有的报文无需等待回复就可以进行直接发送,这也就是所说的传输控制。

    (2)流量控制:因为TCP是全双工的协议,所以所有部分既可以作为发送端也可以作为接收端。在接受端和发送端中分别存在接受缓存和发送缓存。当消息到达接受端后并不会立马进行处理,而是等待操作系统分配时间片,等操作系统空闲了在进行处理。在发送端会定期向接收端发送一个窗口探测包,接收端接受到后来告诉发送端数据发送的频率。

    (3)拥塞控制:拥塞控制主要包括三部分,分别是慢启动,拥塞避免以及快速恢复。当开始发送数据时,先发送一个报文段,此后所发送的报文段进行指数增长,如果判断为网络拥堵则发送报文段的个数变为原来的一半。此时,进入拥塞避免状态,在拥塞避免状态下,所发送的报文段一次增加1,当再次网络拥堵时,则进入快速恢复状态,此时,所发送的数据量变为原来的一半,再依次以1为步长进行增长。如果此时还是网络拥堵,那么则转为慢启动状态。

    网络拥堵的判断:发送方连续接收到三次冗余的确认号。

    TCP的其他问题:SYN洪泛攻击

    在进行三次握手时,如果服务器在接受到客户端的SYN报文段并向客户端发送SYN+ACK报文段后,此时服务器已经分配了socket套接字资源,而此时如果客户端没有向服务器返回ACK确认报文段,此时服务器就会处于一个半连接的状态。如果短时间内服务器收到非常多类似的报文,就会造成服务器开销过大。

    解决方法:使用syn cookie,即当服务器接收到syn报文段后并不立即分配资源,而是通过源端口号目的端口号,源IP地址目的IP地址形成一个序列号将这个序列号发送给客户端,如果不是攻击者就会返回ACK报文,此时服务器分配资源。如果是攻击者就不会返回ACK报文。

2.HTTP与HTTPS

http:超文本传输协议,可以传输各种数据类型,通过Content-Type属性进行区别,且是明文传输的。一个http的报文由起始行,请求头/响应头,请求体/响应体构成。此外,http是无连接无状态的协议,无连接指的是每次连接只处理一个客户端请求,当服务端处理完请求并收到客户端的响应后就会断开连接。无状态指的是不会记录每个连接的状态,如果需要上一个连接的状态则必须进行重传。http的默认端口是80.

因为http是明文传输的,所以就很容易被抓包工具获取并阅读其内容。所以有了https,它是在http的基础上多了ssl/tls层,增强传输的安全性。https的默认端口是443。

在https中实现传输的安全性主要有三种方法,分别是对称加密,非对称加密以及两者相结合的一种方式。对称加密就是使用一个密钥进行加密解密,这就会产生一个问题,发送方需要通过网络把密钥发送给接收方,这时密钥就很容易被攻击者获取。而在非对称加密的方式中,发送者维护一对密钥,分别是私钥和公钥。用私钥加密的数据只有对应的公钥才能解密,用公钥加密的数据只有对应的私钥才能解密。发送方只需要将公钥发送给接收方即可。自己维护一个私钥。但这种方式也存在一个问题,攻击者可以获取到你的公钥并将之改为-自己的公钥,这样发送的数据就可以使用攻击者自己的私钥进行解密。这时就需要一个公证处,也就是CA,将自己的公钥进行公证生成一个数字证书,这样接收端就可以通过这个证书判断这个公钥是不是自己的了。但是,非对称加密算法存在一个巨大的缺陷就是运行效率太低了。而在对称加密和非对称加密结合的方式中,使用非对称加密发送对称加密的密钥,之后就可以使用对称加密进行数据的加密解密了。

总结:http与https的区别

  • https在http的基础上增加了ssl/tls层来保证数据传输的安全性。而http是明文传输的。
  • http的默认端口号是80,https的默认端口号是443。
  • https需要到CA去认证数字证书。
  • https需要发送两次请求,而http只需要发送一次。

3.WebSocket

同http一样,WebSocket也是应用层上的协议,都是基于TCP的。即WebSocket也是全双工的通信协议。但是与http不同的是WebSocket的服务器可以主动向所连接的客户端发送数据,每个客户端有一个唯一的标识符进行区分。而且WebSocket是长连接的,仅需要一次握手就可以长久的维持连接。因为是基于TCP的,WebSocket的实现也比较简单,而且在握手过程中使用了http协议。

首先,在建立WebSocket连接时,客户端向服务器发送一个http报文,而这个http报文的头部中包含upgrade:websocket。connection: upgrade。字段即告诉服务器,好啦,我现在用的是websocket协议而不是那个老土的http了,之后服务器在返回给客户端的报文中也增加了这两个头部字段,连接建立,此后的通讯就是依靠TCP,与HTTP无关了。

WebSocket最主要的一个应用场景就是实时的数据通讯。

4.Get请求和Post请求的区别

  • get请求的请求参数在url中,而post请求的请求参数在请求体中。
  • get请求有参数大小的限制,一般为2kb,而post请求没有请求参数大小的限制。
  • get请求只会发送一次请求,而post请求会发送两次,一次是options预检请求(检查是否允许跨域),第二次才是真正的post请求。

但是get请求和post请求本质上并没有区别,其底层都是在tcp的基础上实现的,只不过是人为实现的时候为他们添加了限制条件。

5.跨域的几种方式

之所以要跨域是受浏览器同源策略的限制,当请求的协议,域名或者端口号有一个不同时则被视为不同源的。这时就需要进行跨域。跨域的请求是发出去了,服务器也收到并将响应结果返回了,只是被浏览器所拦截了。

但是img,script,link这三个标签是允许进行跨域的。

跨域的几种方式:

  • jsonp:利用script标签允许跨域的性质,先自定义一个函数同请求一起发往后端,后端进行函数的拼接并返回结果,之后在浏览器中执行该函数并获取数据。但是该方法只适用于get请求,比较鸡肋。
  • iframe:利用iframe标签可以进行跨域的特性进行跨域,但是这种方法需要进行复杂的数据逻辑处理。
  • cors:在浏览器中,是自动支持cors的,所以需要修改的只有服务端,在响应头中添加Access-Control-Allow-Origin属性告诉浏览器哪些域名可以访问资源。
  • 反向代理:使用反向代理服务器,向服务器发送的请求通过反向代理服务器进行中转。

6.前端实时数据更新的几种方式

  • 轮询:短轮询和长轮询。

    短轮询:即每隔一段时间向服务器发送一次请求,服务器返回响应的结果。缺点是http连接断开的次数过多,服务端的压力比较大。而且无法获取实时更新的数据。

    长轮询:客户端向服务器发送一个http请求,服务器在接收到客户端的请求时,如果数据更新了则向客户端返回数据,否则,则等待一段时间,如果这段时间内数据没有更新,则向客户端返回错误消息。客户端在收到服务器的http响应后立即向服务器发送一个新的http请求。使用这种方法解决了无法实时获取数据的问题。

  • websocket。

    websocket是基于http的全双工实时通讯协议。全双工的意思就是在同一时间,客户端可以向服务端发送消息,服务端也可以向客户端发送消息。

  • sse。

    sse是服务器主动向客户端推送消息的一种技术,与websocket的区别在于,sse消息流向是单向的,只能由服务端推向客户端。

7.HTTP2与HTTP1.x相比的优势?

  • 采用二进制传输:使用二进制传输提高了报文解析的效率,并未其它的优化提供了可能。
  • 多路复用:正常情况下,同一个域名下浏览器一次对多发送6~8次请求。而HTTP2采用了多路复用的方式,在一个TCP连接下可以发送多个请求,增加了同一时间处理请求的个数(在同一个域名下,多个HTTP的请求响应可以在一个HTTP的连接中完成)。
  • 头部压缩:HTTP2采用了头部压缩算法,降低了传输报文的大小。
  • 服务器端推送:服务器可以主动向客户端推送消息,但是只能推送一些静态资源文件,比如js,html,css,图片等,不同于sse。

8.HTTP2可以实现多路复用的原因

HTTP1是基于文本字符串分割的协议,只能进行一次请求一次响应的这种方式,服务器端只有处理完当前的报文字符串才会发送响应。而HTTP2采用帧和流的方式,不同的请求响应帧在不同的流上进行传输,服务器端可以根据流ID进行不同请求响应帧的判断,甚至不同的请求响应帧可以交错的进行传输。

9.常见的HTTP状态码

大致分类:

1xx:消息状态码。

2xx:成功响应状态码。

3xx:重定向。

4xx:客户端错误。

5xx:服务器错误。

  • 200:成功返回。
  • 204:成功返回,但响应消息没有实体内容,通常用于只需要客户端向服务器发送消息的情况。
  • 301:永久重定向,指被访问的url永久指向了新的url地址。
  • 302:临时重定向,指被访问的url临时重定向到了新的url地址。
  • 304:not modified,用于协商缓存,表示资源没有发生改变,需要使用缓存中的资源。
  • 403:服务器拒绝访问相关资源。
  • 404:只所要访问的资源找不到。
  • 405:请求的方法不被服务器允许,可以通过option预检请求查看服务器允许的请求方法。
  • 500:服务器内部发生错误。

10.OSI七层网络模型于TCP/IP五层网络模型

OSI七层模型:

应用层:负责提供于用户最直接的接口。

表示层:负责数据的转换,包括数据的压缩,编码,加密等。

会话层:负责控制表示层的会话状态等。

运输层:数据的运输。

网络层:IP协议。

数据链路层:MAC地址等。(交换机,网卡)

物理层:数据最终是在物理层上进行传输的。

TCP/IP五层网络模型:

应用层:HTTP,HTTPS,WebSocket,FTP等。

运输层:TCP,UDP。

网络层:IP协议,路由器等。

数据链路层:交换机,网卡等。

物理层:网线,双绞线,光纤等。

11.为什么TCP的握手是三次而挥手却是四次?

TCP是一个全双工的通讯协议,在进行握手时,讲道理是四次的,先由客户端发起连接请求,然后服务端回应,服务端再发起请求之后客户端进行回应,只不过是TCP把服务端的回应和发起请求合并成一个报文了。但是挥手的时候却不能合并,因为客户端发送数据完毕请求关闭连接了,但是服务端的数据不一定发送完毕。

12.TCP握手为什么是三次而不是两次?

如果是两次的话,服务端当收到客户端的syn报文就建立连接,这样会出现一个问题,比如由于网络的原因syn包延迟到达了,这样就会开启一个新的无效的连接,浪费服务器资源,说到底还是因为TCP是全双工的。

13.网络攻击以及防范方式?

XSS:跨站脚本攻击,比如输入一个合法的可以执行的js代码,去盗取用户的cookie等信息。

防范方式:

1.对输入的内容进行验证,可以使用正则对输入的内容进行验证。

2.当将用户输入的内容进行显示时,转义输入的内容。

3.在服务端对用户输入的内容进行转义。

CSRF:跨站请求伪造,就是利用了在不同的tab标签页可以同时访问cookie的特性。比如用户在一个正常的网站登录了,那么他再打开一个标签页是可以访问到这个登录的cookie信息的,攻击者就可以使用这个cookie去模拟用户发送的正常的请求。

防范方式:

1.使用post请求,增加请求伪造的难度。

2.使用token进行用户的身份验证。

sql脚本注入:在用户输入时输入一个sql脚本代码去执行相应的操作。

防范方式:可以在前端或者后端对输入内容进行校验或者转义输入的内容。

钓鱼攻击:诱导用户点击看似合法的网站-,窃取用户信息。

防范方式:校验所有的重定向操作,使用一个白名单保存可以重定向的url。