跳转至

OSI七层模型

物理层

在物理层传输的数据被叫做流

作用

物理层定义了接口标准, 线缆标准, 传输速率, 传输方式等.

常见通信方式:

  • 单工通信: 信号只能往一个方向传输, 任何时候都不能改变信号的传输方向. 比如无线电视, 广播, 只能接受他们发送来的信号, 不能向他们发送.
  • 半双工通信: 信号可以双向传输了, 但必须是交替进行, 同一时刻只能往一个方向传输. 对讲机.
  • 全双工通信: 信号可以同时双向传输.

一条传输介质(网线)上, 可以有多条信道

数据链路层

在数据链路层的数据叫做帧(frame)

数据链路层是唯一一个需要在数据头尾都加上数据的层

基本概念

链路

从一个节点到相邻节点之间的一段有线或者无线的物理线路, 中间没有其他交换节点. 如下图中的每一个设备之间的线路都是链路.

数据链路

在一条链路上传输数据时, 需要由对应的通信协议来控制数据的传输. 不同类型的数据链路, 通信协议不一样:

  • 广播信道: 如CSMA/CD协议
  • 点对点信道: 如PPP协议

数据链路层的主要功能

  • 封装成帧
  • 透明传输
  • 差错检验

封装成帧

帧的结构

帧是由 帧头, 数据部分, 帧尾 三个部分构成.

最大传输单元(MTU)

每一种数据链路层协议都规定了所能够传输的帧的数据长度上限. 以太网的MTU为1500个字节.

透明传输

在透明传输的过程中, 使用SOH作为一帧数据的帧开始符, EOT做为帧结束符号, 但是其实SOH和EOT本质上都是一段01的编码, 帧的数据部分可能会出现和SOH,EOT相同的编码, 为了防止接收端将数据部分和SOH,EOT相同的编码当成SOH和EOT, 所以使用ESC作为字节填充, 接受端在解析时, 如果碰到SOH, EOT旁边有ESC, 就去掉ESC, 将SOH或者EOT当成普通数据.

透明传输其实就是保证发送和接受的内容一致

实现组帧的的方式:

  • 字符填充首位定界符法: 使用特定字符来界定一帧的开始和结束, 在数据段中的特殊字符前填充一个转义字符(ESC)来加以区分, 以实现透明传输, 之后再由接收方删掉转义字符.
  • 字符计数法: 在帧头加帧数据长度, 如果帧头长度错了, 所有数据都错了.
  • 零比特填充的首尾标志法: 使用一个特定的比特模式, 0111110来标志帧头和帧尾, 如果数据中有连续五个1的编码, 就在后面加上一个0, 接收方逆着操作. 这个方法很容易由硬件来实现, 性能优于字符填充法.
  • 违规编码法: 使用曼彻斯特编码的方式.

差错检验

数据链路层首部和帧的数据部分计算出一个冗余码FCS, 这个冗余码放到帧尾部, 接收方根据这个FCS和接受到的数据计算验证判断数据的正确性. 发现有错误就直接丢弃这帧的数据.

常见差错检验编码方式:

  • 奇偶校验码: 是一种检错码, 但是找不到错误在哪里, 也不能发现偶数位的错误.
  • 循环冗余校验码: 有纠错功能, 但是数据链路层只用了他的检错功能.
  • 纠错编码: 海明码, 海明码的校验原理有空值得研究.

CSMA/CD协议和以太网

CSMA/CD协议 翻译过来的是载波侦听多路访问/冲突检测协议. 在CSMA/CD协议中, 每个网络设备在发送数据之前都会检测网络是否空闲. 如果网络空闲, 设备将开始发送数据. 在数据发送过程中, 设备会继续监听网络以检测是否发生冲突. 一旦检测到冲突, 设备会立即停止发送数据, 并在随机延迟后重试. 这个过程可能会重复多次, 直到数据成功发送或达到重试次数上限.

只要是使用了CSMA/CD协议的都是以太网

以太网帧的格式有: Ethernet V2标准、IEEE的802.3标准. 使用最多的是 Ethernet V2标准. 为了能够检测正在发送的帧是否产生了冲突, 规定以太网帧至少要64字节. 以太网帧没有帧开始符和帧结束符, 以太网帧使用的是曼彻斯特编码, 只要信号没有出现跳变, 就意味着帧结束了.

