概述
网络、互联网与因特网
- 网络是计算机和链路的集合,互联网是网络的集合,因特网是互联网的一种。


- 1983年,TCPIP协议成为ARPANET上的标准协议。1983年作为因特网的诞生时间。
因特网的三级结构
最开始是由美国国家科学基金网来运营,在美国分为三级
- 主干网:广域网
- 地区网:区域网
- 企业网(校园网):局域网
多层次ISP结构的因特网
随着越来越多的机构接入,因特网开始转到ISP由私人进行运营,想接入因特网的机构需要向ISP缴费。
-
主干ISP - 地区ISP - 本地ISP,中心机房提供网络交换。
-
Internet:涉及到链路层、网络层、传输层
万维网WWW的问世
- 20世纪90年代,欧洲原子核研究组织CERN开发WWW技术,推动因特网迅速发展;
- HTTP、Web1.0 2.0 3.0,是在应用层实际落地的应用。
- 万维网是运行在因特网上的分布式应用,通过网页之间的超链接,将不同网站的网页链接成一张逻辑上的信息网。
因特网的标准化
- 任何一个建议标准成为因特网标准之前,都以RFC技术文档的格式发表:
- IETF的HTTP标准,RFC文档:RFC 2616
因特网的组成

边缘部分
- 所有连接到因特网上的主机组成。这些主机又叫端系统。边缘计算就是将边缘主机登录到同一个程序上进行计算任务分担。
- 主机A和主机B通信,其实就是运行在主机A上的进程与B上的另一个进程通信。
- 可以直接点对点通信;也有可能是先走到核心网络,再从核心网络走出去。即端系统运行的程序之间的通信方式可以划分为两大类:
- client - server方式
- client请求发给核心server,server进行转发给终端用户。
- P2P方式
- 两个主机并不区分谁是client和server;只要两个主机都运行了对等连接软件(P2P软件),就可以进行平等的、端到端连接通信。
- 不需要依赖核心网络进行请求转发、路由等。去中心化。
核心部分
是什么
-
网络和连接这些网络的路由器组成。核心交换、路由、骨干网。这部分是为边缘部分提供服务的(连通性和交换)
-
中国到美国的网络走的是海底光缆;
核心
- 路由器:实现分组交换的关键构件,工作在第三层。
- 交换机:工作在第二层。
路由器
- 对分组进行存储转发、最优路径选择
- 电路交换 - 报文交换 - 分组交换
- 分组交换
- 发送端先把较长的报文划分成较短的、固定长度的数据段(MTU);路由器会把不同的包走不同的路径进行转发。到达目的端的先后顺序不同,根据某种顺序重新拼接起来。
- 分组 = 首部 [Metadata] + 数据
通信交换机制
电路交换
早期接线电话的通信方式,通信传输效率较低。
报文交换
不需要提前建立连接和释放连接,将报文整个直接传送,对路由器的存储能力考验较大,时延较高。
分组交换
-
待发送的整块数据称为报文,把报文分成若干分组,在分组前面加上首部(包含控制信息),就构成了一个个的分组。
-
分组是互联网的传送单元;通信效率大大提高。
- 但是需要考虑首部的额外开销、路由的时延、通信量大造成网络拥塞、失序和丢包问题。
公网与私网
-
public network
-
private network
- 有的是物理上不隔离,还是用的公网的设备;但是做了加密,公网访问不了
- 有的是物理上隔离,拉了专线。
性能指标
速率
-
一秒钟能传送多少个bit,比特率。
-
单位Kb/s, Mb/s, Gb/s,bits,二进制位,与字节Byte 8的换算。
带宽
- 最高数据速率,单位Kb/s, Mb/s, Gb/s。理解为最大速率。
- 木桶效应:实际的带宽 = min (主机接口带宽,线路带宽,路由器的接口带宽)
吞吐量
-
单位时间内通过某个网络的数据量。理解为规定一定时间内实际通过的数据量。
-
吞吐量是单位时间内所有的流量总和:上行+下行
时延
- 发送时延、传播时延、处理时延、排队时延
- 排队时延:分组在路由器中缓存等待处理的时间
- 处理时延:路由器对分组的一系列处理工作的时延,比如检查分组首部是否误码,提取目的地址,查找转发接口等等。
丢包率
出现如下情况,会发生丢包:
- 分组被检测出误码
- 分组交换机根据丢弃策略主动丢包,路由器的拥塞控制算法来决定,如果网络拥塞较高的话,会主动丢弃分组。
网络分层与协议
体系结构与物理实现

OSI七层模型:法律标准
- 划分不合理,有重复;效率低;没有商业驱动力
五层模型:原理参考模型
- 应用层:具体的应用程序的操作。(七层结构应用层又被分成:应用层、会话层、表示层)
- 传输层:应用层所有的数据通信的运输。相当于地图导航路线确定后,怎么走过去,用什么协议和方法传输,有很多控制方法,保障应用层交付的数据可以有稳定的数据传输。
- 网络层:专门负责路由、路径规划、分组转发、存储转发;相当于用地图导航规划出最优路线。
- 数据链路层:负责数据链,冲突检测,数字信号传输,相邻两个节点之间的接力传输
- 物理层:把数字信号转化为电信号、光信号;4G5G编码等。
TCPIP四层模型:事实标准

TCPIP网络是由小的子网通过路由器连接起来的。由于TCP/IP协议栈里面包含大量的协议,其中以IP和TCP最重要,所以以他俩为代表。
-
应用层:HTTP、SMTP、DNS、RTP(直播)
-
传输层:TCP、UDP
-
网际层:网际就是IP的意思(Internet Protocol)。
-
IP协议连接各种网络接口:IP over everything;各种网络应用都可以借助IP提供服务:Everything over IP

-
网络接口层:网线接口,Wifi:Wifi5 IEEE 802.11n-2009;Wifi6 IEEE 802.11ax
各层概述

