计算机网络概述
计算机网络发展简史
互联网发展历史
- 第一阶段:单个网络ARPANET(计算机直接连接交换机)
- 第二阶段:三级结构互联网(主干网—地区网—校园网)
- 第三阶段:多层次ISP(主干ISP—地区ISP—需要网络的地方)
中国互联网发展历史
- 1980开始互联网实验
- 1989第一个公共网络建立运行
- 1994接入国际互联网
计算机网络层次结构
层次结构设计基本原则
分层实现不同功能
- 各层之间相互独立
- 每层有足够的灵活性
- 各层之间完全解耦
OSI七层模型
未被市场接受的原因:
- 缺乏实际经验
- 标准制定周期过长,设备无法及时进入市场
- 部分制定不合理
TCP/IP四层模型
现代互联网的网络拓扑
边缘部分
家庭
终端机器——路由器——网关——地区ISP
企业
终端机器——路由器——内部网关——统一网关——地区ISP
核心部分
地区ISP——主干ISP
- 客户—服务器(C/S)模式
- 对等连接(P2P)模式
计算机网络性能指标
速率:1bps = bit/s
-
时延:
-
发送时延:数据长度/发送速率(网卡)
-
传播时延:传输距离/传播速率(传输介质)
-
排队时延:数据包等待被处理的时间
-
处理时延:数据包被机器处理需要的时间
-
-
往返时间RTT(评估网络质量)
- RTT表示数据报文在端到端通信中来回一次的时间
- ping查看RTT
计算机网络层次
物理层
作用
- 连接不同物理设备
- 传输比特流
- 介质:双绞线,同轴电缆,光纤,红外线,无线,激光...
信道
- 往一个方向传送信息的媒体
- 一条通信电路包含一个接收信道和一个发送信道
- 单工~:只有一个方向(有线电视。。。)
- 半双工~:不能同时传输
- 全双工~:双方都可以同时发送接收
分用-复用技术
一个分用信道,一个复用信道提高运输效率
数据链路层
封装成帧
- 帧是数据链路层的基本单位
- 发送端在网络层的一段数据前后添加特定标记形成 帧
- 接收端通过标记识别出帧(物理层不识别)
透明传输
- 控制字符在帧数据中,但当做不存在处理
- 透明化处理:在前面加转义字符esc
差错检测
-
物理层只传输比特流
-
奇偶校验码
-
循环冗余校验码CRC
MTU——最大传输单元
- 数据链路层的数据帧长度受MTU限制
- 以太网MTU一般为1500字节
- 路径MTU由链路中最小MTU影响
以太网协议
-
MAC地址——物理地址,硬件地址(唯一)
- 共48位,用十六进制表示
- 路由器匹配MAC地址表,找到对应的网路接口
-
以太网协议——是一种使用广泛的局域网技术
-
应用于数据链路层
-
可以完成相邻设备的数据帧传输
-
格式:
-
目的地址 = MAC地址
-
有目的地址:
- 没有目的地址:
网络层
IP协议
ip地址(用点分十进制表示 2^32)
-
ip地址长度:32位,常分为4个8位
-
格式:
-
八位协议:表明ip数据所携带的具体数据是什么协议的
-
16位首部校验和:检验数据是否出现错误
-
受网络影响,可变的
- ip协议使得复杂的实际网络成为了一个虚拟互联的网络
- ip协议使得网络层可以屏蔽底层细节而专注网络层的数据转发
- ip协议解决了在虚拟网络中数据报传输路径的问题
虚拟互连网络
- 物理设备通过使用ip协议,屏蔽了物理网络之间的差异
- 当网络中的主机使用ip协议连接时,无需关注网络细节
ip协议的转发流程
逐跳(hop-by-hop)
- 数据帧每一跳mac地址都在变化
- ip数据报每一跳ip地址始终不变
路由表
包括目的ip地址和下一跳ip地址。
计算机和路由器都有路由表
ARP协议与RARP协议
- (R)ARP协议是TCP/IP协议栈里基础的协议
- ARP和RARP操作对程序员是透明的
- 理解(R)ARP协议有助于理解网络分层的细节
ARP协议(地址解析协议):
网络层IP32位地址通过ARP协议转换为数据链路层MAC48位地址
- ARP缓存表是ARP协议和RARP协议运行的关键
- ARP缓存表缓存了IP地址到硬件地址之间的映射关系(不是唯一映射,会改变)
- ARP缓存表有一定的期限
RARP协议(逆地址解析协议)
IP地址的子网划分
分类的IP地址(三类)
D类:1110
E类:1111
特殊的主机号
- 0.x.x.x表示当前网络段,不可分配特定主机
- 1.x.x.x表示广播地址,向当前网络段所有主机发送信息
特殊的网络号
- A类地址网络段全0(00000000)表示特殊网络
- A类地址网络段后7位全为1(01111111:127)表示回环地址
- B类地址网络段(10000000.00000000:128.0)是不可使用的
- C类地址网络段(192.0.0)是不可使用的
127.0.0.1:通常表示为本地回环地址,不属于任何一个有类别地址类,它代表设备的本地虚拟接口,默认看做永远不会宕掉的接口。一般用于检查本地网络协议,基本数据接口是否异常。
划分子网
子网掩码
- 子网掩码和IP地址一样都是32位
- 子网掩码由连续的1和连续的0组成
- 某个子网的子网掩码具备网络号位数个连续的1
无分类编址CIDR(现代进行IP地址划分的方法)
- CIDR中没有A,B,C类网络号,和子网划分的概念
- CIDR将网络前缀相同的IP地址称为一个CIDR地址块
- 网络前缀是任一位数的
- 相对于子网划分更加灵活
- 子网/超网
网络地址转换NAT技术(NetworkAddressTranslation)
- NAT技术用于多个主机通过一个共有IP访问互联网的私有网络中
- NAT减缓了IP地址的消耗,但是增加了网络通信的复杂度(本机虚拟机,内网通信)
why
- IPv4最多只有40+亿个IP地址
- 早期IP地址的不合理规划导致IP号的浪费
公司/家庭对外使用全球唯一的外网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(支持万数量级设备)
外网地址
- 全球范围使用
- 全球全网统一
How
ICMP协议
- 网络控制报文协议
- ICMP协议可以报告错误信息或者异常状况
- 通过封装在IP协议中进行辅助IP协议传输
- ICMP报文首部:8位类型,8位代码,16位校验和
两个功能
差错报告报文
询问报文
ICMP协议的应用
Ping应用(询问报文——0/8)
- 判断网络是否连通
- Ping回环地址127.0.0.1
- Ping网关地址
- Ping远端地址
Traceroute应用(利用差错报告报文)
- 探测IP数据报在网络中走过的路径
- 利用ICMP终点不可达差错报文
网络层的路由概述
路由算法
对互联网进行划分
自治系统
- 一个自治系统(AS)是处于一个管理机构下的网络设备群
- AS内部网络网络自行管理,AS对外提供一个或者多个出(入)口
- 自治系统内部路由的协议称为:内部网关协议(RIP,OSPF)
- 自治系统外部路由的协议称之为:外部网关协议(BGP)
内部网关路由协议——RIP协议
距离矢量(DV)算法
RIP协议的过程
- RIP协议把网络的跳数作为DV算法的距离
- RIP协议每隔30s交换一次路由信息
- 跳数>15路由认为是不可达路由
- 优点:实现简单,开销小
- 缺点:限制了网络的规模,更新时间收敛长
内部网关路由协议——OSPF协议
链路状态协议(LS)
- 向所有路由器发送信息
- 消息描述该路由器与相邻路由器的链路状态(距离,时延,带宽)
- 只有链路状态发生变化才发送更新消息
OSPF协议的过程(开放最短路径优先)
- 核心:Dijkstra算法
解决有权图从一个节点到其他节点的最短路径问题
-
获得网络中的所有信息 —> “网络的完整拓扑”(链路状态数据库(全网一致))
-
OSPF协议更加客观,更加先进
-
减少了数据的交换,更快收敛
五种消息类型
- 问候消息(hello)
- 链路状态数据库描述信息
- 链路状态请求信息
- 链路状态更新信息
- 链路状态确认信息
OSPF和RIP协议对比
外部网关路由协议——BGP协议
-
BGP——边际网关协议
-
运行在AS之间的一种协议,BGP协议进行协调,能够找到一条到达目的比较好的路由
why
- AS内部使用不同的路由协议
- AS之间需要考虑除网络特性以外的因素
BGP发言人
- BGP不关心内部网络拓扑
- AS之间通过BGP发言人交流信息
- BGP发言人可以人为配置策略
传输层
- 管理端到端的通信连接
- 使用端口(Port)来标记不同的网络进程
- 端口(Port)使用16比特位表示(0-65535)
| FTP | HTTP | HTTPS | DNS | TELNET |
|---|---|---|---|---|
| 21 | 80 | 443 | 53 | 23 |
UDP协议(用户数据报协议)
-
UDP是无连接协议
-
UDP不保证可靠数据,无法保证数据在网络中是否丢失
-
UDP面向报文传输,不进行任何处理
-
UDP没有拥塞控制
-
UDP首部开销小
UDP首部
| 16位源端口号 | 16位目的端口号 |
|---|---|
| 16位UDP长度 | 16位UDP校验和 |
应用场景
- 多媒体信息分发(视频,语音等)
TCP协议(传输控制协议)
- TCP是面向连接的协议
- TCP一个连接有两段(p2p-点对点通信)
- TCP提供可靠的传输服务
- 全双工通信
- 面向字节流
TCP协议首部
序号
- 0-2^32-1
- 一个字节一个序号
- 数据首字节序号
确认号
-
0-2^32-1
-
一个字节一个序号
-
期望收到数据的首字节序号
数据偏移
- 占4位:0-15,单位为:32位字
- 数据偏离首部的距离
TCP标记
- 占6位,URG,ACK,PSH,RST,SYN,FIN
窗口
- 占16位:0-2^16-1
- 窗口指明允许对方发送的数据量
校验和
紧急指针
- 紧急数据(URG=1)
- 指定紧急数据在报文的位置
TCP选项
- 最多40字节
- 支持未来的拓展
应用场景
- 可靠的信息传输(金融交易等)
可靠传输的基本原理
停止等待协议
-
对信道的利用效率不高
-
超时重传
- 发送的消息在路上丢失
- 确认的消息在路上丢失
- 确认消息很久才到
超时定时器:
- 每发送一个信息都需要设置一个定时器
连续ARQ协议(自动重传请求)
-
累计确认
-
提升信道利用率
TCP协议的可靠传输
- TCP的可靠传输基于连续ARQ协议
- TCP滑动串口以字节为单位(非报文)
选择重传
- 选择重传需要指定需要重传的字节
- 每个字节都有唯一的32位序号
- 数据存储在TCP选项(最多40字节)中,最多存储10个序号
TCP协议的流量控制
-
指让发送方速率不要太快
-
流量控制是使用滑动窗口来实现的
窗口
- 占16位:0-2^16-1
- 窗口指明允许对方发送的数据量
坚持定时器
-
解决死锁情况
-
当接收到窗口为0的消息,则启动坚持定时器
-
坚持定时器每隔一段时间发送一个窗口探测报文
TCP协议的拥塞控制
why
-
一条数据链路经过很多设备
-
数据链路中的各个部分都有可能成为网路传输的瓶颈
-
报文超时则认为是拥塞,反之不成立
慢启动算法(指数增长)
- 由小到大增加发送的数据量
- 每收到一个报文确认就+1
- 慢启动阈值(ssthresh)
拥塞避免算法
- 维护一个拥塞窗口的变量
- 只要网络不拥塞,就试探着拥塞窗口调大,直到发生拥塞
- 能够尽可能多的传送数据
拥塞控制和流量控制的区别
- 流量控制考虑点对点的通信量的控制
- 拥塞控制考虑整个网络,是全局性的考虑
- 报文超时则认为是拥塞,反之不成立
TCP连接的建立(三次握手)
为什么发送方要发出第三个确认报文?
- 只进行两次握手的话,已经失效的连接请求报文传送到对方,引起错误
- 忽略掉第二次发送的请求
TCP连接的释放(四次挥手)
FIN=1,表示需要释放连接
等待计时器
2MSL
MSL:最长报文段寿命
MSL建议设置为2min
-
计时器结束后才释放端口
-
为什么需要等待2MSL
- 最后一个报文没有确认
- 确保发送方的ACK可以到达接收方
- 2MSL时间内没有收到,则接收方会重发
-
确保当前连接的所有报文都已经过期了
套接字与套接字编程
套接字:{IP:Port}
- 表示TCP连接的一端通过套接字可以进行数据发送和接收
- TCP有两个套接字组成,一个ip可以有很多个套接字
- 服务端:创建套接字->绑定套接字->监听套接字->接收&处理信息
- 客户端:创建套接字->连接套接字->发送信息
超时定时器
超时定时器也称为超时重传定时器,这个定时器是我们接触的第一个定时器,在可靠传输的基本原理章节已有讲解,这里简单回顾一下。 超时定时器主要应用在TCP的可靠传输协议里面,是为了控制可能发生丢失的报文而设计的定时器,当TCP协议发送 端发送一个报文时,就会为该报文设置一个超时定时器。 如果在超时定时器结束之前收到了来自接收端对该报文段的确认,则撤销这个定时器。 如果在超时定时器结束时仍然没有收到来自接收端对该报文段的确认(超时),则认为这个报文可能已经丢弃,发送 端重新发送该报文,并重新设置一个超时定时器。 需要注意的是,发送端在超时定时器撤销之前,必须继续缓存已发送未确认的报文,直到发送端收到了来自接收端的 确认。
坚持定时器
坚持定时器是使用滑动窗口进行流量控制的时候而设置的,这个定时器是我们接触的第二个定时器,在TCP的流量控制章节已有讲解,这里简单回顾一下。 要理解坚持定时器,需要理解“零窗口通知”的情况。我们知道接收端通过调整接收窗口的大小可以控制发送端的发送 速度,当接收端把接收窗口调小时,那么发送端就会调小发送的流量。 这就可能产生一种情况,就是接收端的缓存区已经满了,这个时候接收端会给发送端发送一个“零窗口”的消息,表示 说“当前我已经没有余力处理更多的数据了”,这就是“零窗口通知”的情况。 当出现这种情况的时候,双方都会陷入等待的状态,发送端等待接收端的窗口调大,接收端等待发送端发送的数据。 当接收端窗口可以调大的时候,接收端会发送窗口调大的信息给发送端,但是这个消息是不可靠的,也即是这个消息 可能会在传输中丢失,并且不会被感知到丢失和重传。 如果这个消息在发送过程中丢失的话,那么发送端和接收端就会进入死锁状态,因为接收端认为“我已经把窗口调大 的消息发送出去了,发送端理应发送新的消息给我才对”,所以接收端会一直等待发送端的消息;而发送端因为没有 收到窗口调大的消息,则认为“接收端还没有调大窗口,因此我不能发送”,发送端也会一直等待。 因此为了解决这个问题,当发送端收到窗口为零的消息之后,会启动一个坚持定时器来周期性主动的向接收方查询, 以便发现窗口是否增大,这个就是坚持定时器的作用。
时间等待计时器
时间等待定时器是我们学习的第三个定时器,这个定时器我们在TCP连接的四次挥手章节已有讲解,这里简单回顾一下。 时间等待计时器(Time-Wait)是由主动关闭TCP连接的一方设置的,当主动关闭TCP连接的一方收到来自对方的FIN报 文的时候(第三次挥手),则认为对方也可以关闭TCP连接,这个时候主动关闭TCP连接的一方发送一个消息确认的 报文(第四次挥手),并启动这个时间等待计时器,这个计时器会等待2倍MSL的时间,MSL(Max Segment Lifetime),最大报文段寿命。 以下为方便讨论,我们把主动关闭的一方称为A,被动关闭的一方称为B。 这个定时器主要是为了正确关闭一个TCP连接而考虑的,这主要是为了保证A在对最后一个FIN报文(第三次挥手) 发送确认的报文可以到达B。 当A发出这个报文之后,就会启动2MSL计时器,注意,这个报文是有可能在网络传输过程中丢失的,如果B收不到这 个确认,那么B会重新发送一次FIN报文,A会重新收到这个报文并重传一次最后的确认,并重新启动2MSL计时器, 直到双方正常结束TCP连接。2MSL时间可以保证当B没有收到确认时,B可以再次发出FIN报文,并且A可以再次收 到并重新发送确认,所以2MSL的时间可以保证连接正常结束。
保活计时器
保活计时器是TCP协议里面的第四个计时器,这个计时器也是课程内容中没有介绍的,因此需要注意这个定时器。 保活计时器,顾名思义,保活是这个计时器的主要目的,他是为了保活TCP连接而设计的,保活定时器可以防止TCP 连接的两端出现长时期的空闲,当一方出现状态变化或故障时,另一方没有察觉的情况。 设想连接双方在建立连接后,只传输了一些数据,然后就都保持静默了,双方也都没有关闭连接(这种情况经常存在),如果这个时候其中一方已经故障,那么这个连接将会永远被打开,如果被连接的一方是服务端的话,那将浪费 很多服务端的资源。 因此为了解决这个问题,服务端一般都会设置一个保活定时器,每次收到对方的数据则重置这个定时器,如果定时器 超时,服务端则发送探测报文段,探测客户端是否还在线,如果没有收到响应的话,那么则认为客户端已经断开连接 了,因此服务端也会终止这个连接。保活定时器其实有很广泛的应用,在今天,很多的分布式系统,都会使用保活定时器来检测其他节点是否在线还是已 经故障,或者其他节点也会每隔一段时间向主节点上报心跳信息以证明在线,这些都是保活定时器在更多领域的广泛 应用。
TCP的四个定时器对深入理解TCP协议的细节非常有帮助,这四个定时器也是面试笔试中对应聘者考察的一个知识点,因此希望同学们都能够理解TCP的四个定时器。
应用层
-
传输层及以下的层提供完整的通信服务
-
面向用户的一层
功能:定义应用间通信的规则
-
应用进程的报文类型(请求报文,应答报文)
-
报文的语法,格式
-
应用进程发送数据的时机,规则
DNS——域名系统
-
域名系统 (DNS) 是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53。
-
域名 -> DNS服务 -> IP
-
Eg: www.github.com
-
域名分为顶级域,二级域,三级域
顶级域
国家
- cn/us/uk/ca/jp...
通用
- com/net/gov/org...
二级域
- 自拟
一个顶级域可以对应多个二级域,一个二级域可以对应多个三级域。
| 根域名服务器(分布在各个国家) |
|---|
| n个顶级域名服务器 |
| n个域名服务器 |
| 本地域名服务器 |
DHCP协议(动态主机设置协议)
- DHCP是一个局域网协议
- 应用UDP协议的应用层协议
- 即插即用联网,自动给你分配一个内网地址的临时ip
过程(在局域网内完成)
- DHCP服务器监听默认端口:67
- 主机使用UDP协议广播DHCP发现报文
- DHCP服务器发出DHCP提供报文
- 主机向DHCP服务器发出DHCP请求报文
- DHCP服务器回应并提供IP地址
HTTP协议(超文本传输协议)
-
明文传输
-
http://<主机>:<端口80>/<路径>
-
底层依据TCP协议,可靠
web服务器
-
硬件部分
-
软件部分(Nginx,HAProxy)
处理过程
- 接受客户端连接
- 接受请求报文
- 处理请求
- 访问web资源
- 构造应答报文
- 发送应答报文
请求
-
GET——获取指定的服务端资源
-
POST——提交数据到服务端
-
DELETE——删除指定的服务器资源
-
UPDATE——更新指定的服务端资源
在地址中指定
在报文中指定
- 请求报文
| [请求方法] [请求地址] [HTTP版本] |
|---|
| [请求头] |
| [请求内容] |
POST https://coding.imooc.com HTTP/1.1
Accept-Encoding:gzip
Accept-Language:zh-CN
{
"sort":0,
"unlearn":0,
"page":2
}
- 应答报文
| [HTTP版本] [状态码] [状态解释] |
|---|
| [应答头] |
| [应答内容] |
| 状态码 | 含义 |
|---|---|
| 200-299 | 成功状态码 |
| 300-399 | 重定向状态码 |
| 400-499 | 客户端错误状态码 |
| 500-599 | 服务端错误状态码 |
HTTP工作的结构
Web缓存
热门数据尽可能用缓存、主存
Web代理
- 防火墙:防止用户信息暴露在外
- Nginx,HAProxy
正向代理
代表Client,代表客户端去访问server
反向代理
代表server返回数据给Client
CDN(内容分发网络)
- 对多媒体内容加速
爬虫
“网络机器人”
-
增加网络拥塞
-
搜索引擎的本质就是爬虫
HTTPS(Secure)协议
-
安全
-
http(s)://<主机>:<端口443>/<路径>
-
数字证书:可信任组织颁发给特定对象的认证
SSL(安全套接层)
- 位于应用层和传输层之间
- 数据安全和数据完整
- 对传输层数据进行加密后传输