一、背景
写这篇博客的原因主要有两个,一个是之前在思考RPC的本质,看dubbo源码的时候就开始好奇,消费者和生产者通讯的本质是什么?最底层是如何实现的?另外一点就是看到大部分公司的招聘信息都写着“熟悉TCP/网络”,先不说熟悉,起码要弄懂网络的大概流程吧。
为此,我专门翻出了大学时期的《计算机网络》课本,从头开始学起。写这篇博客算是一份总结。我会尽可能简单的说明我对计算机网络本质的思考。不一定全面,也不一定正确。希望大家斧正。
博客使用图片来源于网络
二、概述
2.1、计算机网络历史
网络的开始来源于美军的ARPANET,后来NSF开始组建NSFNET,再后来随着主机越来越多,Internet开始进行入了商业化,这才有了如何的百花齐放、百家争鸣。
网络的形态也是随着时间推移不断丰富。一开始只是为了不同主机间的通信,后来支持了文档(document)交流,最后也衍生出了如今文本、图片、音频、视频各种形态。
2.2、网络体系结构
目前来说有两个网络参考模型,OSI七层模型和TCP/IP参考模型
这两个模型的区别对于本文主题不重要这里就不展开。接下来会按照《计算机网络》课本中的章节,介绍OSI参考模型的物理层、数据链路层、网络层和TCP/IP参考模型中的网络层、传输层和应用层。
先上结论,简单说下我对各层的思考:
2.2.1、物理层
物理层的出口是比特流,入口就可能多种多样了,比如说电话线(远古时期拨号上网)、电缆、光纤、无限通信线路等,可以有很多不同的传输介质。传输介质不同,信号也就不同。如何将不同来源的传输介质处理成统一规范的比特流,这就是物理层要思考的问题。有点像java里面的虚拟机,底层系统可能是linux或者windows,但是jvm屏蔽了底层差别,提供了一个统一的class文件执行环境。
同样的,不同的传输介质就需要不同的协议。这里的协议我理解为一个业界规范,只有定下了规范,全世界都照着规范做事,大家才能交流、互通有无。比较著名的可能是ADSL协议。
2.2.2、数据链路层
物理层在物理线路上传输的数据信号是存在差错的(比如说误码率)。数据链路层的主要目的有两个:
- 一个就是为了在物理层的基础上,采取差错检测、差错控制与流量控制等方法,将有差错的物理线路改进为无差错的数据链路。手段包括:CRC循环冗余编码、ARQ反馈重发。
- 一个是MAC层。MAC的全称是Medium Access Control,即媒体访问控制。控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱。
概括一下就是差错控制和多路复用。
针对数据链路层,有以下几个比较著名的概念要解释下。
网卡
在局域网中,连接多台计算机的同轴电缆被称为共享的总线传输介质,简称为共享介质。多个主机需要通过一条共享介质发送和接收数据,被称为多路访问或多路存取。为了防止多路访问的时候出现相互干扰/冲突,就需要一套协议来控制,这套协议就是CSMA/CD(Carrier Sense Multiple Access with Collision Detection)基带冲突检测的载波监听多路访问技术。
计算机必备的网卡其实就是通过物理层和MAC层完成数据发送与接收、冲突检测功能。网卡的一端连接传输介质、一端连接计算机。每个网卡还都有一个物理地址(MAC地址),理论上保证唯一且不可修改。
交换机
通过交换机,可以把任意几台机设置成一个局域网。换句话说,局域网内通信由交换机负责。
交换机完成局域网内的通信细节我们后文介绍。这里明白网卡的功能即可。
网桥/路由器
网桥是路由器和网关的基础,网桥可以实现多局域网的通信。网桥通过网卡连接局域网,通过内部的转发表记录不同主机mac地址和网桥端口的关系。
转发表的生成方法、路由器通信过程我们也后问分析。这里明白网桥/路由器的功能即可。
2.2.3、网络层
网络通信一般通过路由器来完成。这里的路由器并不是指家用路由器,而是网络运营商的路由器(比如电信/联通/移动等)。路由器有路由表,理由表由路由算法产生,路由表存储目的地址以及如何到达目的地址信息。
但是路由表不可能无限大,所以提出了自治系统这个概念。一个区域的计算机和路由器组成了一个自治区域。自治区域可以是大学实验室里的一个机房,可以是小区内的计算机。
自治区域内部
自治区域内的路由器通过OSPF协议更新路由表,OSPF要求
- 每个路由器都要周期性地告诉其他路由器自身的能到达的其他路由器信息
- 每个路由器都要以自身为root生成一颗最短生成树
自治区域间
自治系统间的路由算法是BGP,BGP要求每个自治系统都要选出一个路由器当发言人,不同发言人要相互沟通自治系统内的路由信息。
到了这里就概括网络本质了。其实网络就是 主机 - 路由器 - 路由器 - 主机。中间的路由器可能会有n个。
网络关键在于路由器和路由器之间怎么跳,路由器怎么知道下一跳是哪个路由器。这里其实就是路由表的匹配过程。
路由表有三个匹配原则:
1)最长掩码匹配(掩码越长越精准)
2)管理距离(越小越优)
3)度量值(动态路由协议判断)
也就是说,一般情况下,总会匹配到下一跳路由的,但是这个下一跳不一定就是目的地。总的趋势会越来越精准(并不是每一跳都是精准的)。
通过traceroute命令可以看到每一跳的过程
2.2.4、传输层
网络的本质是不同主机的进程通信。网络层、数据链路层、物理层实现了主机之间的数据通信,为进程通信提供了基础。
传输层提供了进程通信的协议 - TCP UDP。
TCP协议所谓的三次握手建立连接,其实都是传输层的概念,三次握手建立连接体现在网络层、数据链路层、物理层上并没有什么特殊的地方。并不会在物理线路中划分出一条线路,也不会在ip协议中划分出一个固定的分组,只是tcp协议的一个逻辑概念而已。有点像kafka的topic,我们经常说数据存放在某个topic下,实际上,数据是存放在partition下。
到了这一层就跟网络本质没多大关系了。但是就应用开发来说,倒是需要多了解这一层。
2.2.5、应用层
传输层实现了不同主机间的进程通信,那么应用层就是自然是通过进程通信实现了一些功能
比如典型的FTP、HTTP。
2.3、网络报文
报文其实就是指传输信息。在进行网络传输的时候,不可能没产生一段信息就直接传输,一般通过分组的方式,将报文分成多组进行传输。这样就要有相关的协议来表示分组,由此产生了结构:标志字段+分组信息
由于网络是不断的分层,每层都有自己独特的协议,那么分组信息的就不断地添加标志字段。底层的结构变成了上层的信息,加上上层的标志字段变成了全新的结构。(俗称套娃)
三、细节
3.1、局域网 - Local Area Network (缩写:LAN)
两台电脑通过网线相连就能组成最小的局域网。
3.1.1、集线器hub
多台电脑通过集线器组成局域网,它会将自己收到的每一个字节,都复制到其他端口上去。
“集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"能力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。”
集线器的工作方式:
- 你站到学校中庭,大喊一声“小芳,我来你找你了!” (广播)
- 如果这个时候正好有别人也在大喊大叫,你就必须等他喊完了再喊。(排队)
- 如果你喊的时候不巧碰上另一个人跟你同时喊,那么你和他喊的内容都不能被听见。(冲突)
- 你喊的时候,是听不见别人说什么的,只有喊完了才开始竖起耳朵听。(半双工工作方式、监听)
- 果然,对面楼里传来了你女友的声音“你去死吧!” (响应)
集线器可能会引起广播风暴
其实这里我理解为广播堵塞。万恶之源就是广播。集线器的工作方式是广播,来一条消息会广播到局域网内所有机器,当接入的设备到达一定量的时候,就会轮流广播消息。这个时候就会导致局域网内充斥着大量相同的报文(所以我才称之为堵塞)。并且,收到消息后一般是会回复消息的,这种回复消息的行为又可能加重了广播风暴(堵塞)。
3.1.2、交换机
交换机是集线器的升级,交换机存在一个端口号-MAC地址映射表(参考2.2.2中的交换机图)。
通过交换机,局域网内两台主机的通信就不必通过广播的形式。
3.2、局域网通信
3.2.1、网桥
实际上的网路通信其实是多个局域网之间的通信,网桥是实现多个局域网互联的网络设备,网桥与路由器、网关的工作原理基本相同。
网桥的工作原理如题所示:
可以看到,网桥通过多个端口与多个局域网相连,从而实现两个局域网之间的通信。
多个网桥也可以相互连接
3.2.2、网桥与路由器
网桥和路由器的区别主要体现在:
- 网桥只能连接两个逻辑相同的网络(它相当于一个二层交换机),而路由器可以连接不同网络;
网桥就是把不同物理位置的机器组成一个大的局域网,连接的多个网络属于同一个局域网;
网桥连接的两个网络在逻辑上属于同一个局域网,但可以是不同策略的网络,如以太网和令牌环网;
路由器可以连接不同的网络,连接的网络之间可以说没什么关系,是独立的; - 网桥基于 MAC 地址转发,路由器基于 IP 转发;
- 网桥不隔离广播,而路由器可以隔离广播;
- 网桥工作在链路层,路由器工作在网络层;
3.2.3、IP协议
路由器是基于IP转发,这里有必要介绍一下ip相关知识
3.2.3.1 IP协议的特点
- IP协议是一种无连接、不可靠的分组传送服务协议
- IP协议是点-点的网络层通信协议
3.2.3.2、IPv4分组格式
3.2.3.3、IPv4地址分类
IPv4地址分为5类
网络号用于识别主机所在的网络,主机号用于识别该网络中的主机。
P地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
从上图可以看出,一个ip地址是由网络号+主机号构成。这种结构就不够灵活,有的时候就会出现ip地址利用率低的问题(比如某个地方只有一两台主机,但是却分配了几百个IP地址)。因此后来提出了子网的概念:借用一部分主机号作为子网的子网号,划分出了更多的子网IP地址
子网规定:
- 新的结构由网络号+子网号+主机号构成
- 同一个子网中的所有主机使用相同的子网号
- 子网之间的距离必须很近。分配子网是一个局域网内部的事,不需要申请,对于外部路由器寻址没有影响。
3.2.3.4、子网掩码
子网是通过子网掩码来从主机号取出子网号的。规定A类、B类、C类的子网掩码如下:
例子:将C类IP地址192.168.10.0,将200台机器划分成4个子网,求子网掩
- 第一步:200台机器,4个子网,那么就是每个子网50台机器,C类IP地址的默认子网掩码为255.255.255.0;
- 第二步:大家都知道2的0次方到10次方,分别是1、2、4、8、16、32、64、128、256、512、1024;
- 第三步:如果你希望每个子网中有50个ip地址可以给机器用,那么你就最少需要准备给每个子网52个ip地址,因为需要加上两头的不可用的网络和广播ip,所以你需要选比52多的最近的那位,也就是64,就是说选每个子网64个ip;
- 第四步:子网掩码应该是256-64=192,那么子网掩码为:255.255.255.192
3.2.3.5、无类别域间路由CIDR
CIDR(Classless Inter-Domain Routing,无类域间路由选择)消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。IP地址=网络前缀+主机号,使用斜线记法,在IP地址后加上一个斜线“/”,然后写上网络前缀所占的位数,如:
- IP地址20.1.1.1,子网掩码255.192.0.0,按CIDR记为20.1.1.1/10,10表示连续10个1,也就是网络前缀占10位。
- CIDR地址200.1.1.2/24表示前24位用作网络前缀。
CIDR最大的好处就是大大缩减了路由器的路由表大小,而且减少了地址浪费。
CIDR将网络前缀都相同的连续的IP地址组成“CIDR地址块”,地址是连续的。不然,就不可能设计出包含所需地址、但排除不需要地址的前缀。为了达到这个目的,超网块(supernet block)即大块的连续地址就分配给ISP,然后ISP负责在用户当中划分这些地址,从而减轻了ISP自有路由器的负担。
3.2.4、路由器
3.2.4.1、路由跳转
网络通信就是就是信息从源主机跳到源路由器,然后由一个路由器跳到另外一个路由器,最后到达目的路由器交给目的主机的过程。
单路由器:
多路由器:
3.2.4.2、自治系统
为了解决复杂路由表生成与路由信息更新问题,人们提出了自治系统这个概念。特点有:
- 一个自治系统的网络属于一个单位,如一所大学,一个公司。可以自主选择自身自治系统内部路由选择协议
- 一个自治系统具有内部网关协议(IGP),也有外部网关协议(EGP)
IGP主要包括:路由信息协议(RIP),开发最短路径优先(OSPF)
EGP目前应用最多的是BGP-4。BGP-4协议要求每个自治系统选择一个路由器当作该自治系统的“发言人”。发言人直接要想换交换路由信息。
关于IGP和EGP的详细介绍这里留坑,以后补。现在明白路由器主要是通过这几个协议完成对内和对外的路由表信息生成与动态更新即可。
3.3、网络层相关协议
3.3.1、Internet报文控制协议ICMP
IP协议提供的是尽力而为的服务,传输过程中的比如网络通不通、主机是否可达、路由是否可用等信息源主机是不知道的。ICMP协议用于主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等
ICMP协议属于网络层中的一个协议,是IP协议的组成部分。
Ping命令和Traceroute命令是ICMP协议的典型应用。
具体ICMP协议留坑,这里有个大概印象即可。
3.3.2、IP多播与IGMP协议
3.3.3、VPN与MPLS协议
3.3.4、地址解析协议ARP
网络通信过程中,要求源主机了解目的主机的IP地址和MAC地址。IP地址一般是事先知悉的,那么如何根据已知IP地址寻找MAC地址?ARP协议。ARP协议解决了IP地址和MAC地址映射问题。
从IP地址寻找MAC地址的过程叫正向地址解析,相应的协议称为ARP协议。
从MAC地址寻找IP地址的过程叫反向地址解析,相应的协议称为RARP协议。
ARP协议本质上是通过广播的方式在局域网间寻找对应的IP地址或MAC地址。
具体ARP协议留坑,这里有个大概印象即可。
3.3.5、移动IP协议
3.4、传输层
网络层考虑的主要是点-点的通信,而传输层考虑的端-端的通信。
3.4.1 基本概念
TPDU
传输层之间传输的报文称为“传输协议数据单位”(TPDU)
应用进程、传输层接口与套接字
通过IP地址可以确认一台主机,通过该台主机的端口号,可以确认该台主机上一个应用进程
应用进程通过传输层协议(TCP、UDP)进行网络通信
套接字(Socket)由ip地址和端口号定义。通过socket可以确认网络上一个进程。
3.4.2、用户数据协议UDP
留坑
3.4.3、传输控制协议TCP
留坑
3.5、应用层
3.5.1、应用层与传输层关系
3.5.2、域名系统DNS
3.5.3、HTTP协议
3.5.4、FTP协议
参考资料
1、计算机网络(第3版) 吴功宜编著
2、集线器原理是什么
5、IP子网划分
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。