一、网络分层模型

软件工程项目学中有一个重要的思想就是分层解耦。OSI七层模型,TCP/IP四层(有时将数据链路层和物理层分开称为五层模型),都是为了更好的实现网络的互通。

应用层:网络服务于最终用户的一个接口,Tomcat、浏览器都属于这一层。

表示层:数据的表示、安全(加解密)、压缩等处理。

会话层:建立、管理、终止会话。

传输层:定义数据传输的协议端口号,以及流控和差错校验。

网络层:进行逻辑地址寻址,实现不同网络之间的路由。

数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等。

物理层:建立、维护、断开物理连接。

二、网络数据传输示例

通过Linux系统的Shell交互程序实现百度首页的请求。

首先进入当前shell程序的文件描述符定义路径,其中$$是当前命令解释程序(即Shell)。

0 1 2分别代表输入、输出和报错,这是所有交互程序都必须具备的接口。

使用exec命令,建立一个文件描述符8,代表一个socket连接:

此时,我们已经对www.baidu.com建立了一个TCP连接,紧接着,手写一个最简HTTP请求,输出到Socket中,并通过输入流从socket中取出响应,并输出。

最后关闭socket:

通过echo打印的 HTTP协议头字符串,就是在模拟应用层服务(如浏览器)的请求封装工作。但实际上,并不是应用层服务直接将请求发出,而是通过更下层的服务层层包装、寻址完成的。每一层都有对应的协议,上层服务只需要将请求内容按照协议组织好后就可以调用传输层服务,并通过网络接口发送出去。

应用层属于用户态,传输层以下是内核态。Java应用程序在请求网络时,就是像上面这样,获取一个socket对象,然后将封装好的信息放入其中。JVM如果想要建立一个网络连接,我们通过代码new Socket,但实际上底层都是native接口,是JVM去请求了系统调用,待操作系统内核跑完底层,返回一个建立成功的连接,之后才能执行下一步代码。在建立连接的时候,程序一定是会出现一定的阻塞。

三、传输层的TCP协议

TCP协议是传输层的重要协议,是面向连接的、可靠的通信标准。它通过三次握手、四次挥手机制实现安全可靠的连接。

3.1 三次握手

上图是三次握手的模型。

① 客户机首先发送第一次请求,主要参数有SYN、seq ;

② 服务器收到请求后,发送第二次请求给客户机,这实际上是上一次客户机请求的确认响应,但同时也是服务器对客户机的请求,参数主要有SYN、ACK、seq。

③ 客户机收到响应后,会再次确认这个响应,递增相关参数并响应回去。

经过了一次原始请求两次确认的通信之后,我们就已经可以认为这是一次明确、可靠的连接。

三趟数据包走完之后,双方才会在内存中开辟线程,开辟对象,开辟所有的描述符,建立相应的资源,而如果三次握手失败,这些资源是不会开辟的。

3.2 四次挥手

四次挥手断开连接,请求方发送断开请求,接收响应,但此时并未断开,需要由被动方主动发起允许断开的通知,方可完成断开操作。即先告知断开请求,再由被动方断开,最后双方释放资源,如端口号等。

整体通讯过程大致为:

三次握手-->数据传输-->四次分手

这个通讯过程是一个最小粒度,不可被分割。类似事务原子性。例如,在多负载系统中,多个实例不可以拆分同一个TCP连接,即端点与端点的所有数据请求、响应都不可以被任何负载技术所打散。

3.3 Linux下查看TCP 连接状态

netstat命令:

-n:numeric 直接使用ip地址,不通过域名服务器

-a:all 显示所有连线中的socket

-t:tcp

-p: 显示PID及对应程序

我们通过终端软件进行ssh登录后,就可以看到netstat的网络连接状态:

响应表格中,LISTEN表示正在监听,ESTABLISHED表示已经建立连接,所谓的Socket,就是Local Address和Foreign Address组成的一条唯一值。

