网络通讯

用户头像
陈皮
关注
发布于: 2020 年 07 月 29 日

Web 应用场景中的网络通讯

1 网络通讯协议解决了什么问题

百度百科:网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言

2 一次 web 请求的网络通信历程





3 OSI 七层模型和 TCP/IP 四层模型







网络数据包格式





3.1 物理层

物理层负责数据的物理传输,计算机输入输出的只能是要 0、1 这样的二进制数据,但是在真正的通信线路里有光纤、电缆要、无线各种设备。光信号和电信号,以及无线电磁信号在物理上是完全不同的,如何让这些不同的设备能够理解、处理朾同的二进制数据,这就是物理层要解决的问题。

3.2 数据链路层

链路层就是将数据进行封装后交给物理层进行传输,主要就是将数据封装成数据帧,以帧为单位通过物理层进行通信,有了帧就 可以在帧上进行数据校验,进行流量控制。

链路层会定义帧的大小,这个大小也被称为最大传输单元。像 HTTP 要在传输的数据上添加一个 HTTP 头一样,数据链路层也会将封装根子的帧添加一个帧头,帧头里记录析一个重要信息就是发送者和接受者的 MAC 地址。 MAC 地址是网卡的设备标识符,是唯一的,数据帧通过这个信息确保数据送达到正确的目标机器。

数据链路层负载均衡:

根据 MAC 地址做分发





3.3 网络层

网络层 IP 协议使得互联网应用根据 IP 地址就能访问到目标服务器,请求离开 APP 后,到达运营服务商的交换机,交换机会根据这个 IP 地址进行路由转发,可能中间会经过很多个转发节点最后数据到达目标服务器。

网络层的数据需要交给链路层进行处理,而链路层帧的大小定义了最大传输单元,网络层的 IP 数据包必须要小于最大传输单元才能进行网络传输,这个数据包也有一个 IP 头,主要包括的就是发送者和接受者的 IP 地址。

IP 层负载均衡:





3.4 传输层(TCP 协议)

IP 协议不是一个可靠的通信协议,不会建立稳定的通信链路,并不会确保数据一定送达。要保证通信的稳定可靠,需要传输层协议 TCP

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。TCP 作为一个比较基础的通讯协议,有很多重要的机制保证了 TCP 协议的可靠性和强壮性:

  • 使用序号,对收到的 TCP 报文段进行排序和检测重复的数据

  • 无错传输,使用校验和检测报文段的错误

  • 使用确认和计时器来检测和纠正丢包或者延时

  • 流量控制,避免主机分组发送得过快而使接收方来不及完全收下

  • 拥塞控制,发送方根据网络承载情况控制分组的发送量,以获得高性能同时避免拥塞崩溃丢包的情况

TCP 建立连接的 3 次握手过程

  1. APP 先发送 SYN=1, Seq=X 的报文,表示请求建立连接, X 是一个随机数;

  2. 服务器收到这个报文后,应答 SYN=1 ,ACK=X+1, Seq=Y 的报文,表示同意建立连接;

  3. APP 收到这个报文后 ,检查 ACK 的值为自已发送的 Seq 值 +1 ,确认建立连接,并发送 ACY=Y+1 的报文给服务器;服务器收到这个报文后检查 ACK 值为自已发送的 Seq +1 ,确认建立连接。至此, APP 和服务器建立起 TCP 连接,就可以进行数据传输了。





TCP 关闭连接 4 次挥手

  1. 主动方向被动方发送一个 FIN,请求关闭数据传输

  2. 当被动方接收到主动方的 FIN 时,向主动方发送一个 ACK,其中 ACK 的值等于 FIN + SEQ

  3. 被动方向主动方发关一个 FIN,告诉主动方应用程序关闭

  4. 当主动方收到被动方的 FIN 时,回复一个 ACK 给被动方。其中 ACK 的值等于 FIN + SEQ

4 次挥手不计算在网络请求响应时间内





3.5 应用层 HTTP 协议

而互联网庆用需要在全球范围为用户提供服务,将全球的应用和倒不的用户联系在一起,需要一个统一的应用层协议,这个协议就是 HTTP 协议。

HTTP 请求的 7 种方法

  • GET

  • HEAD

  • POST

  • PUT

  • DELETE

  • TRACE

  • OPTIONS





HTTP 响应的 5 种状态

  • 1XX

  • 2XX

  • 3XX

  • 4XX

  • 5XX





HTTP 协议版本

  • 1996 年发布 HTTP/1.0。问题:每次请求都会创建一个新的 TCP 连接。

  • HTTP/1.1,为了解决每次新建连接的问题,复用 TCP 连接。但是一个连接同时只能处理一个请求。

  • HTTP/2

  • HTTP/3,不使用 TCP 作为会话的传输层,而是使用 QUIC

4 非阻塞网络 I/O

4.1 容器端口监听

客户端对服务端的网络请求需要指定端口号,服务端应用容器通过监听端口号来捕获请求。

...

int port = ...;

// 服务器 socket 监听指定端口
ServerSocket serverSocket = new ServerSocket(port));

// 请求 socket 对应一个网络请求
Socket socket = serverSocket.accept();

... socket.getInputStream();

... socket.getOutputStream();

...


4.2 多线程服务器

使用线程来处理一个 socket 请求,从而实现服务器并发处理。





引入线程池





BIO Blocking I/O:

  • serverSocket.accept() 阻塞,在主线程 accept 阻塞的请求被放入 Socket 缓冲区操作系统内核缓存

  • socket accept 交由用户线程池处理,用户线程处理过程中线程阻塞

系统处理 socket 流程:





4.3 非阻塞 I/O(Non-Blocking I/O)

不阻塞用户线程,网络 I/O 立即返回。

自旋读取 Socket 缓存

4.4 Java NIO(New I/O)







4.5 系统 I/O 复用方式(多路复用):setlect/poll/epoll

复用 selector





读过程:

有一个 selector socket 线程轮询 socket 缓存





事件机制,socket 就绪向 eventpoll 线程中注册。





无活动连接时, Selector.select 方法被阻塞





发布于: 2020 年 07 月 29 日 阅读数: 39
用户头像

陈皮

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
网络通讯