使用交换机组件的网络, 已经支持全双工通信, 不需要再使用CSMA/CD, 但他传输的帧依旧是以太网帧, 所以交换机组建的网也可以叫做以太网

PPP协议

PPP(Point-to-Point Protocol, 点对点协议)是一种用于在两个点之间进行通信的协议, 广泛应用于拨号网络和 VPN 连接. 它提供了多种功能, 包括身份验证、数据压缩和加密等, 但不提供路由功能.

网络层

在网络层传输的数据叫包(packet)

IP数据包结构

IP数据包由 首部数据 两部分组成.

IP数据包的结构:

版本(Version)

​ 版本占4位, 表示使用的是IPv6还是IPv4.

​ 0b0100:IPv4,

​ 0b0110:IPv6.

首部长度(Header Length)

​ 首部长度占4位, 二进制乘以4才是最终长度.

​ 规定首部0b0101: 最小值是20个字节 , 二进制的值是5, 乘上4就是20, 所以首部最小长度就是20.

​ 首部长度全为1, 0b1111,二进制是15, 乘上4就是60, 所以首部的最大长度就是60个字节.

区分服务(Differentiated Services Field)

​ 区分服务占8位, 可以提交网络的服务质量, 其实就是包传输的优先级, 如果一包数据的这8个比特位设置了值, 就会优先传输此包.

总长度(Total Length)

​ 总长度占16位.

​ 16位能够表示的最大值是65536.

​ 由于数据链路层没帧数据不能超过1500字节, 所以当IP数据包过大时就要 分片 .

​ 分片就是将数据过大的IP包拆成数据链路层能够接受的小包数据, 每个小包数据都是一个完整的IP数据包.

标识(Identification)

​ 标识占16位.

​ 数据包的ID,每包数据都有一个ID,这个ID就是这个标识, 当数据包的数量过大时, 需要进行分片处理, 会分成多个包, 同一个数据包的所有片的标识都是一样的.

​ ID是被一个计数器管理起来的, 每发出一个包, ID就加1.

标志(Flags)

​ 标志占3位.

​ 第一位: 保留.

​ 第二位: 1 代表不允许分片, 0代表允许分片.

​ 第三位: 1代表不是最后一片, 0代表是最后一片(这一位数据非常重要, 它关系到我们能够完整的接受到数据)

片偏移(Fragment Offset)

​ 片偏移占13位.

​ 片偏移乘以8就是字节偏移数.

​ 所以每一片数据的长度一定是8的倍数.

生存时间(Time To Live)

​ 生存时间占8位.

​ 路由器在转发之前都会将TTL减1, 一旦发现TTL减为了0, 路由器会返回错误报告.

​ 并且每个系统都有默认的TTL, 通过ping命令后面的TTL, 可以推测出对方的操作系统, 中间经过了多少个路由器.

协议(Protocol)

​ 协议占8位, 表明所封装的数据是使用什么协议.

首部检验和(Header Checksum)

​ 用于检查首部是否错误.

组装分片数据流程

分片之后, 每一片数据都是一个完成的IP数据包, 这些IP数据包在接收到之后顺序是错乱的, 这时就需要偏移来排序. 字节偏移数为0就表示这是第一包数据, 然后根据第一包数据的首部信息就可以算出这包数据的长度, 那么0加上第一包数据的长度就是第二包数据的字节偏移数, 如果此时发现第二包数据的 标志 的第三位是0, 就表示这是最后一片数据了, 组装分片完成. 如果是1, 继续上诉的组装操作.

分片是因为网络层的包太大, 而ICMP协议是网络层协议, 所以能够直接使用ping一个很大的包让网络层分片. 但实际从传输层下来的数据早就已经切分了, 切成了一个帧能够容纳的大小, 所以凡是从传输层来的数据, 网络层都不需要切片.

ping命令的使用

ping命令的本质是ICMP协议:

ping /?
   查看ping命令的用法
ping ip地址 -l 数据包大小
    发送指定大小的数据包
ping ip地址 -f
    不允许网络层分片
ping ip地址 -i TTL
    设置TTL的值, TTL位置直接填生存时间   

通过tracert, pathping命令, 可以跟踪数据包经过了那些路由器

IPV6

ipV6在网络层, 属于底层, 需要升级设备, 操作系统, 所以使用增长缓慢. IPv6地址为128bit, 每16bit一组, 共8组, 每组以冒号“:”隔开, 每组以4位十六进制方式表示:

  • 例如2001:0db8:86a3:08d3:1319:8a2e:0370:7344

