网络相关

4次挥手

image-20230206173424189

4次回收目的: 为了确保数据能够完成传输。

  • 客户端突然挂掉了怎么办?

    务器端设置保活计时器,每当服务器收到客户端的消息,就将计时器复位。超时时间通常设置为2小时。

若服务器超过2小时没收到客户的信息,他就发送探测报文段。若发送了10个探测报文段,每一个相隔75秒,还没有响应就认为客户端出了故障,因而终止该连接

第一个问题:服务端大量处于 TIME_WAIT 状态连接的原因。

在 Linux 上 2MSL 的时长是 60 秒,也就是说停留在 TIME_WAIT 的时间为固定的 60 秒

为什么需要 TIME_WAIT 状态?

保证「被动关闭连接」的一方,能被正确的关闭

什么场景下服务端会主动断开连接呢?

  • 第一个场景:HTTP 没有使用长连接

    Connection: Keep-Alive

  • 第二个场景:HTTP 长连接超时

  • 第三个场景:HTTP 长连接的请求数量达到上限

第二个问题:服务端大量处于 CLOSE_WAIT 状态连接的原因。

查看代码是否有调用close 方法

2. http1.0 , http1.1 和 http2.0

1.新的二进制格式传输:二进制即0和1的组合,实现方便健壮,而1.x版本是基于文本,解析存在缺陷

2.多路复用:一个连接可以有多个请求,且可以混杂在一起根据requestid来区分不同的请求,提高了连接的利用率,降低了延迟

3.header头部压缩:通讯两方各自缓存了一份 header请求头表,避免了重复的header传输,且缩小了包的体积大小

4.服务端推送功能:可以服务端主动向客户端push消息

3. 什么是跨域问题?如何解决?

跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据

在返回头中设置“Access-Control-Allow-Origin”参数即可解决跨域问题,此参数就是用来表示允许跨域访问的原始域名的,当设置为“*”时,表示允许所有站点跨域访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Bean
public CorsFilter corsFilter() {
// 1.创建 CORS 配置对象
CorsConfiguration config = new CorsConfiguration();
// 支持域
config.addAllowedOriginPattern("*");
// 是否发送 Cookie
config.setAllowCredentials(true);
// 支持请求方式
config.addAllowedMethod("*");
// 允许的原始请求头部信息
config.addAllowedHeader("*");
// 暴露的头部信息
config.addExposedHeader("*");
// 2.添加地址映射
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**", config);
// 3.返回 CorsFilter 对象
return new CorsFilter(corsConfigurationSource);
}