本文是对计算机网络基础做的一次整体的梳理
osi七层模型
- 应用层: 针对特定应用的协议
- 表示层: 设备固有数据格式 → 网络标准数据格式
- 会话层: 通信管理, 负责建立和断开通信连接
- 传输层: 可靠传输
- 网络层: 地址管理/路由选择
- 数据链路层: 数据帧 <-> 01比特流 的转化
- 物理层: 01比特流 <-> 电子信号 的转化
设备
中继器/ 集线器: 1层交换设备
- 区别: 集线器有多端口, 中继器只有两个
- 作用: 物理层面延长网络, 信号放大
- 特点: 逐比特转发, 无法改变传输速度, 无差错控制, 不能连接传播速度不同的网络
网桥/ 交换机: 2层交换设备
- 区别: 交换机有多个端口, 网桥只有两个
- 作用: 识别数据帧 -> 存储于内存 -> 重新生成新的帧转发给另一网段
- 特点: 不限制连接网段个数, 可以连接传输速率不同的网段, 具有差错检测, 地址自学习功能
路由器: 3层交换设备
4-7层交换机
- 以传输层及以上的协议为基础, 分析收发数据, 并做特定处理
- eg. 负责均衡器, 带宽控制
网关
- 传输层及其以上: 转发+转换数据
- eg. 手机电子邮件和互联网邮件的转换
数据链路层
作用
提供直连的两个设备间的通信功能, 在互联的同一种数据链路的节点之间进行包传递
MAC地址

网络层: ip协议
作用
可以跨过不同的数据链路, 在复杂的网络环境中将数据包发送给目标地址
ip地址
格式
组成: 网络标识 : 主机标识 (路由器只根据网络标识进行转发)
表示: xx.xx.xx.xx / xx(代表网络标识的位数)
首部:
- 版本: 标识ip版本, ipv4该值为4
- 首部长度: 单位为4字节; 当可选项为空时, 该值为5, 即20字节
- 总长度: 首部+数据的总长度
- 标识, 标志, 片偏移 共同控制数据包的分片与重组
- 标识: 同一个数据包标识相同
- 标志: 分片的相关信息

- 片偏移: 每个分片相对于原始数据的位置. 第一个分片该值为0
- 生存时间: 每经过一个路由器, TTL减1, 变成0时丢弃该包
- 协议字段: 表示ip首部的下一个首部隶属于那个协议, eg. tcp/udp/icmp…
分类
一个ip地址只要确定了它的分类, 也就确定了网络标识和主机标识
- A类: 0.0.0.0 - 127.0.0.0
- B类: 128.0.0.1 - 191.255.0.0
- C类: 192.168.0.0 - 229.255.255.0
- D类: 224.0.0.0 - 239.255.255.255 没有主机标识, 用于多播
- 主机地址全0: 表示对应ip地址不可获知
- 主机地址全1: 用作广播地址; 广播分为
本地广播和直接广播.
在本网络中的广播叫做本地广播, 此时ip地址的网络标识为该网络的地址, 主机标识为全1; 该ip会被路由器屏蔽, 所以不会到达其他的网段上; A网络下的主机向B网络广播叫做直接广播;
子网掩码
为了解决分类造成ip地址浪费的情况. 因为同一链路网络标识相同, 已b类ip地址为例, 同一链路可架设六万多台主机, 但实际情况中一般不会出现这种情况, 因此造成了地址的浪费. 因此我们引入子网掩码, 使ip地址不再受限于分类.
格式: 网络标识位全1, 主机标识位全0
全局地址/私有地址
为了解决ip地址分配不够的问题, 出现了私有地址. 全局地址在整个互联网保持唯一, 私有地址只需要在同一个域内保持唯一即可. 若配有私有ip的主机联网时, 则需通过NAT进行通信.
私有网络ip地址范围:
- A类: 10.0.0.0 - 10.255.255.255
- B类: 172.16.0.0 - 172.31.255.255
- C类: 192.168.0.0 - 192.168.255.255
即所有10开头, 192.168开头, 和172开头的都是私有地址
路由控制
路由表
格式: ip地址 / 下一个路由器
到达每个路由器后, 在路由表中找到符合目标地址的下一跳地址, 转发至下一个路由器; 直至找到目标网络;
分类
默认路由
ip地址为 0.0.0.0 或 default
主机路由
ip地址为 x.x.x.x/32, 即所有整个ip的所有位都参与路由, 多用于不希望通过网络地址路由的情况.
环回地址
localhost / 127.0.0.1
是同一台计算机的程序进行网络通信所使用的默认地址, 使用该地址时, 数据包不会发送到网络上
MTU与分片
MTU: 每种链路的最大传输单元; eg.以太网的MTU为1500
因为帧大小有限制, 且不同链路的MTU值不尽相同. 因此, 必要时路由器会对ip数据包进行分片, 并在目标主机处进行重组
IPV6
ARP
以目标ip地址为线索, 用来获得 下一个应该接受数据包的网络设备的mac地址 ;
当目标主机在同一链路上, 利用ARP广播直接获得目标主机的mac地址, 进行发送;
当目标主机不在同一链路, 则通过ARP获得下一跳路由器的mac地址;
获取到的mac地址会缓存到ARP缓存表中, 直至过期失效; (发送主机和目标主机都会进行mac地址缓存)
RARP
我们的个人电脑可以通过DHCP自动获取本机ip, 但使用例如打印机等嵌入设备, 就无法使用DHCP协议. 此时我们需要一台RARP服务器, 并在该服务器上注册设备的mac地址及其ip地址. 当设备启动后, 会发送获取ip地址的请求.
ICMP
用来辅助ip协议, 报告异常/获取路由, 子网掩码等网络信息
分类
- 目标不可达: 连接不到目标主机.
- 超时消息: 路由器发现某报文TTL为0, 就会像发送端发送该消息类型
- 回送消息: 发送ICMP回送请求消息, 收到ICMP回送应答消息. eg.ping命令就利用该消息实现
- 地址掩码消息: 向目标主机发送ICMP地址掩码请求消息, 就会受到对应的ICMP地址掩码应答消息
DHCP
主机接入网络后, 自动获取tcp/ip通信所以需要的设置. (ip, 子网掩码, 默认路由, dns等等)
工作机制
- 客户端发出ip租用请求报文, 通过
UDP端口69(DHCP请求默认端口)向网络中发送 DHCPDISCOVER 广播包; 该包中源ip: 0.0.0.0, 目的ip: 255.255.255.255 - 任何接收到 DHCPDISCOVER 广播包的DHCP服务器, 都会通过
UDP端口68回复 DHCPOFFER 广播包, 来提供信息; 该包中源ip为DHCP服务器ip, 目标ip为255.255.255.255 - 客户机若收到不止一个DHCPOFFER包, 会选择收到的第一个, 并发送 DHCPREQUEST 包, 其中包含提供ip的DHCP服务器和选择的ip
- 没被选择的DHCP服务器收到DHCPREQUEST包后, 会撤销之前分配的ip, 以供下次使用; 被选择的DHCP服务器会广播发送 DHCPACK
确保所选ip可用
DHCP服务器: 在分配ip地址前发送 ICMP回送请求包, 确认没有返回应答
客户端: 向获得的ip发送ARP请求包, 确认没有返回应答DHCP中继代理
通过DHCP中继代理, 对不同网段的ip地址分配也可以通过一个DHCP服务器来进行统一管理; 客户端会向DHCP中继代理发送广播包, 中继代理服务器收到请求后, 再以单播的形式发送给DHCP服务器
NAT
用来在本网络中使用私有ip, 在连接互联网时转为全局ip的技术
NAT有两种, 一种是替换ip, 但现在很少使用;
另一种叫 NAPT, 它的工作原理是用网关的ip, 并分配一个临时会话的端口号; 对于NAPT又分为两个大类型:
Symmetric NAT型 (对称型)