类似于IPv4的点分十进制, 同样也存在点分十六进制的写法:

  • 2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4

传输层

在传输层传输的数据叫段(segment)

在传输层有两个常见协议:

  • TCP(Transmission Control Protocol),传输控制协议.
  • UDP(User Datagram Protocol),用户数据报协议.

TCP和UDP的区别

功能特性 TCP UDP
连接性 面向连接 无连接
可靠性 可靠传输, 不丢包 不可靠传输, 尽最大努力交付, 可能丢包
首部占用空间
传输速率
资源消耗
应用场景 浏览器, 文件传输, 邮件发送 音视频通话, 直播
应用层协议 HTTP,HTTPS,FTP,SMIP,DNS DNS

决定传输层使用TCP或者是UDP是由应用层协议决定的, 如表格中, 如果应用层协议使用的是HTTP,HTTPS等协议, 那么传输层就会使用TCP协议. DNS是可以TCP和UDP通用的.

应用层

应用层的数据叫做报文

应用层常见的协议:

  • 超文本传输: HTTP, HTTPS
  • 文本传输: FTP
  • 电子邮件: SMTP, POP3, IMAP
  • 动态主机配置: DHCP
  • 域名系统: DNS

域名(Domain Name)

由于IP地址不方便记忆, 并且不能表达组织的名称和性质, 所以设计出来域名. 但是实际上, 为了能够准确的访问到主机, 最终还是要在知道目标主机的IP地址.

为什么不直接用域名路由呢?

IP地址固定是4个字节, 域名随随便便都至少10几个字节, 这无疑会增加路由器的负担, 浪费流量.

DNS(Domain Name System)

DNS协议能偶帮助我们把域名转换成IP地址, DNS可以基于UDP和TCP. ,服务占用端口53.

在我们通过域名访问服务器时, 客户端会先使用DNS协议访问最近的一台DNS服务器, 也就是客户端自己配置的DNS服务器, 这个服务器里面缓存了域名对应的IP地址信息. 如果没有缓存就会访问根域名服务器, 比如我们现在访问的时baidu.com 其实在com后面有一个 . , 这个 . 就是根域名服务器, 然后访问下一级的顶级域名服务器, 就是com, 然后访问下一级二级域名服务器, 会在里面找到baidu, 这时就能找到对应的IP地址了, 然后返回客户端, 客户端将域名对应的ip地址缓存在本地名称服务器中, 然后根据ip地址访问百度的服务器.

常用的命令:

ipconfig /displaydns
    查看DNS缓存记录
ipconfig /flushdns
    清空DNS缓存记录
ping 域名
nslookup 域名

DHCP(Dynamic Host Configuration Protocol)

DHCP服务器会从IP地址池中, 挑选出一个IP地址 出租 个客户端一段时间, 时间到期就会收回. 平时家里上网, 路由器就可以充当DHCP服务器.

IP地址的分类

IP地址按照分配方式可以分成: 静态IP地址, 动态IP地址.

  • 静态IP: 手动设置. 适合不怎么挪动的主机, 服务器等.
  • 动态IP: 从DHCP服务器自动获取IP地址. 适合移动设备, 无线设备等.

DHCP分配IP地址的4个阶段

DISCOVER: 发现服务器

发广播包(源IP是0.0.0.0(因为这时候我还没有IP地址), 目标IP是255.255.255.255, 目标MAC是FF:FF:FF:FF:FF:FF)

OFFER: 提供租约

服务器返回可以租用的IP地址, 以及租用期限、子网掩码、网关、DNS等信息. 这里可能会有 多个 服务器提供租约

REQUEST: 选择IP地址

客户端选择一个OFFER, 发送广播包进行回应

ACKNOWLEDGE: 确认

被选中的服务器发送ACK数据包给客户端, 至此IP地址分配完成.

DHCP服务器可以跨网段分配IP地址么?(DHCP服务器、客户端不在同一个网段)

可以借助DHCP中继代理(DHCP Relay Agent)实现跨网段分配IP地址

自动续约

客户端会在租期不足的时候, 自动向DHCP服务器发送REQUEST信息申请续约

常用命令:

ipconfig /all
    可以看到DHCP相关的详细信息, 比如租约过期时间、DHCP服务器地址等
ipconfig /release
    释放租约
ipconfig /renew
    重新申请IP地址、申请续约(延长租期)