物理层
数字信号、模拟信号、光信号的物理介质传输,考虑如下事情:
- 采用什么介质传播:同轴电缆、双绞线电缆、光纤、光缆等。
- 采用什么物理接口:RJ45网口等。
- 采用什么信号表示0和1。
数据链路层
考虑什么问题:
- 如何表示网络中的各个主机:主机编制,例如用MAC地址
- 从比特流中区分出地址和数据:数据封装格式
- 以太网交换机的实现(自学习和转发帧)
- 检测数据是否有误码(差错检测和出现差错如何处理)
-
流量控制
-
点对点通信、广播信道。
- 处理的是010101的数字信号。
- 载波监听多点接入/碰撞检测(CSMA/CD)
- 多点接入表示计算机以多点的方式连接在一根总线上
- 载波监听是指每一个站在发送数据之前先检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
链路层传输协议
IEEE 802.3(有线)、IEEE 802.11(无线)
- IEEE 802.11也分为几代
| IEEE标准 | 802.11a | 802.11b | 802.11g | 802.11n | 802.11ac | 802.11ax |
|---|---|---|---|---|---|---|
| Year Released | 1999 | 1999 | 2003 | 2009 | 2014 | 2019 |
| Frequency/GHz | 5 | 2.4 | 2.4 | 2.4、5 | 2.4、5 | 2.4、5 |
| Max Data Rate | 54 Mbps | 11 Mbps | 54 Mbps | 600 Mbps | 1.3 Gbps | 10-12 Gbps |
- Wifi 5 一般是支持到802.11ac
- Wifi 6 可以支持到802.11ax
网络层
需要考虑的问题:
- 标识网络,以及网络中的各个主机:IP地址的网络号和主机号
- 路由器转发分组:路由选择协议、路由表和转发表
特点
-
逻辑地址IP、物理地址MAC(网口、无线网卡、蓝牙等都有物理地址);二者相互转换的协议是ARP,是数据包传输过程中如何知道IP地址来找到某个硬件设备的物理地址。
-
提供主机之间的逻辑通信,是无连接的、尽最大努力交付的数据报服务。把一个一个切片好的分组,按照预先定好的路径传递到下一个路由器或者主机。
- 网络层不提供SLA,即分组可能出错丢失重复乱序,也不保证分组传送的时限。至于数据的差错处理、流量控制拥塞控制,是传输层要做的事情。
- 传输网络不提供端到端的可靠传输服务,优点是会使得网络中路由器的成本较低。
- 网络层最重要的是将每一个切片好的数据包加上源地址和目的地址。
网际协议IP
- ARP、ICMP、IGMP是与IP协议配套使用的协议
- 网络互相连接起来,防止电信号衰减,需要一些中继器(数据链路层中继系统:网桥;网络层中继系统:路由器;网络层以上的中继系统:网关)
传输层
需要考虑的问题:
-
进程之间的通信(用端口号标识进程)
-
差错处理(可靠传输和不可靠传输)
-
网络层不区分进程,不区分应用程序;而传输层为相互通信的应用进程提供了逻辑通信,加了端口号这个信息。
- 面向应用层提供通信服务,是面向通信部分的最高层,是用户功能中的最底层。
- 网络边缘部分的两个主机通过网络核心部分进行端到端的通信时,只有位于网络边缘的部分的主机协议栈才有运输层, 网络核心部分中的路由器在转发分组时都只用到下三层的功能。
TCP和UDP
- UDP
- 不管能不能建立连接,先把应用层交付的数据打包交给网络层、网际接口层,传输速度非常快,偶尔可能有丢包)
- 举例就是微信视频、语音,用UDP,可能偶尔有卡顿,意味着又少数丢包发生,但是无伤大雅;如果换成TCP的话,可能就会长时间处在等待连接的状态。
- TCP
- 三次握手:每发一个包都有一个握手的过程。
应用层
考虑的问题:
- 应用进程之间的交互来完成特定的网络应用
- 进行会话管理和数据表示(采用何种编码、是否加密、数据压缩等)
每个应用层协议都为了解决某一类问题。
实体、协议和服务

网络协议的组成要素
-
语法:数据控制信息的结构或格式
-
语义:需要发出何种信息,完成何种动作以及做出何种响应
-
同步:时间实现顺序的详细说明
PDU和SDU
- PDU:协议数据单元,Protocol data unit,是对等层次之间传输数据的单元,比如帧、分组等
- SDU:Service Data Unit,上下两层之间交换的数据包
物理层
把数据链路层封装好的帧,看作是比特流,转化为相应的电信号传输出去。
传输方式
串行和并行
- 串行传输:比特就在一条传输线路上走。
- 并行传输:比特被分到多条传输线路上走。
- 适合短距离传输:如CPU和内存之间的传输,根据线路数量可以分为8位 - 64位。
长距离传输一般采用串行传输,计算机网卡的一个重要作用就是串并转换。