即在网关中, 两个不同session, ip相同, 端口号不同.
Cone NAT型(圆锥型, 占主流)

两个不同session, ip和端口号都相同. (但因为目标地址不同, 所以也不是一个连接)
TCP/UDP
端口号
通过端口号, 我们可以知道请求究竟是发给的哪个守护进程. 例如当收到tcp建立的连接请求时(通过ip首部字段可得知), 如果目标端口号为22, 则转给sshd(ssh守护进程), 如果是80则转给httpd(http守护进程).
需要注意的是, 端口号由其使用的传输层协议决定, 因此不同传输协议可以使用相同的端口号. 但是知名端口号与传输层协议无关, 例如53端口无论是tcp还udp, 都是用于dns服务
分类
- 知名端口号: 0-1023
eg. http:80 FTP:21 ssh:22 - 注册端口号: 1024-49151
- 时序分配法: 49152-65535
TCP
确认应答 + 序列号 + 超时重传 (可靠传输)
tcp通过确认应答实现可靠地数据传输. 在一定时间内没有等到确认应答, 发送端就会进行重发.
确认应答是通过序列号实现的, 序列号是按顺序给发送数据的每个自己都编上号码. 接收端通过查询接受数据tcp首部中的序列号和数据长度(ip首部中的数据包长度 - ip首部长度 - tcp首部长度), 将自己下一次应该接受的序号作为确认应答发出去.
MSS: 最大消息长度
tcp在传送大量数据时, 以MSS的大小将数据进行分割发送. 进行重发时也是以MSS为单位.
MSS是在三次握手时, 两端主机分别在tcp首部中写入自己的MSS, 并取较小值使用
窗口控制(提高速度)
如果发送端每次等到确认应答后, 再发送下一个段, 包的往返时间会很长. 因此, tcp引入的窗口的概念.
窗口大小: 无需等待确认应答而可以继续发送消息的最大值.
重发控制
那么, 使用窗口后确认应答, 以及重发控制又是如何实现的呢?
当接受主机收到一个自己应该接受的序号以外的数据时, 会对当前为止收到的数据返回确认应答. 而如果发送端主机连续三次收到同一个确认应答, 就会对其对应数据进行重发.
流控制
如果接收端窗口已满, 并需要一段时间来处理消息, 此时发送端发送的数据就会被丢弃. 为了防止这种情况下网络流量的无端浪费, 我们引入了流控制.