其中有三条sshd程序,第一条sshd是父进程,处于LISTEN状态,一旦监听到连接请求,那么就会抛出一个线程用于建立Socket连接,后面两个sshd分别是远程终端的图形交互窗口sftp连接和命令行窗口ssh连接,Foreign Address中的192.168.1.1实际上就是Windows上的虚拟网卡,而port是随机的。

四、网络层

4.1 Linux网卡配置及IP下一跳机制

我们查看eth0网卡的配置信息,一般主要关注四个维度:

ip地址、掩码、网关、DNS服务地址。

查看路由表:

在很早的以前的网络拓扑当中,有一种模型,是每台主机都存储一个全局的网络拓扑,这种模型会随着互联网上的设备增多而失去可行性,于是就产生了现在的网络寻址机制,即下一跳机制。

所谓“下一跳”,就是当前IP地址到达目标IP的路径上临近的下一个IP地址。在路由过程中,数据包到达每个主机都会进行路由判定,并依次转发。这些转发的路径需要网络工程师来进行规划。下一跳机制可以极大的减少主机需要存储的IP地址信息,只需要记住同一网络的网关地址,就可以了。

4.2 通过ping理解下一跳机制

通过ping命令(基于ICMP协议)可以判断主机的连通状态,如下是ping百度首页:

那么ping程序是如何将数据包发送到遥远的百度服务器的呢?

首先,ping命令拿着目标地址(39.156.66.14)逐条与路由表中的掩码进行按位与运算,并且与Destination进行比较,这就是路由判定。如果目标地址与Destination记录的IP一致,就将数据包发给它。

上图中,经过路由判定,Destination=0.0.0.0符合要求,于是,我们就得到了下一跳地址192.168.1.2。而实际上不论什么IP,只要和掩码为0.0.0.0进行与运算,就都会得到0.0.0.0,因此在上面的路由表中192.168.1.2 就是默认网关。

互联网中的所有设备都会存储这样的路由表,只要具备转发能力,都会进行路由判定。一般的小型路由设备都会有一条默认的下一跳地址,而对于一些骨干网、城域网等大型网络环境,网络工程师可能会设置更多的下一跳条目,规划通信路由。

网关可以有多个,但是默认网关只有一个。同一网络通信是不需要路由设备的,只需要简单的交换机即可实现数据转发,只有不同网络的通信才需要下一跳地址。

五、数据链路层

当网络层的路由判定找到了下一跳地址,但数据包中的目标地址永远是最终将要发送到的IP地址,又如何将数据包发送到下一跳呢?

在IP数据包之外,又“包裹”了一层协议包。数据链路层同样存在一张表格,记录了MAC地址:

DNS是解释域名和IP地址的映射,arp协议会解释IP地址到MAC地址的映射。但前者是全网的,而arp是同一局域网内的。

经过arp的地址判定,IP数据包外面会“包裹”一个下一跳的MAC地址,这时整个数据包内部存在三个地址:下一跳的MAC地址、目标IP地址,以及目标端口号。

总结

TCP是重要的网络通信手段,三次握手建立的连接是一个可靠的Socket信道,这些信息可以通过 netstat -natp 命令查看。

IP数据包会记录目标地址的IP,传输过程中并不会改变。通过路由判定找到下一跳的网络IP地址,再通过数据链路层的 arp 协议找到下一跳IP的MAC地址,将其包裹在IP数据包外面,并通过物理层发送到下一跳。最终发送到IP数据包内的目标地址的目标端口上。

下一跳机制极大的减少了主机需要记录的通信IP数据,但同时,需要网络工程师对下一跳进行网络规划,开通相应策略,就像是搭建一个网络上的路由桥梁,连接各个网络之间的通信。