同步和异步
单工、半双工和全双工
数据链路层
-
发送方的数据链路层:把网络层交付下来的分组封装成帧,交给物理层进行发送。
-
接收方的数据链路层:把物理层交付上来的帧中解封出分组,交付给网络层。
- 一般的网络适配器即网卡,就实现了物理层和数据链路层的功能。
封装成帧
透明传输
字节填充和比特填充
差错检测
奇偶校验和循环冗余校验(CRC)
可靠/不可靠传输
- 可靠传输:需要保证发送方发送什么,接收方就接收到什么。
-
不可靠传输:接收方自行丢弃有误码的帧即可,其他的不用做。
-
什么时候选择可靠或不可靠传输?
- 一般来说,有线链路的误码率较低,为了减小开销,并不要求数据链路层向上层提供可靠传输;即使出现了误码,由上层来处理即可。
- 无线链路的误码率较高,要求数据链路层必须提供可靠传输。
保证可靠的措施
- 停止-等待协议
- 回退N帧协议(滑动窗口)
- 选择重传协议
共享式以太网
- 用集线器+双绞线 在物理层扩展以太网
- 用网桥在数据链路层扩展以太网:网桥
- 网桥用来连接两个不同的以太网,每一个就称为网段。
- 透明网桥通过自学习,建立MAC转发表。
交换式以太网
网桥接口较少,仅为2-4个,仅用来连接不同的网段;而交换机接口较多,仅使用交换机的以太网称为交换式以太网。
- 交换式集线器:也称为二层交换机,可以直连计算机、集线器或者另一个交换机。
虚拟局域网
-
将多个站点通过交换机连接起来,形成交换式以太网。里面的所有站点都属于一个广播域,会带来广播风暴和潜在的安全问题。使用虚拟局域网,将站点划分为与物理位置无关的逻辑组的技术,叫VLAN,虚拟局域网。
-
在局域网中,广播帧是一种特殊的数据帧,它的目标地址是全1,即FF-FF-FF-FF-FF-FF,因此它会被发送给网络中的所有设备。广播帧在局域网中的作用主要包括以下几个方面:
-
发现网络中的其他设备
广播帧可以帮助设备发现网络中的其他设备。例如,当一个设备加入到局域网中时,它可以发送一个ARP请求的广播帧,以查找网络中其他设备的MAC地址。所有收到该广播帧的设备都会响应并提供自己的MAC地址,从而让该设备知道网络中其他设备的存在。
-
维护网络拓扑
广播帧可以帮助网络管理员维护网络拓扑。例如,网络管理员可以发送一个ICMP Echo Request广播帧,以测试网络中所有设备的可达性。所有收到该广播帧的设备都会响应,并将其回复发送回发送者,从而帮助网络管理员确定网络中哪些设备处于可用状态。
-
更新网络配置
广播帧可以帮助更新网络配置。例如,当一个设备请求DHCP分配IP地址时,它会发送一个DHCP请求的广播帧。DHCP服务器将接收到该广播帧并回复一个DHCP响应的广播帧,其中包含该设备的IP地址和其他网络配置信息。所有收到该DHCP响应广播帧的设备都会更新其网络配置。
网络层
作用
-
将分组从源主机,经过多个网络和链路,传输到目的主机。
-
核心功能是:分组转发和路由选择
向上层提供两种服务
虚电路
- 可靠传输由网络自身保证
- 两台计算机通信时,先建立网络层连接,即虚电路;双方沿着虚电路发送分组;每个分组按照逻辑连接存储转发,无差错按序到达、不丢失、不重复。
- 通信结束需要释放连接。任一节点故障都能使得虚电路失效。
数据报
- 可靠通信由用户主机来保证。
- 通信时网络层不需要连接,每个分组可能走不通的路径,可能误码、丢失、失序等。
- 将复杂的网络处理置于因特网的边缘;尽最大努力交付的分组交付功能置于因特网的核心。
- 路由器可以降低成本,网络造价降低,灵活。
网际协议IP
配套使用的协议
- ARP:Address Resolution Protocol,地址解析协议。
- ICMP:Internet Control Message Protocol
- IGMP:Internet Group Management Protocol
IPv4网络号与子网掩码
分类地址编址
- A、B、C类地址本来就有一个网络号,用子网掩码扩展出来的网络号来判断一共可以划分多少个子网:
- 比如218.75.230.0,子网掩码:255.255.255.128;C类本来前三位就是网络号,加上128对应的1个比特位表示扩展的网络号。所以可以划分的子网数为 2 ** 1 = 1
- 此时网络地址的划分就是网络号 + 子网号 + 主机号
无分类编址
由于C类地址数量巨大(2**24-3),但是每个网络包含的地址又太少(256),IETF又开发了无分类编址。
-
网络号改为网络前缀,不定长;配合一个32位的子网掩码。
-
CIDR地址就写成128.145.35.7/20这种斜线记法。/20表示地址前20位为网络号。
-
可以灵活分配地址空间;也方便路由器进行路由聚合
-
路由聚合:路由器会定期将自己的路由信息告知相邻路由器;路由器可以找出自己相连的网络的不同长度网络号的共同前缀,聚合成超网发给下个路由器,从而减少路由器信息交换量。

ARP协议
在同一个局域网内,通过IP地址,广播找对应主机的MAC地址。
- 主机会维护一个高速ARP缓存表,里面找到目的MAC就用;找不到就广播,将ARP报文封装到MAC帧中发送;目的主机收到后,ARP单播响应给源主机自己的MAC地址。
- 由网际层的IP地址获取数据链路层的ARP协议;所以把ARp划分到网际层或者数据链路层都可以。
- ARP 1982年就制定了,没考虑网络安全问题,没有安全验证机制,存在ARP欺骗和攻击问题。
为什么不直接用MAC地址进行通信?
- 路由器需要保存大量设备和主机的MAC地址,存储压力大。
- 有各种异构网络,使用不同形式的MAC地址,使这些异构网络通信就要用户层面实现复杂的MAC地址转换,非常困难。而用统一的IP地址来通信,把MAC地址转换的工作交给计算机软件来自动完成,比较方便。
IP报文首部格式
- 重点看下生存时间TTL:以跳数为单位,经过路由器就减去1,;若为0就丢弃。防止被错误路由的包不停的转发。
- 首部校验和采用的是因特网校验和,而非CRC校验,牺牲了一些检验精确性,但是更容易软件实现。
- 将首部字段二进制反码求和 - 再取反码。
路由配置
路由表匹配的时候如果有多条都符合,那么按照网络前缀最长的一条来匹配,因为网络号长意味着主机号短,匹配的精准度会更高。
静态路由
是指人工给路由器配置路由表。
-
当运维人员给路由器的各个接口配置了IP地址和子网掩码,路由器就可以自行得出自己的各个接口分别于那些网络是直连的。路由器会自己添加上直连类型的路由信息。
-
如果手动添加路由信息,就会是静态类型。
-
可以手动配置默认路由和特定主机路由

- 默认路由源IP写0.0.0.0/0表示任意网络;网络前缀为0,匹配时的优先级最低。
- 假设设置源主机192.168.2.1跳到特定的路由器,那么源IP写192.168.2.1/32,32为最长的网络前缀,匹配时的优先级最高。
路由选择协议
- 静态路由选择
人工添加网络路由、默认路由和特定主机路由;灵活性差,适用于较小规模的网络。
- 动态路由选择
路由器通过路由选择协议来自动获取路由信息。
分层次的路由选择协议
整个因特网分为很多层次,例如一个ISP划分为一个自治系统(AS)。
-
自治系统内部选择使用一些内部网关协议
-
自治系统之间采用一些外部网关协议
-
路由信息协议RIP:最早应用的内部网关协议
- 开放最短路径优先协议OSPF
- 边界网关协议BGP:属于外部网关协议的一种
路由器的组成
路由器的核心为:
- 路由选择部分
- 路由选择处理机,根据所使用的路由选择协议,周期性的与其他路由器信息交换,构建路由表
- 分组交换部分
- 输入端口、交换结构、输出端口

