跳转至

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地址、申请续约(延长租期)