高并发负载均衡——网络协议原理相关推荐

  1. 高并发负载均衡(一):网络协议原理

    引入 中国网络上可以产生消费的活跃用户约2.4亿,互联网人数较多,基础人群大 应该把钱花在哪里?营销上,而不是技术上.这样你赚得更多. 案例比如,陌陌:CCTV广告,营销让人们下载去使用这个软件,你可 ...

  2. 高并发负载均衡(四):基于keepalived的LVS高可用搭建

    LVS四层 & Nginx七层 对比 你要分清哪些程序是应用层的,哪些程序是内核的. LVS四层负载均衡服务器,是不会碰握手这一个步骤的. Nginx是基于反向代理(七层)的负载均衡服务器,要 ...

  3. Django 高并发负载均衡

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台 ...

  4. Django高并发负载均衡

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台 ...

  5. 面试90%都会翻车的高可用+高并发+负载均衡架构设计 !

    很多人面试的时候被问到一个让人特别手足无措的问题: 你的系统如何支撑高并发? 对于一个公司而言,"为什么要高可用" 关于负载均衡架构设计你了解多少? 大多数同学被问到这个问题压根儿 ...

  6. 高并发负载均衡(三):LVS的DR模型试验搭建

    LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 我们定义一些名词缩写: 早期的小型运营商使用的LVS: 隐藏的Virtual I ...

  7. 高并发负载均衡(二):LVS 的 DR,TUN,NAT 网络模型推导

    上节回顾 路由器就是要连接不同的网段,它是用来选择路线的.它里面有路由表,可以进行路由转发的判定. 交换机是负责同一个网络中转发,他只要转发就行了. ARP协议 发送端必须获取到目的MAC地址,MAC ...

  8. 基于HAProxy+Keepalived高可用负载均衡web服务的搭建

    一 原理简介 1.HAProxy HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的we ...

  9. 用 Keepalived+HAProxy 实现高可用负载均衡的配置方法

    1. 概述 软件负载均衡技术是指可以为多个后端服务器节点提供前端IP流量分发调度服务的软件技术.Keepalived和HAProxy是众多软负载技术中的两种,其中Keepalived既可以实现负载均衡 ...

最新文章

  1. 学习angularjs时遇到 XX is not a function
  2. ae中心点重置工具_不懂这些知识,你的AE白学了!
  3. python知识:all、dict()、min、setattr、any函数
  4. 汇编语言——《分支与循环程序设计》实验报告
  5. linux系统结构与文件管理命令
  6. Angularjs 开始之Hello world
  7. 【CodeForces - 570A】Elections(模拟,水题)
  8. Python多进程使用队列共享数据协同判断素数
  9. 软件设计师16-数据结构02(排序/查找)
  10. linux下NFS、FTP使用讲解
  11. 华为认证hcia证书实力 华为认证hcia考试题库
  12. linux远程映射usb设备,Linux 系统下USB端口映射
  13. WeTest质量云平台,618盛惠活动开启
  14. 在Anylogic建立自己的智能体
  15. mysql基础01 创建表 修改表
  16. 【服务器数据恢复】服务器硬盘读写不稳定掉线,lun丢失的数据恢复案例
  17. C++数组能开多大?
  18. Python爬取微博短视频
  19. python随机函数random、画、星轨_如何使用 NVIDIA StyleGAN 生成自己的动漫(老婆)头像...
  20. 李子柒——成功的网络视频制作人及其营销分析

热门文章

  1. 48张图|手摸手教你性能监控、压测和调优
  2. 为什么阿里巴巴建议集合初始化时,指定集合容量大小?
  3. zoj 3488 conic section
  4. Linux debian安装PyCharm教程
  5. 用户态和核心态的转换
  6. python qt 按钮_PyQt(Python+Qt)学习随笔:toolButton的popupMode属性
  7. python建立ip代理池_Python搭建代理IP池实现存储IP的方法
  8. 微信无连接服务器1.104,微信成语猜猜看太子少师答案汇总 太子少师1-104关攻略...
  9. python数据批量写入iq数据库_通过Load table命令将数据文件加载到Sybase IQ数据库里面的Python脚本...
  10. python爬取行业数据_用Python进行Web爬取数据