网际控制报文协议ICMP
发送差错报文或者询问报文;ICMP报文封装在IP报文中发送。
差错报文
-
终点不可达
-
源点控制
路由器或者主机因为拥塞而丢弃数据报,就向源点发送抑制报文,源点会降低发送频率。
-
生存时间超过
-
首部误码
-
改变路由(重定向)
询问报文
- 回送请求和回答
- 时钟同步请求和回答
ICMP典型应用
- 分组网间探测 ping
有些服务器会配置拒绝ping
-
跟踪路由
-
traceroute和tracert
- UNIX系统中,traceroute用的是传输层UDP协议
- Windows版本中,tracert用的是网络层ICMP协议
- 通过依次发送多个包,设置的生存时间不断+1,中间路由器由于生存时间结束而返回差错报文;直到目的主机返回ICMP回应报文,就知道一共经历了哪些跃点。
虚拟专用网VPN
背景
同一公司两个相隔很远的部门,各自在内网内有通信,并且都分配了内网地址;这时如果两个部门内的设备要互相通信:
- 可以租用ISP的专用通信线路来为本机构所用,但是租金太贵。
- 利用公用因特网来作为本机构各个专用网之间的通信载体。
内网地址
规定以下三种CIDR地址为内网专用地址:
- 10.0.0.0 - 10.255.255.255 (10/8)
- 172.16.0.0 - 172.31.255.255 (172.16/12)
- 192.168.0.0 - 192.168.255.255 (192.168/16)
目的地址为内网地址的,所有路由器一律不转发。
所以两个部门A和B都要至少一个路由器,具有公网IP;并且配置好VPN。
连接过程
- A中主机将要发送的内网数据报封装为内部IP数据报给路由器,路由器收到后发现目的端不在自己的子网,需要经由VPN-互联网才能送达,就进行加密,再重新添加上公网IP首部,发送给B内网的路由器;收到后再解开包,发送给对应的内网机器即可。
- 也称为IP隧道技术
分类
- 同一机构不同部门的内网环境搭建的VPN,称为内联VPN。
- 一个机构的VPN把其他机构(通常是合作伙伴)拉进来,称为外联VPN。
- 远程办公员工访问公司内部专用网时,运行VPN软件来获取内网访问,称为远程接入VPN。
网络地址转换NAT
基本NAT转换
- 拥有内网地址的设备向外网通信,发给NAT路由器,NAT路由器在公网IP地址池里面分配一个临时公网IP作为原地址来发送。
- 缺点是比较浪费公网IP,并且池子里的公网IP数量不足的话,内网设备要轮流使用。
网络地址与端口号转换
将NAT与传输层的端口号一起使用,可以使内网中大量设备共用NAT路由器的同一个公网IP,并且同时访问公网。
- 内网A发送的的数据报,在NAT路由器这里,将其源地址改为NAT路由器的公网IP,并且端口号改为随机分配一个新的端口号;路由器维护一个NAT转换表。
- 收到返回的包时,根据对应的NAT转换表在内网中转发。
问题
- NAT对网络应用而言并不完全透明,通信必须由内网发起,拥有内网IP的主机无法直接充当因特网中的服务器。
- 对于外网主机需要与内网主机进行通信的应用,需要网络应用自身使用一些NAT穿透技术来解决。
IP多播
与传统单播、广播技术不同,多播(组播,Multicast)用来实现一对多的通信。适合音视频的短时间、小空间传播,节省网络资源。

实现原理
- 将发送同一内容的客户端划分到同一个多播组,服务端只需要发送1个视频即可,链路上的路由器负责复制视频副本并转发,局域网具有硬件多播功能,无需复制即可想局域网内的多播组转发视频。
- 要求路由器要具备多播功能、识别多播数据报、以及多播路由选择协议。
- 多播分为:
- 只在本局域网内进行的硬件多播
- 在因特网上进行的多播。
IP多播地址与多播组
- D类地址被用作多播地址,并且只能用作目的地址,不能用作源地址;范围是224.0.0.0 - 239。255.255.255
- 每一个D类地址用于标识一个多播组;使用同一个多播地址接收多播数据报的所有主机就构成了一个多播组。
局域网硬件多播
-
局域网支持硬件多播:MAC地址有多播MAC地址。只需要把多播IP地址映射成局域网的硬件多播MAC地址,就能将多播IP数据报封装在局域网的MAC帧中。
-
但是多播MAC地址只有后23位是可以变的;而多播IP有32位,所以如果俩IP后23位一样,那么就对应了同一个多播MAC地址;所以收到多播数据报的主机还需要在网络层利用软件再进行过滤,通过目的多播IP来判断是不是给自己的。
因特网IP多播协议
- IGMP 网际组管理协议
- 作用是让连接在本地局域网上的多播路由器,知道本局域网上面是否有主机(中的某个进程)加入或退出了某个多播组。多播路由器仅关心自己网络中有哪些多播组。加入或退出多播组也通过向多播路由器发送IGMP成员报告的IP多播数据包来实现。
- 也就是说IGMP仅在本网络有效。并不能知道多播组里面有哪些主机和分布在哪里。
- 多播路由选择协议
- 作用是将多播数据报以最小代价传递给所有组成员;该协议会在多播路由器之间为每个多播组建立多播转发树,IP多播数据报沿着多播转发书进行洪泛,就可以传送到所有组成员路由器。
移动IP技术
背景
-
移动状态的用户,可能在不同网络之间移动,如果IP也跟随这网络的变换而变换,那会影响网络通信。
-
因此,通过移动IP技术来实现移动主机在各个网络之间漫游时,保持原来的IP不变。
- 归属网络、归属地址、永久地址
- 每个移动主机都有初始默认连接到的网络,称为归属网络
- 移动主机在归属网络中的IP是固定的,称为归属地址
- 代表移动主机执行移动管理的,一般是归属网络上的路由器,称为归属代理。
- 外地网络、外地代理、转交地址
- 移动主机当前漫游的网络称为外地网络,在外地网络中执行移动管理的路由器成为外地代理。
- 外地代理通常会为主机提供一个转交地址。
工作过程
当移动主机漫游到外地网络时:
- 归属代理会为该移动主机代收所有发送给该移动主机的数据报
- 归属代理将数据报,利用转交IP-in-IP隧道,转交给外地代理
- 外地代理将数据报转交给移动主机。
对于移动主机而言,都是透明的,不需要安装任何协议、软件。

