Java面试总结之网络篇

文章目录

  • 一、网络 7 层
  • 二、TCP/IP 分层
  • 三、分层负载
    • 二层负载
    • 三层负载
    • 四层负载
    • 七层负载
  • 四、TCP 的三次握手和四次挥手
    • 三次握手
    • 四次挥手
    • 数据包讲解
  • 五、CDN 原理
  • 六、滑动窗口
  • 七、Some words from my heart


一、网络 7 层

Java面试总结之网络篇_第1张图片

  • 应用层 : 主要是应用程序, 例 B/S, C/S 相关程序
  • 表示层 : 主要是对接收到的数据进行解释, 加密和解密, 压缩和解压缩, 把计算机能识别的数据转化为人能识别
  • 会话层 : 主要是在系统之间发起会话或者接收会话的请求
  • 传输层 : 主要是定义了一些传输数据的协议和端口号, 将从下层接收到的数据进行分段进行传输, 然后到达了目的地之后进行重组, 这层有时候被称为段
  • 网络层 : 主要是将下层接收到的数据进行 IP 地址的封装和解封装, 这层的工作设备是路由器, 这层的数据也有时候被称为数据包
  • 数据链路层 : 主要是讲从物理层接收到的数据进行 Mac 地址的封装和解封装, 这层的数据叫做帧, 这层的工作的设备是交换机, 数据通过交换机来进行传输
  • 物理层: 主要是定义物理设备的标准, 比如光纤/网线的接口类型与各种传输介质的传输速率, 主要作用是传输比特流, 这层的数据被称为比特数据

Java面试总结之网络篇_第2张图片

二、TCP/IP 分层

TCP/IP 协议按照层次可以划分为 应用层、传输层、网络层、数据链路层, 每一层都专注于自己的领域, 如果某些地方需要进行修改, 只需要把变动的层次给替换掉就可以, 其优点是: 改动的影响较小、提高整体的架构灵活度和简化整个架构的设计

三、分层负载

二层负载

  • 针对 Mac 地址, 负载均衡服务器对外提供一个 Virtual IP , 在集群中不同的机器采用相同的 IP 地址, 但是机器中的 Mac 地址不一样, 当负载均衡服务器接收到请求之后, 就通过改写报文的目标 Mac 地址的方式将请求转发到目标机器实现的负载均衡. 也就是说会通过一个 Virtual Mac 地址接收请求, 然后分配到真实的 Mac 地址

三层负载

针对 IP, 类似二层负载, 负载均衡服务器对外提供一个 Virtual IP , 在集群中不同的机器采用不同IP 地址, 当负载均衡服务器接收到请求之后, 根据不同的负载均衡算法通过 IP 将请求转发到不同的真实服务器

四层负载

针对于 OSI 模型的传输层, 在传输层只有 TCP/UDP 协议, 这两种协议包含了 source ip/target ip/source port/target port, 在接收到客户端请求之后, 通过修改数据包的地址信息将流量转发到应用服务器. 通过 Virtual IP + port 接收请求后分配到真实的服务器

七层负载

针对 OSI 模型的应用层, 因为应用层的协议比较多, 七层负载就可以基于协议进行负载, 通过虚拟的 Url 或主机名接收请求, 然后再分配到真实的服务器

四、TCP 的三次握手和四次挥手

三次握手

  • 第一次握手: 客户 A 发送位码为 syn = 1, 随机产生 seq num = 00000 的数据包到服务器, 服务器 BSYN = 1 知道客户 A 需要建立连接
  • 第二次握手 : 服务器 B 接收到请求之后需要确认联机的信息, 然后向 客户 A 发送 ack num = seq + 1 (sql + 1 是客户 A 发送过来的数据) , SYN = 1, ACK = 1, 随机产生 seq = 11111 的包
  • 第三次握手 : 客户 A 收到之后检查 ack num 是否是正确的, 验证第一次发送的 seq num + 1 和位码 ack 是否为 1, 如果正确, 客户 A 会再次发送 ack num = seq + 1 (sql + 1 是主机 B 发送过来的数据)*, ack = 1, 然后 服务器 B 收到之后进行确认

Java面试总结之网络篇_第3张图片

