网络协议四:物理层、链路层、网络层

网络分层

图1

物理层

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

数字信号、模拟信号

  1. 模拟信号(Analog Signal)
    1. 连续的信号,适合长距离传输
    2. 抗干扰能力差,受到干扰时波形变形很难纠正
  2. 数字信号(Digital Signal)
    1. 离散的信号,不适合长距离传输
      1. 抗干扰能力强,受到干扰时波形失真可以修复

数据通信模型

  1. 注意:网线不能超过100米

图1

数据通信模型

  1. 信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道
  2. 单工通信
    1. 信号只能往一个方向传输,任何时候都不能改变信号的传输方向
    2. 比如无线电广播、有线电视广播
  3. 半双工通信
    1. 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输
    2. 比如对讲机
  4. 全双工通信
    1. 信号可以同时双向传输
    2. 比如手机(打电话,听说同时进行)
  1. 链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点
  2. 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输
    1. 不同类型的数据链路,所用的通信协议可能是不同的
      1. 广播信道:CSMA/CD协议(比如同轴电缆、集线器等组成的网络)
      2. 点对点信道:PPP协议(比如2个路由器之间的信道)
  3. 数据链路层的3个基本问题
    1. 封装成帧
    2. 透明传输
    3. 差错检验

封装成帧

图1

  1. 帧(Frame)的数据部分
    1. 就是网络层传递下来的数据包(IP数据包,Packet)
  2. 最大传输单元MTU(Maximum Transfer Unit)
    1. 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
    2. 以太网的MTU为1500个字节

透明传输

  1. 使用SOH(Start Of Header)作为帧开始符
  2. 使用EOT(End Of Transmission)作为帧结束符
  3. 但是如果数据中间部分出现了EOT,那么就会造成数据丢失,因此为了防止这种现象:数据部分一旦出现了SOH、EOT,就需要进行转义-填充一个字节ESC

图1

差错检验

图1

  1. FCS是根据数据部分 + 首部计算得出的一个值
  2. 传输到目的地时也会计算一次,然后与传输过来的FCS进行比较,查看是否一致

CSMA/CD协议

  1. CSMA/CD(Carrier Sense Multiple Access with Collision Detectio)
    1. 载波侦听多路访问/冲突检测
  2. 使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧
    1. 以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准
    2. 使用最多的是:Ethernet V2标准
  3. 为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节
  4. 用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧
    1. 所以,用交换机组建的网络,依然可以叫做以太网

Ethernet V2帧的格式

图1

  1. 首部:目标MAC +源MAC + 网络类型
  2. 以太网帧:首部 + 数据 + FCS
  3. 数据的长度至少是:64 – 6 – 6 – 2 – 4 = 46字节

Ethernet V2标准

  1. 当数据部分的长度小于46字节时
    1. 数据链路层会在数据的后面加入一些字节填充
    2. 接收端会将添加的字节去掉
  2. 长度总结
    1. 以太网帧的数据长度:46~1500字节
    2. 以太网帧的长度:64~1518字节(目标MAC +源MAC + 网络类型 + 数据 + FCS)

网卡

图1

  1. 网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃
  2. 网卡工作在数据链路层、物理层
  3. Wireshark抓到的帧没有FCS ,因为它抓到的是差错校验通过的帧(帧尾的FCS会被硬件去掉)
    1. Wireshark抓不到差错校验失败的帧

网络层(Network)

  1. 网络层数据包(IP数据包,Packet)由首部、数据2部分组成
    1. 数据:很多时候是由传输层传递下来的数据段(Segment)

图1

版本、首部长度、区分服务

  1. 版本(Version)
    1. 占4位
    2. 0b0100:IPv4
    3. 0b0110:IPv6
  2. 首部长度(Header Length)
    1. 占4位,二进制乘以4才是最终长度
    2. 0b0101:20(最小值)
    3. 0b1111:60(最大值)
    4. 整个首部的长度,包含可变部分
  3. 区分服务(Differentiated Services Field)
    1. 占8位
    2. 可以用于提高网络的服务质量(QoS,Quality of Service)
    3. 就是针对某些特殊数据加以设置值区分,这样路由器可以优先通过该数据

总长度

  1. 总长度(Total Length)
    1. 占16位
    2. 首部 + 数据的长度之和,最大值是65535
  2. 由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments)传输给数据链路层
    1. 每一片都有自己的网络层首部(IP首部)

图1

标识、标志、片偏移

  1. 标识(Identification)
    1. 占16位
    2. 数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的
    3. 有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
  2. 标志(Flags)
    1. 占3位
    2. 第1位(Reserved Bit):保留
    3. 第2位(Don’t Fragment):1代表不允许分片,0代表允许分片
    4. 第3位(More Fragments):1代表不是最后一片,0代表是最后一片
  3. 片偏移(Fragment Offset)
    1. 占13位
    2. 片偏移乘以8:字节偏移
    3. 每一片的长度一定是8的整数倍
    4. 片偏移就是:一个大数据包分割成n段,用来记录每段的分割顺序,以便于接收方拼接

    图1

    1. 举例:向腾讯课堂发送一个数据包:ping ke.qq.com -l 4000 图1

生存时间、协议、首部校验和

  1. 生存时间(Time To Live,TTL)
    1. 占8位
    2. 每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告
    3. 观察使用ping命令后的TTL,能够推测出对方的操作系统、中间经过了多少个路由器

    图1

    1. 可以推算出百度服务器应该部署在linux上,64-52=12,大概经过了12个路由器
    2. 注意:通过tracert、pathping命令,可以跟踪数据包经过了哪些路由器,比如:tracert baidu.com
  2. 协议(Protocol)
    1. 占8位
    2. 表明所封装的数据是使用了什么协议

    图1

  3. 首部校验和(Header Checksum)
    1. 用于检查首部是否有错误

ping几个用法

ping /?
查看ping的用法

ping ip地址 -l 数据包大小
发送指定大小的数据包

ping ip地址 -f
不允许网络层分片

ping ip地址 -i TTL
设置TTL的值

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

抓包工具Wireshark

  1. 软件安装之后,打开可以看到列表展示的所有的连接方式
  2. 点击本机连接网络的连接方式(WiFi、以太网、USB等),就可以自动抓取了
  3. 该抓包工具可以抓取本机正在访问的任何网络,数据包每个字节的内容,非常详细
  4. 点击某个请求,可以看到:链路层、网络层、传输层__等每个位的详细情况
  5. 搜索功能:

     搜索某个IP地址: ip.addr == 192.168.133.1
    

图1

Table of Contents