软件定义网络SDN
- 举例:路由器转发分组的速度很快,纳秒级别;但是路由表的维护是依靠定期与周围路由器交换路由表来实现的,速度慢,秒级别。
- 如果路由器中的路由选择软件都不存在,而是交给控制层面的逻辑上集中的控制器来为每个路由器下发路由表,速度就快了。
- 控制平面和数据平面分离,虽然在因特网范围内是不可行的,但是在一些大型数据中心的广域网上实现,可以提高网络的运行效率。
OpenFlow协议
- 新型网络体系结构,将控制平面与数据平面分离;openflow协议可以看做是:控制平面与数据平面相互通信的接口
传输层
作用
物理层、数据链路层、网络层解决了如何将异构网络连接起来的问题;传输层解决主机进程之间的通信问题。

端口号

端口号只具有本地意义,区分协议栈中的各个应用进程。
-
服务器端使用的端口号
-
熟知端口号,即全球通用端口号:
FTP SMTP DNS DHCP HTTP BGP HTTPS RIP 21/20 25 53 67/68 80 179 443 520 -
登记端口号:特定服务商给IANA登记。
-
客户端端口号
又称临时端口号,客户进程在运行的时候临时分配的。
TCP与UDP
对比
- 发送方式对比
- UDP支持单播、多播、广播;
-
TCP是一对一,仅支持单播。
-
对待数据报的方式对比:
- UDP是面向报文的:直接给应用层报文加一个UDP首部就发送;
- TCP是面向字节流的:将应用层交付的报文,看作是一连串字节流,保存在发送缓存中,根据发送策略每次提取一部分,构建出TCP报文段发送;接收方应用进程接收到的数据块,和发送方应用进程发送的数据块,不具有大小对应关系。例如发送方进程交付TCP10个报文,接收方TCP仅用了4个数据块就交付给应用进程了。
- 数据传输可靠性
- UDP向上层提供无连接不可靠的传输服务。误码,接收方直接丢;丢包,发送方不管。
- TCP向上层提供有连接可靠的传输服务。
TCP
TCP由首部字段和数据载荷构成;首部字段体现了TCP的功能。
首部字段
参考下文《网络是怎样连接的》TCP首部字段部分
流量控制
- 接收方根据自己的接收缓存的大小,来控制发送方的发送频率。通过滑动窗口来实现。
- 滑动窗口简而言之就是发送方根据接收方返回来的累计确认报文段后,滑动窗口向前移动,将已发送并且已被确认收到的部分移出发送缓存;并且会根据接收方告知的可接收缓存大小来调整滑动窗口的大小。
- 双方发送方的发送窗口为0,接收方的接收窗口也是0,那么两者之间不会有报文发送,相互等待中。如果接收方缓存清出来了,可以接受了,但是告知发送方的报文段丢失了,那就形成死锁了;互相等待。
- 解决这种非零窗口通知报文段丢失的问题,TCP为每个连接设置了持续计时器。只要任何一方收到零窗口通知,就启动计时器,计时器超时后就发送零窗口探测报文段,询问对方窗口值。这样可以打破死锁。
拥塞控制?
流量控制是保证发送方发送数据的速率不要一直超过接收方可以接受的能力;而拥塞控制是防止过多的数据注入到网络中从而超过网络的负荷,是一个全局性的问题。
闭环控制算法?
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
TCP拥塞控制与网络层拥塞控制的关系?
TCP可靠传输的实现?
TCP超时重传时间的选择?
应用层
动态主机配置DHCP
- 主机一般需要配置以下参数:IP地址、子网掩码、默认网关、DNS服务器地址。DHCP可以为计算机自动配置网络参数。
- 采用CS模式,客户端运行DHCP客户进程,DHCP服务器运行服务进程;采用UDP发送DHCP报文。
工作过程
- DHCP客户端寻找DHCP服务器 - DHCP服务器向客户端提供IP租用 - DHCP客户端接收IP租约 - DHCP服务器确认租约 - 客户端随时可以解除租约
DHCP中继代理
并不愿意在每个网络上都设置一个DHCP服务器,所以可以给一些路由器配置上DHCP服务器的IP地址,使之成为DHCP中继代理;代理接收到客户端DHCP报文会将其单播给DHCP服务器。
文件传送协议FTP
工作原理
客户端与服务端的连接有两种:
- 控制连接:传送控制命令;服务端监听21端口
- 数据连接:用于文件传输,每次文件传输才建立,传输结束就关闭。
主动模式
要传数据时,客户端告知服务器来连接自己;服务端使用20端口。

被动模式
要传数据时,客户端告知服务器建好某个端口,来等待客户端连接

电子邮件
组成
- 用户代理(电子邮件的客户端软件)
- 邮件服务器
- 相关协议
- 发送协议:SMTP等
- 读取协议:POP3、IMAP等
- 通过互联网收发邮件,用HTTP协议
发送与接收