四次挥手

  • 第一次挥手 : 关闭客户端到服务器的连接, 首先客户端 A 发送一个 FIN 到服务器端, 用来关闭客户端到服务器端的数据传送, 然后等待服务器进行确认, 终止标位是 FIN = 1, seq = u
  • 第二次挥手 : 服务器端收到这个 FIN 标志之后, 就会返回一个 ack = u + 1
  • 第三次挥手 : 关闭服务器到客户端的连接, 主要也是发送一个标志 FIN = 1 给客户端
  • 第四次挥手 : 客户端收到了 FIN 标记之后, 也发回一个 ACK 的报文确认, 并且把确认的的序列号 seq = u + 1, 首先进行关闭的一方将执行主动关闭, 另外一方执行被动关闭
  • 注意: TCP 连接需要经过 2MSL 后才会真正的关闭掉

Java面试总结之网络篇_第4张图片

数据包讲解

Java面试总结之网络篇_第5张图片

  • 源端口号 (16 位) : 标识主机的一个应用进程
  • 目标端口号 (16 位) : 标识目的主机的一个应用进程
    • 源端口号和目标端口号加上 IP 报头中源主机 IP 地址和目的主机 IP 地址能确定唯一的 TCP 连接
  • 顺序号 seq (32 位) : 用来标识从 TCP 源端到 TCP 目的端发送的字节流数据, 表示在这个报文段中的第一个字节数据的顺序号, 如果将字节流看作是两个应用程序之间的单向流动, 那么 TCPseq 顺序号对每个字节进行计数. 序号是 32 bit 的无符号数, 序号达到 2 ^ 32 - 1 后又从 0 开始, 在建立一个新的连接的时候, SYN 标志修改为 1, 顺序号字段包括由该主机选择连接的初始顺序号 ISN
  • 确认号 ack (32 位) : 包含发送确认的一端所期望收到的下一个顺序号. 所以, 确认序号应该是上一次已经成功收到的字节数据顺序号 + 1, 当 ACK 的标志是 1 的时, 确认字段才有效, TCP 为应用层提供全双工的服务, 意味着数据能在两个方向上进行独立传输, 所以, 连接的每一端都需要保持着每个方向上的传输数据的顺序号
  • TCP 报头 (4 位) : 给出报头中 32 bit 的字节数, 主要是指明数据是从哪里开始的, 这个值的作用是任选字段的长度是可变的. 这个字节占 4 bit, 所以 TCP 最多只有 60 字节的首部, 然而, 没有任何的字段, 长度是 20 字节;
  • 保留位 (6 位) : 保留给将来使用, 目前为 0
  • 控制位 (6 位) :TCP 报头中有 6 个标志 bit, 他们中可以同时被设置为 1
    • URG :URG1 的时候表示紧急指针有效, 为 0 表示忽略紧急指针的值
    • ACK :ACK1 的时候表示确认号有效, 为 0 表示报文中不包含确认信息, 忽略确认号字段
    • PSH :PSH1 的时候表示带有 PUSH 标志的数据, 指示接收方应该尽快将这个报文段交给应用层, 而不是等待缓冲区装满.
    • RST :RST1 的的报文时候就表示发生了某些问题, 主要是用于复位因出于某些原因导致主机崩溃或者出现错误的连接, 还可以应用于拒绝非法的报文段和拒绝连接请求
    • SYN :SYN1 的时候就表示连接请求, 主要是用于建立连接和顺序号同步
    • FIN :FIN1 的时候就表示发送方已经没有数据发送了, 主要是用于释放连接
  • 窗口大小 (16 位) : 数据的字节数, 表示从确认号开始, 本报文的源方可以接收到的字节数, 窗口大小最大为 65535 个字节
  • 校验和 (16 位) : 主要对整个的 TCP 报文段, 包括 TCP 头部和 TCP 的数据, 使用 16 位字节进行计算得到的, 这是一个强制性的字段, 是由发送端计算和存储, 然后接收端进行验证
  • 紧急指针 (16 位) :URG1 的时候表示紧急指针有效, TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式
  • 选项 : 最常见的可选字段是最长报文的大小, 被称为 MSS, 每个连接方通常都在通信的第一个报文段中指明这个选项, 指明本端可以接收的最大长度的报文段, 选项的长度不一定是 32 位字的整数倍, 因此需要加填充位, 使报头长度成为整字数
  • 数据 : TCP 报文段中的数据的部分是可选的, 在一个连接建立和终止的时候, 双方交换的报文段仅仅包含 TCP 首部, 如果其中一方没有数据要发送, 也使用没有任何数据的首部来确认收到的数据, 在处理超时的情况中, 也会发送不带任何数据的报文段

