网络通讯
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 次握手过程
APP 先发送 SYN=1, Seq=X 的报文,表示请求建立连接, X 是一个随机数;
服务器收到这个报文后,应答 SYN=1 ,ACK=X+1, Seq=Y 的报文,表示同意建立连接;
APP 收到这个报文后 ,检查 ACK 的值为自已发送的 Seq 值 +1 ,确认建立连接,并发送 ACY=Y+1 的报文给服务器;服务器收到这个报文后检查 ACK 值为自已发送的 Seq +1 ,确认建立连接。至此, APP 和服务器建立起 TCP 连接,就可以进行数据传输了。

TCP 关闭连接 4 次挥手
主动方向被动方发送一个 FIN,请求关闭数据传输
当被动方接收到主动方的 FIN 时,向主动方发送一个 ACK,其中 ACK 的值等于 FIN + SEQ
被动方向主动方发关一个 FIN,告诉主动方应用程序关闭
当主动方收到被动方的 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 容器端口监听
客户端对服务端的网络请求需要指定端口号,服务端应用容器通过监听端口号来捕获请求。
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 方法被阻塞

版权声明: 本文为 InfoQ 作者【陈皮】的原创文章。
原文链接:【http://xie.infoq.cn/article/aadc80305a944dcbf1215942a】。文章转载请联系作者。
评论