网络是怎样连接的:从浏览器到Web服务器
Web浏览器
输入URL - 生成HTTP请求 - 浏览器会将请求消息委托给操作系统的协议栈来帮忙处理。
HTTP请求
- 客户端 -- Request: [Header] + [URI + 方法] --> Web服务器
- Web服务器 -- Response: [状态码] + [header + 网页数据] --> 客户端
HTTP方法
- GET
- GET获取文件时,一条request只能获取一个文件,所以网页中有多个图片、文件等内容是,需要分开发送多条request。
-
所以,网页中的文本和数据往往是分开存放的,读取他们的操作也是分别独立进行的。
-
POST
使用POST方法时,URI会指向Web服务器中运行的一个应用程序。比如index.cgi。CGI是web服务器调用其他程序的规则。
DNS
DNS客户端与解析器
- 向DNS server发送查询请求,接收DNS server返回的响应;换句话说,计算机内要有DNS client,这个DNS客户端称为DNS解析器。
- DNS解析器是一段程序,包含在操作系统的Socket库内。
Socket库
- 库是一堆通用程序的集合,其他的应用程序可以直接调用其中的组件。
- Socket库可以让其他应用程序调用操作系统的网络功能。
- Socket库是UNIX系统BSD开发的C语言库,其他操作系统基本都是按照socket库来编写自己相应的网络库。
解析器的内部原理
-
解析器 - 协议栈 - 网卡 - 发送请求
-
协议栈又叫TCPIP驱动,在这里负责UDP消息的生成和接收。
DNS服务器的记录类型
- A记录,表示域名对应的是IP地址;MX表示域名对应邮件服务器。
协议栈与网卡
- 协议栈,即网络控制软件,会将从浏览器收到的消息打包,加上目的地址等控制信息,交给网卡。(协议栈还具有重新发包、调整发送速率等功能)
- 网卡:将从协议栈收到的包转换为电信号,发送出去。
委托协议栈发送消息
- 需要按照指定的顺序来调用Socket库中的程序组件。
集线器、交换机、路由器
家里的路由器为例,通过ADSL或者光纤到户(FTTH)的方式接入到互联网。
接入网、网络运营商
接入网
数据从接入互联网的路由器出发,进入了互联网的内部,互联网的入口线路称为接入网。
接入点
接入网连接到网络运营商的地方称为接入点(Point of Presence,PoP)。
骨干网
接入网的后面就是骨干网,骨干网中存在运营商中心机房中的路由器。数据通过这些路由器抓送到目的地址。
防火墙、缓存服务器
数据包到达Web服务器的局域网中
防火墙
首先会通过防火墙对包进行检查。
缓存服务器
-
网页数据中有一部分是可以重复利用的,这部分内容会被存放在缓存服务器中。
-
如果缓存服务器中正好有请求所需的内容,那么就直接从缓存服务器中读出所需内容。
此外,大型web服务器中还会存在LoadBalancer将请求分布到多台服务器上;还可能会有分布在整个互联网中的CDN来负责分发内容。
Web服务器
请求若到达Web服务器,同样会被协议栈解包,给web服务器程序。web服务器处理请求之后,通过协议栈发回给客户端。
用电信号传输TCPIP数据
协议栈

套接字
-
管道两端的数据出入口,本质就是TCPIP协议的软件实现,是一组接口,将复杂的协议隐藏在socket接口后面,用户调用接口获得功能即可。也有人将socket称为是IP:port,套接字的实体就是通信控制信息,包括IP 端口号 通信状态等。
-
建立管道,aka连接,aka Connection,aka Session
-
服务端程序一般在启动后就创建好套接字并等待客户端连接管道。
-
客户端建立套接字,接入服务端管道。
-
数据只要送入套接字就可以收发数据了。在close之前,管道都有效。
-
同一系统内同时存在多个套接字时,应用程序通过描述符来识别套接字;对方通过端口号来识别对应的应用程序。客户端创建套接字时,会被随机分配一个端口号。描述符就好像收发行李的号码牌一样,协议栈用来标识不同的套接字。
-
协议栈要通过通信状态控制信息来确定下一步动作。
-
windows中通过netstat -ano 查看套接字:

-
解释:进程号为6672的进程,正在使用地址为192.168.0.103的网卡地址与20.198.162.78的对象通信;并且本机使用1146端口,对方使用443端口。
-
特殊情况:0.0.0.0表示还未开始通信,不知道IP地址;*:*表示UDP连接,不绑定对方的IP和端口号。
-
什么是建立连接:连接实际上是通信双方交换控制信息,在套接字中记录这些信息,并准备收发数据的一连串操作。客户端向服务端传达开始连接的请求,也是连接操作的目的之一。
控制信息
通信时双方交换的控制信息 - 即TCP头部

有两种包的类型:
- 存放数据的网络包
- 只有控制信息的网络包
保存在套接字中 - 控制协议栈的信息
-
保存在协议栈的内存空间中。
-
应用程序传递来的信息、从对象接收到的信息都保存在此。
- 不同系统的协议栈实现不同,必要的控制信息就不同。
收发数据
- 协议栈并不是一收到数据就会发送出去,而是会将数据存放在内部的发送缓冲区中,等待应用程序的下一段数据:
- 判断标准1:累积到一定量再发出去。
- 判断标准2:累计一定时间再发出去。
- 这两者是互相矛盾的:长度优先,效率高;时间有限,时延低。这个参数一般是可选的。
- MTU:以太网中一个网络包的最大长度,一般是1500字节。包含了TCP和IP的头部。
- MSS:掐头之后,网络包能容纳TCP的最大长度。TCP和IP头部一般是40字节,所以以太网MSS一般是1460字节。
使用ACK号确认网络包已经收到
- ACK号保存了接收方总共收到了多少字节。
- ACK控制位的比特设为1,代表ACK号是有效的。
序号SYN:初值
- 序号并不是从1开始的,这会容易被猜到,而是从一个随机数算出的初值。
- 序号的初值是一开始发送的SYN号,并将SYN控制位设为1
三次握手建立连接
- 客户端计算出:从客户端 - 服务端通信的序号初值,放到SYN号里面,把SYN值设为1,发给服务端。
- 服务端通过初值计算出ACK号,发给客户端;同时把从服务端 - 客户端通信的初值通过SYN号发给客户端。
- 客户端通过SYN号算出ACK号,发给服务端。
超时重传机制
- 发送完包之后,发送过的包都会保存在缓冲区;如果未能收到ACK号,就重新发送这些包。
- 这一机制使得网卡、集线器、路由器都没有错误补偿机制。依赖TCP的超时重传机制即可。
滑动窗口与缓冲区
- 不必在等待ACK号时啥也不干,发送方可以持续发送数据。发多少呢?
- 接收方会通过TCP头部的窗口字段告诉发送方,自己的缓冲区可以处理多少数据。
- 双方缓冲区的大小称为窗口大小,是TCP调优的著名参数。
- 窗口更新理论上会发生在协议栈拿出缓冲区的数据给应用程序处理之后。实际上,窗口更新和ACK号如果时间合适,会合并发出去。
四次挥手断开连接
- 一般由应用程序判断。
- 服务端应用程序调用Socket库中的close程序,协议栈会生成包含断开信息的TCP头部。具体来说就是将控制位的FIN设为1,委托IP模块将信息发送,同时服务端的套接字会记录断开操作的信息。
- 客户端收到FIN=1的TCP头部,会将自己的套接字标记为断开状态。发送ACK号。
- 客户端发送完所有数据之后,也是发送FIN号给服务端。服务端收到后返回ACK号。
- 服务端发出ACK号之后,等待2MSL,关闭连接。(2MSL原因:等待网络中重传包消失;防止ACK没到达)
IP与以太网的包收发操作
- 子网中通过集线器将网络包传输至下一个路由;网络中路由器负责根据目标地址判断下一个路由位置。
- 集线器是按照以太网规则传输包;路由器是按照IP规则传输包。
- 具体来说,TCP头部包含两头部:MAC头部和IP头部。
头部的工作原理
- 发送方将目的地址写到IP头部,IP协议就知道下个路由器的IP地址。
- IP协议会委托以太网协议将包传输过去,这时IP协议就会查找下一个路由器的MAC地址,并写入MAC头部。以太网协议就会发送包过去。
- 采用出了以太网协议之外的协议传输时(比如无线局域网、ADSL、FTTH等),MAC头部会替换成适合该协议的头部。
- 路由表:用 route print 来看。Gateway一列表示下一个发送给谁(下一个路由器)
- 下一跳的MAC地址,用ARP协议获得,在子网内广播:“这个IP是谁的?报上MAC地址”,MAC地址会存在ARP缓存中,通过 arp -a来看。ARP缓存几分钟自动清理一次。
以太网
-
是一种以多台计算机能够彼此自由廉价的相互通信而设计的通信技术。
-
交换机连接各个机器
网卡接收包
- 网卡接收返回的包过程中,CPU并不是一直监听着网卡的活动,而是去执行其他任务。
- 网卡向扩展总线中的中断信号线发送信号,该线通过计算机的中断控制器连接到CPU产生中断信号。
- 接收到中断信号,CPU会挂起正在处理的任务,切换到操作系统中的中断处理程序。
- 中断处理程序会调用网卡驱动,去控制网卡执行接收操作。
将服务器的响应包从IP传递给TCP
-
如果检测到以太类型0800(代表IP协议),网卡驱动会将包交给TCPIP协议栈处理。
-
如果IP模块检测到不是自己的IP,那么直接将包丢弃,不负责转发;并且IP模块会通过ICMP消息将错误告知发送方。
注:有些服务器的操作系统具备包转发功能,当收到不是自己的包的时候,会转发。
- ICMP消息:

