2G 网络
2G时代上网使用的不是IP网络, 而是电话网络, 走模拟信号. 被称为公共交换电话网(PSTN, Public Switched Telephone Network)
2G时代手机怎么上网?
手机是通过收发无线信号来通信的,专业名称是 Mobile Station,简称 MS,需要嵌入 SIM。
- 手机是客户端
- 基站子系统(BSS, Base Station SubsystemBSS) 是服务端
信号塔就是基站, 通过无线信号, 让手机可以通信.无论无线通信如何无线,最终还是要连接到有线的网络里。
基站子系统分两部分
- 一部分对外提供无线通信,叫作基站收发信台(BTS,Base Transceiver Station)
- 一部分对内连接有线网络,叫作基站控制器(BSC,Base Station Controller)。
基站收发信台通过无线收到数据后,转发给基站控制器。 这部分属于无线的部分,统称为无线接入网(RAN,Radio Access Network)。
基站控制器通过有线网络,连接到提供手机业务的运营商的数据中心,这部分称为核心网(CN,Core Network)。核心网还没有真的进入互联网,这部分还是主要提供手机业务,是手机业务的有线部分。
接待基站来的数据是移动业务交换中心 (MSC, Mobile Service Switching Center) , 它是进入核心网的入口. 不会让你直接连接到互联网上需要认证是不是合法的手机接入。
认证是不是合法手机, 鉴权中心(AUC, Authentication Center) 和 设备识别寄存器(EIR, Equipment Identify Register) 主要是负责安全性
计费, 检查是不是外地号. 访问 位置寄存器(VLR, Visit Location Register) 是看你目前在的地方, 归属位置寄存器(HLR, Home Location Register) 是看你的号码归属地
当你的手机卡既合法又有钱的时候,才允许你上网,这个时候需要一个网关,连接核心网和真正的互联网。网关移动交换中心(GMSC ,Gateway Mobile Switching Center) 就是干这个的,然后是真正的互连网。
数据中心里面的这些模块统称为网络子系统(NSS,Network and Switching Subsystem)。
手机 -> 基站子系统(BSS)[基站收发信台(BTS) -> 基站控制器(BSC)]无线接入网(RAN) -> 网络子系统(NSS)[移动业务交换中心 (MSC) 、鉴权中心(AUC) 、 设备识别寄存器(EIR) 、位置寄存器(VLR) 、 归属位置寄存器(HLR) 、 网关移动交换中心(GMSC)]核心网(CN)
2G网络特点
- 手机通过无线信号连接基站
- 基站
- 朝前接无线(RAN)
- 朝后接核心网(CN)
- 核心网
- 超前接到基站请求
- 判断你是否合法
- 判断你是不是本地号码
- 有没有钱
- 通过网关连接电话网络
- 超前接到基站请求
2.5G 网络
原来电路交换的基础上,加入了分组交换业务,支持 Packet 的转发,从而支持 IP 网络。
基站:
- 一面朝前接无线
- 一面朝后接核心网
- 多了一个分组控制单元(PCU,Packet Control Unit),用以提供分组交换通道。
核心网:
- 朝前接待员(SGSN, Service GPRS Supported Node)
- 朝后链接IP网络的网关型GPRS支持节点(GGSN, Gateway GPRS Supported Node).
3G 网络
3G 时代,主要是无线通信技术有了改进,大大增加了无线的带宽。
W-CDMA 为例,理论最高 2M 的下行速度,因而基站改变了
基站:
- 一面朝外的是 Node B
- 一面朝内连接核心网的是无线网络控制器(RNC,Radio Network Controller)
核心网以及连接的 IP 网络没有什么变化。
4G 网络
基站为 eNodeB , 包含了原来Node B和RNC的功能.
核心网实现了控制面和数据面的分离
原先前面核心网里面有MSC(2G)或SGSN(2.5, 3G), 检查是否合法以及转发数据都是它负责. 控制面和数据面是合二为一的, 灵活性比较差.
- 控制面主要是指令,多是小包,往往需要高的及时性;
- 数据面主要是流量,多是大包,往往需要吞吐量。
-
HSS 用于存储用户签约信息的数据库,其实就是你这个号码归属地是哪里的,以及一些认证信息。
-
MME 是核心控制网元,是控制面的核心,当手机通过 eNodeB 连上的时候,MME 会根据 HSS 的信息,判断你是否合法。如果允许连上来,MME 不负责具体的数据的流量,而是 MME 会选择数据面的 SGW 和 PGW,然后告诉 eNodeB,我允许你连上来了,你连接它们吧。
-
手机直接通过 eNodeB 连接 SGW,连上核心网,SGW 相当于数据面的接待员,并通过 PGW 连到 IP 网络。PGW 就是出口网关。在出口网关,有一个组件 PCRF,称为策略和计费控制单元,用来控制上网策略和流量的计费。
SGW(Serving GateWay,服务网关) PGW(PDN GateWay,PDN网关)
4G 网络协议解析
控制面协议
虚线部分是控制面的协议.
当一个手机想上网的时候,先要连接 eNodeB,并通过 S1-MME 接口,请求MME对这个手机进行认证和鉴权。
- UE 就是你的手机
- eNodeB
- 朝前对接无线网络
- 朝后对接核心网络
- 控制面对接的是 MME
eNodeB和MME之间的连接就是正常的IP网络. 在IP层上是SCTP(既不是TCP, 也不是UDP).
SCTP:也是传输层的协议,也是面向连接的,但是更加适合移动网络。 它继承了 TCP 较为完善的拥塞控制并改进 TCP 的一些不足之处。
SCTP特点
SCTP - 多宿主
一台机器可以有多个网卡. 虽然TCP可以监听0.0.0.0也就是从哪个网卡来的连接都能接收, 但是一旦建立连接, 就建立了四元组, 也就选定了某个网卡
SCTP - 将一个联合分成多个流
SCTP引入了联合(association)的概念, 将多个接口, 多条路径放到一个联合中来. 当检测到一条路径失效时, 协议就会通过另外一条路径来发送通信数据. 应用程序不必知道发生了故障, 恢复, 提高了可用性和可靠性.
一个联合中的所有流都是独立的, 但均与该联合相关. 每个流都给定了一个流编号, 被编码到SCTP报文中, 通过联合在网络上传送.
- TCP中, 由于强制顺序, 导致前一个不到达, 后一个就等待.
- SCTP 的多个流不会相互阻塞.
SCTP - 四次握手, 防止SYN攻击
TCP是三次握手, 当服务端收到客户的SYN之后, 返回一个SYN-ACK之前, 就建立数据结构, 并记录下状态, 等待客户端发送ACK的ACK.
当恶意客户端使用虚假的源地址来伪造大量SYN报文时, 服务端需要分配大量的资源, 最好耗尽资源, 无法处理新的请求.
SCTP通过四次握手引入Cookie的概念, 来有效的防止这种攻击.
- 客户机使用一个INIT报文发起一个连接.
- 服务器使用一个INIT-ACK报文进行响应, 包括了Cookie.
- 客户端使用一个COOKIE-ECHO报文进行响应, 包含了服务器所发送的Cookie.
- 这个时候, 服务器为这个连接分配资源, 并通过向客户机发送一个COOKIE-ACK报文对其响应.
SCTP - 消息分帧
TCP是面向流的, 也即发送的数据没头没尾, 没有明显的界限.
发送数据没问题, 但是对于发送一个个消息类型的数据, 不太方便. 可能客户端写入10个字节, 再写入20个字节. 服务端不是读出10个字节的一个消息, 再读出20个字节的一个消息. 而是有可能读入 25 个字节, 再读入 5 个字节,需要业务层去组合成消息.
SCTP借鉴了UDP的机制, 在数据传输中提供了消息分帧功能. 当一端对一个套接字执行写操作时, 可确保对等端读出的数据大小与此相同
SCTP - 断开连接是三次挥手
在 TCP 里面,断开连接是四次挥手,允许另一端处于半关闭的状态。
SCTP: 当一端关闭自己的套接字时, 对等的两端全部需要关闭, 将来任何一端都不讯再进行数据的移动了.
数据通路与GTP-C
当 MME 通过认证鉴权,同意这个手机上网的时候,需要建立一个数据面的数据通路。
建立通路的过程还是控制面的事情, 因而使用的是控制面的协议GTP-C.
建设的数据通路分两段路, 两个隧道.
-
第一段是eNodeB到SGW
- 由MME通过S1-MME协议告诉eNodeB. 它是隧道一端.
- 通过S11告诉SGW,它是隧道的另一端.
-
第二段是SGW到PGW
- SGW 通过 S11 协议知道自己是其中一端,并主动通过 S5 协议,告诉 PGW 它是隧道的另一端。
GTP-C 协议是基于 UDP 的
GTP的头里面有隧道id, 还有序列号. 通过序列号, 不用TCP, GTP-C 自己就可以实现可靠性
为每个输出信令消息分配一个依次递增的序列号,以确保信令消息的按序传递,并便于检测重复包。对于每个输出信令消息启动定时器,在定时器超时前未接收到响应消息则进行重发。
数据面协议
当两个隧道都打通, 接在一起的时候, PGW会给收集分配一个IP地址, 这个IP地址是隧道内部的IP地址, 可以类比为IPsec协议里面的IP地址. 这个IP地址是归收集运营商管理的.
手机使用这个IP地址, 连接eNodeB, 从eNodeB经过S1-U协议, 通过第一段隧道到达SGW, 再从SGW经过S8协议, 通过第二段隧道到达PGW, 然后通过PGW连接到互联网.
数据面协议都是通过GTP-U
手机每发出的一个包,都由 GTP-U 隧道协议封装起来,格式如下。
和 IPsec 协议很类似
- 乘客协议是手机发出来的包, IP是手机的IP
- 隧道协议里面有隧道 ID,不同的手机上线会建立不同的隧道,因而需要隧道 ID 来标识
- 承载协议的 IP 地址是 SGW 和 PGW 的 IP 地址。
手机上网流程
手机开机上网的流程, 这个过程称为Attach.
- 手机开机后, 在附近**寻找基站eNodeB, 给eNodeB发送Attach Request, 说: 我来啦, 我要上网.
- eNodeB将请求发给MME, 说"有个手机要上网"
- MME去请求手机, 认证和鉴权, 还会请求HSS看看有没有钱, 看看是在哪里上网
- MME通过收集的认证之后, 开始分配隧道,先告诉SGW, 说要创建一个会话(Create Session). 会给SGW分配一个隧道ID t1, 并且请求SGW给自己也分配一个隧道ID.
- SGW 转头向 PGW 请求建立一个会话,为 PGW 的控制面分配一个隧道 ID t2,也给 PGW 的数据面分配一个隧道 ID t3,并且请求 PGW 给自己的控制面和数据面分配隧道 ID。
- PGW回复SGW说"创建会话成功", 使用自己的控制面隧道ID t2, 回复里面携带这给SGW控制面分配的隧道ID t4和数据面的隧道ID t5, 至此SGW和PGW之间的隧道建设完成. 双方请求对方, 都要带着对方给自己分配的隧道ID, 从而标志是这个手机的请求.
- 接下来SGW回复MME说创建会话成功, 使用自己的隧道ID t1访问MME, 回复里面有给MME分配隧道ID t6, 也有SGW给eNodeB分配的隧道ID t7.
- 当MME发现后面的隧道都建设成功之后, 就告诉eNodeB, “后面的隧道已经建设完毕", SGW给你分配的隧道ID是t7, 你可以开始连上来了, 但是你也要给SGW分配一个隧道.
- eNodeB告诉MME自己给SGW分配一个隧道, ID为t8.
- MME将eNodeB给SGW分配的隧道ID t8告知SGW, 从而前面的隧道也建设完毕.
这样,手机就可以通过建立的隧道成功上网了。
异地上网
- SGW是本地的运营商设备
- PGW是所属的运营商的设备
国外上网:
- 搜索本地eNodeB
- 通过MME去查寻国内运营商的HSS, 检查是否合法, 有钱.
- 如果可以上网, 手机和国外的SGW建立一个隧道
- 国外的SGW和国内运营商的PGW建立一个隧道, 通过国内运营商的PGW上网
- 能否上网是国内运营商的HSS
- 控制上网策略的是国内运营商的PCRF
- 给手机分配的IP地址也是国内运营商的PGW负责
- 上网流量全部通过国内运营商即可
- 国外运营商也要和国内运营商进行流量结算
参考资料:
趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW
GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习