五、CDN 原理

Java面试总结之网络篇_第6张图片

  • 在很多的大型网站中, 会引入 CDN 来加速静态资源的访问, CDN 表示的是内容分发网络, 它是一种网络缓存技术, 能把一些相对稳定的资源放置到距离用户比较接近的地方, 这样的优点是节省整个广域网的带宽消耗和提升用户的访问速度, 提高用户的体验. 一般情况下会放置静态资源 (图片, 静态页面等等)到 CDN
  • CDN 主要包含分发服务系统、负载均衡系统、管理系统
    • 分发服务系统 : 基本的工作单元是各个 Cache 服务器, 主要负责直接响应用户的请求, 将内容快速分发给用户, 同时还负责内容的更新操作, 保证和源站的内容保持同步; 根据内容的类型和服务种类不同, 分发服务的系统分为多个子服务系统, 例: 网页加速服务, 流媒体加速服务, 应用加速服务等等, 每一个子服务系统都是一个分布式的服务集群, 由功能类似, 地域接近的分布式部署的 Cache 集群组成, 除了承担内容同步, 更新和响应用户的请求, 分发服务系统还需要向上层的管理调度系统反馈各个 Cache 设备的健康状况, 响应请求, 内容缓存状况等等, 主要方便管理调度系统能够根据设定的策略决定由哪个 Cache 设备来响应用户的请求
    • 负载均衡系统 : 负载均衡是整个 CDN 系统的中枢, 负载对所有用户的请求进行调度, 确定提供给用户的最终访问地址, 它主要是使用分级实现, 最基本的两极调度体系是包括 GSLB 全局负载均衡和 SLB 本地负载均衡, 全局负载均衡根据用户请求的内容和用户的地址, 根据就近原则, 确定用户服务的节点, 一般通过 DNS 解析或者应用层重定向的方式实现, 本地负载均衡主要是负责节点内部的负载均衡, 当用户请求从全局负载均衡调度到本地负载均衡的时候, 本地负载均衡会根据节点内的各个 Cache 设备的工作状况和内容分布情况等, 去对用户请求进行重定向, 本地负载均衡的主要实现有四层调度 LVS, 七层调度Nginx 和链路负载调度等
    • 管理系统 : 分为 运营管理网络管理子系统
      • 网络管理系统 : 主要是对 CDN 系统的设备管理, 拓扑管理、链路监控和故障管理的实现, 为管理员提供了对全网资源的可视化集中管理, 常常使用 Web 方式实现
      • 运营管理是对 CDN 系统的业务管理, 负责处理业务层面与外界系统交互所需的收集、整理和交互工作. 比如: 用户管理, 产品管理, 计费管理和统计分析等

六、滑动窗口

  • 滑动窗口协议主要是一种流量控制技术, 主要解决在早期的网络通信中, 通信的双方不会考虑网络拥堵的场景下就直接发送了数据包, 这样在网络阻塞的情况下的同时又发送了数会导致中间节点阻塞掉包, 双方都不能发送数据的问题.发送方和接收方都会维护一个数据帧的序列, 该序列被称之为窗口
    • 发送窗口 : 发送端允许连续发送帧的序号表, 并且发送端可以不用等待响应而连续发送的最大帧数, 这称为发送窗口的尺寸
    • 接收窗口 : 接收方允许接收帧的序号表, 落在接收窗口内的帧, 接收方都需要对其进行处理, 但是落在接收窗口外的帧就会被丢弃, 接收方每次允许接收的帧数称之为接收窗口的尺寸
  • 滑动窗口在线演示链接



七、Some words from my heart

  • In my point of view, one of the Indispensable things in my life is learning. Without learning you can not live with the society. If you say that you are ready to do it, I'll tell you do not ask yourself whethere you are ready or not but ask you are willing or not
  • Everybody has their own road, and let the things has been done would not have let you down
  • Quote from steven jobs "stay hungry, stay foolish"

你可能感兴趣的:(面试)