UDP协议收发操作
不需要重发的数据,用UDP发送更加高效;如果消息比较短,一个包就能装下,那么也用不着考虑复杂的重传机制;只需要一个接收确认即可。这种情况就适合UDP。
-
发送:从应用程序获取的数据加上UDP头部,交给IP进行发送就行了。
-
接收:根据IP头部中的接收方和发送方地址,找到相应的套接字,交给相应的应用程序就行了。
- 过程中不会像TCP一样对包的送达状态进行监控。一旦出错,收不到对方的回复,应用程序再重发一遍就行了。
音频和视频等要求低时延的场景,包送达晚一那么一点,就会产生卡顿,重发于事无补。
- 不过由于UDP经常会被防火墙阻拦,因此当需要穿越防火墙传输音视频的时候,尽管需要消耗额外的带宽,也得走TCP了。
从网线到网络设备
集线器
集线器会将信号原封不动的广播给所有连接在上面的线路,收到信号的设备(主机、路由器、交换机等)再去根据MAC头部来判断是否是发给自己的,不是就丢弃。
交换机
- 交换机的MAC端口不校验MAC地址,本身也不具有MAC地址,一股脑的把所有包接收。
- 交换机通过MAC路由表来判断下一个包转发到哪个端口。通过交换电路发过去。
路由器
- 一般电脑的网卡只支持以太网和无线局域网;而路由器支持更多,如ADSL、FTTH以及各种宽带专线等。只要端口硬件安装了支持这些技术的硬件即可。
- 路由器委托端口硬件将包接收进来,转发模块根据目的端的IP地址查路由表,然后转发模块将包转移到转发模块对应的端口,端口再根据硬件规则将包转发过去。
- 路由器的端口具有IP地址和MAC地址,可以成为以太网的接收方和发送方。实际上,路由器先作为接收方收包,在作为发送方发包。作为对比,交换机只是将进来的包转发出去而已,自己并不是发送和接收方。
路由表
- 路由表会忽略主机号,只匹配网络号。
路由表的子网掩码有点特殊,只表示在匹配网络包目的地址的时候,需要对比的比特数量。
- 如果要将某台计算机的地址写入路由表的话,就将子网掩码设为255.255.255.255。

-
匹配时若有多条记录符合,按照最长原则匹配:匹配网络号最长的(意味着子网范围内主机数更少,更容易匹配到);网络号相同长度就匹配跃点数最少的。
-
如果没找到匹配上的,看看路由表有没有设置默认路由(即目标地址为0.0.0.0,子网掩码为0.0.0.0的),即上图最后一行,配置了默认网关,会被转发到这里。
Summary:IP(路由器)负责包送到通信对象的整体过程,而其中将包具体传输到下一个路由器的操作是由以太网(交换机)来实现的。现在家用路由器基本都集成了路由器和交换机的功能。
路由器的附加功能
地址转换
- 规定的内网地址:
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
内网地址出外网经过路由器的地址转换为公网地址。
-
地址转换的基本原理是路由器进行包转发时,对IP头部的IP地址和端口号进行改写。NAT设备会随机选择一个空闲端口作为发送方的套接字。并记录下对应的转换表。
-
收到返回的包的时候再通过端口号找到内网中的终端来转发。实际的通信设备将就是NAT设备。

- IP地址转换都伴随着端口号的转换,原因是内网中不同的设备,对外只能使用同一个公有IP地址时,可以用不同的端口号来识别内网中的不同终端。
- 不仅是路由器,有些防火墙也具有NAT功能。
从互联网访问公司内网
- 内网访问公网,由NAT设备转发即可;但是如果内网机器没访问过公网,NAT设备中就没有记录,公网的包就发不进来。这是一种防入侵的机制。
- 如果希望从公网访问内网,可以把用于公网访问的服务器放到NAT设备外面,把服务器的内网IP和端口号手动加到NAT中。
接入网
- 连接互联网与家庭、公司网络的通信线路
ADSL
FTTH
服务端局域网
一般来说,开放给外网的服务器跟公司内网跟分开部署,会部署在数据中心,会与运营商的直接相连;换句话说,数据中心通过高速线路直接连接到互联网的核心部分。
防火墙
-
防火墙可分为包过滤、应用层网关、电路层网关等;应用最广泛的就是包过滤。只允许发往特定服务器的特定应用程序的包通过,然后屏蔽其他的包。
-
用于包过滤的头部控制字段:


- 通常,包过滤规则以访问控制列表(ACL)的方式存在防火墙中,示例如下:
| 编号 | 方向 | 源IP地址 | 目的IP地址 | 协议 | 源端口 | 目的端口 | 处理方法 |
|---|---|---|---|---|---|---|---|
| 1 | 出 | 内网地址 | 因特网地址 | TCP | 大于1023 | 80 | 允许通过 |
| 2 | 入 | 因特网地址 | 内网地址 | TCP | 80 | 大于1023 | 允许通过 |
| 3 | 出 | 192.168.1.252 | 因特网地址 | TCP | 25 | 大于1023 | 允许通过 |
| 4 | 入 | 因特网地址 | 192.168.1.252 | TCP | 大于1023 | 25 | 允许通过 |
| 5 | 入 | 211.67.230.1 | 内网地址 | 任意 | 任意 | 任意 | 拒绝通过 |
负载均衡
单台服务器不能很好的响应大量用户的请求,可以采用分布式架构,用多台服务器分担。
典型方式:轮询
-
比如给一个域名分配上三个ip地址(1、2、3),客户端访问的时候,会先找DNS服务器解析域名:
-
第一次访问,返回1、2、3;
- 第二次访问,返回2、3、1;
- 第三次访问,返回3、1、2。
- 第四次访问有回到了第一次的结果1、2、3.
这种方式可以将请求平均分布到这三台服务器,缺点是:1. 不能识别故障服务器;2. 有些操作需要跨多个页面,这期间访问的服务期发生变化,前面的状态就无法被记录。
负载均衡器
- 前端配一个LB,将LB的IP注册给DNS服务器;客户端请求发送到LB,由他来判断将请求转发到哪一台服务器。
-
如果某个操作需要跨多个页面(比如在某个页面填写收货地址,下一个页面填写信用卡号),就一定要转发到同一台服务器上。
-
问题出现:LB如何判断某个请求是不是来自需要跨多个页面的?
- 通过HTTP不好判断,因为HTTP的基本工作方式是发送请求消息之前先建立TCP连接,服务器发送响应消息之后就断开,下次访问服务器再重新建立TCP连接。在web服务器看来每一次都是独立的访问。
- 可以在HTTP头部加上用来判断相关性的信息:Cookie。
缓存服务器
- 除了用多台功能相同的服务器,还可以将服务器分为不同的功能,例如使用缓存服务器。
- 缓存服务器是通过代理机制,对数据进行缓存的服务器,可以将web服务器返回的数据保存在缓存磁盘中,代替服务器将数据发给客户端。
工作过程
- 如果命中缓存,缓存服务器会向服务器发送带If-Modified-Since字段来检查缓存内容是否变化,服务器对比变化/没变化,快速响应给缓存服务器;缓存服务器再返回给客户端。
- 如果未能命中缓存,缓存服务器会以客户端的角色向服务器发送请求获取内容;并将服务器返回的内容保存到缓存中;同时返回给客户端。
正向代理
正向代理相当于客户端一侧的缓存服务器,也有防火墙的功能:
- 会先接受内网中的公网访问请求,相当于application gateway,根据HTTP请求内容进行相应的转发,获取返回内容,并且有缓存功能。
- 使用正向代理需要在浏览器中,代理服务器一栏,填写正向代理服务器的IP地址,浏览器直接发给代理服务器。
内容分发CDN
背景
缓存服务器放在客户端和服务端都有弊端:
- 放在客户端,虽然能避免网络中的一些拥塞点增加的延时;但是服务器运营者不方便维护(扩容啥的),甚至都不知道客户端有没有缓存服务器。
- 放在服务端,虽然能减轻服务器的压力,但是实际上无法减少网络中的流量。
解决方案:web运营者与网络运营商签约,将缓存服务器部署在运营商那边,离用户更近了,能减少网络流量,web运营者也能控制服务器。
新的问题又来了:
- 运营商这么多,不可能在每个运营商里面都部署吧,太多了。
- 单个web运营者,跟IDP签约,太贵了。
所以,CDSP,即内容分发服务商应运而生
- 一方面CDSP会与多个供应商签约,部署很多台缓存服务器;另一方面,CDSP会与web运营者签约,提供缓存服务器来给web运营者使用,并且缓存服务器会与多个web运营者共享,降低成本。
缓存功能
- 为让缓存服务器不用每次命中缓存的时候都去问服务器要对比相应信息;CDN的缓存服务器具备只要服务器端内容发生更新就立刻通知缓存服务器的功能。
- 网页内容分为:静态内容、CGI程序生成的动态内容;动态页面不能保存在缓存服务器撒花姑娘,静态的可以。
服务器
服务端与客户端的区别
- 服务器里面的网络相关的软硬件,如网卡、协议栈、socket库等功能和客户端并未区别,区别是在:
- 连接过程中,客户端是主动发起连接,服务端是等待连接;因此应用程序调用socket的组件不同。
- 服务器程序可以同时和多台客户端计算机进行通信,和客户端程序的结构也会不同。
服务端程序的结构

- 服务端程序起来之后,等待连接模块就创建好套接字进入等待连接的状态
- 客户端请求进来之后,该模块接受连接,启动客户端通信模块,移交套接字;通信模块就和客户端通信,结束后通信模块就退出。
- 每当有新的客户端进来,都会启动一个新的客户端通信模块,服务端通信模块与客户端是一对一的状态。
请求URI
- 请求的目录一般是虚拟目录,在服务器中转换为实际目录。
- 有时会请求CGI程序,服务器会将参数传给CGI程序,获取返回值。