Linux---TCP/IP协议栈中网络层与链路层--实现与特性

网络层

作用 : 负责地质管理与路由选择
在网络通信中, 通信的两端称为主机, 而在两个主机之间会存在着许许多多的有路由器组成的复杂网络. 每一个主机都配有IP地址, 而主机与主机之间的协议主要就是IP协议

IP协议字段

  1. 4位版本 : 指定当前的协议是哪一个版本, 有创建socket是所传的地址域决定.
  2. 4位首部长度 : 标志了IP协议的头部长度
  3. 8位TOS服务类型 : 3位弃用,一位保留, 四位服务类型 : 最小延迟, 最大吞吐量, 最高可靠性, 最小成本.
  4. 16位总长度 : IP报文的长度(包含IP头部), 因此UDP协议的长度最大为64K-20-8, 而TCP数据的长度在建立连接是双方已经商量好, 不会大于这个长度
    注意 : 由于在链路层中, 数据帧的传输受到了MTU的限制, 因此当在网络层中的传输的UDP数据长度大于MTU并且小于64k-28时,就需要对UDP数据在网络层进行数据分片. (TCP不需要进行数据分片, 由于在建立连接是协商了MSS,而MSS就是由MTU计算得到的)
  5. 16位标识 : 上面说到了, 当UDP数据大小不满足传输条件时就需要进行数据分片. 而数据分片时会将一整块UDP数据报分成几个小片,对每一个小片都会进行IP协议的头部封装, 而发送过去之后,接收端就会对收到的每一个数据分片进行重组, 但是由于传输的顺序不稳定, 因此这个16位标识就是,标记当前的分片时属于哪个UDP数据报的
  6. 3位标志 : 1位保留, 1位标识是否禁止分片, 1位标识是否还有更多分片
  7. 13位片偏移 : 标识了当前的分片数据, 在原来的UDP数据报中的起始偏移位置, 并且每一位的单位都是8个字节, 因此数据分片时每一个分片的大小都是8个字节的整数倍
  8. 8位生存时间(TTL) : 防止路由器环路, 表示经过的路由器跳数
  9. 8位协议 : 表示上层所用的是哪个协议
  10. 16位首部校验和
  11. 32位源IP地址与32位目的IP地址

地址管理

IP地址的组成

IP地址一共有两部分组成网络号主机号 ; 每一台主机都有属于自己的路由器, 而每一个路由器也都要属于自己的上层主管路由. 每一个网络中的成员的IP地址都是有自己的主管路由器进行分配的. 所以每一个网络的IP地址分为都要进行规范

  • 网络号(网段) : 网络号是一个网络中的标记, 在这个局域网中, 路由器给所有主机分配的IP地址当中都会包含网络号,网络号用于区分每一个网络, 每一个网络的网络号都不一样, 则分配的IP地址不会冲突
  • 主机号 : 每一个主机的IP地址不但要标识网络的标识(网络号), 还需要能够在局域网中唯一表示, 这个表示称为主机号

网段的划分

早期的划分:将所有的IP地址划分为五类IP地址

  1. A类:高八位中高一位是0,低七位是网络号剩下的都是主机号,
    0.0.0.0—127.255.255.255
  2. B类: 高16位中高两位为1和0,低十四位为网络号, 剩下的为主机号
    128.0.0.0—191.255.255.255
  3. C类:高24为中高三位为110,低21位为网络号,剩下的为主机号
    192.0.0.0—223.255.255.255
  4. D类:高4位固定 1110 剩下的为主机号
    224.0.0.0—239.255.255.255
  5. E类:高5位固定 11110 剩下的为主机号
    240.0.0.0—247.255.255.255
    Linux---TCP/IP协议栈中网络层与链路层--实现与特性

新的网段的划分方式-----CIDR : 对网络的额划分借助了一个字段叫做子网掩码
子网掩码:uint32_t类型的数据–数据由连续的二进制1组成
作用

  1. 子网掩码取反可以得到局域网的主机号范围 , 假设子网的掩码为255.255.255.0 那么它取反之后的到的就是0.0.0.255, 这就说明这个局域网中的主机号范围就是0~255
  2. 子网掩码与IP地址相与可以得到网络号

路由选择

每个路由器上都有一张路由表, 用来记录当前路由器多相连的网络 , 当路由器接受到一个数据, 则取出目的IP地址, 通过路由表判断当前数据的目的主机数据哪一个相连的网络(使用目的地址与子网掩码进行相与, 然后与目的网络的网络花进行判断)

面试问题 : 有一个网络为192.168.122.132, 现在讲这个王阔平均划分为四个网络, 划分之后, 各个子网的网络号以及子网掩码, 主机IP地址的范围是多少?
由于192.168.122.132位一个C类网络, 所以这个网络中一共有256个主机 ,平均划分四个网络, 则每个子网中的主机一共有64台主机

由于子网掩码的作用(取反可以得到主机号的范围) , 则对0.0.0.63取反之后,就可以得到该网络的掩码为255.255.255.192
就可以将主机号分为
192.168.122.0~192.168.122.63 --------------192.168.122.0(网络号)
192.168.122.64~192.168.122.127------------192.168.122.64(网路号)
192.168.122.128~192.168.122.191----------192.168.122.128(网络号)
192.168.122.192~193.168.122.255----------192.168.122.192(网络号)

特殊的IP地址

  1. 主机号权为0—网络号
  2. 主机号全为1—UDP局域网的广播地址
  3. 127.0.0.1-----虚拟回环网卡–用于本机网络测试
  4. 0.0.0.0 本机的任意地址
  5. 255.255.255.255 全网的广播地址

链路层

作用 : 负责相邻端口之间的数据帧传输
在网络层中两端主机约定好协议之后, 在传输路径上还需要经过很多的路由器, 而链路层就是描述这些相邻的路由器之间的传输, 而用来约定他们的协议就是以太网协议

mac地址

相邻设备定位的地址, 网卡的硬件地址 , 大小为6个字节的整数uint8_t mac[6]----王卡出厂时就设定了 , 早期不能更改

Etherent协议实现 : 源mac地址 目的mac地址 , 上层协议类型, 数据, 帧尾(包含校验和)

arp协议(获取相邻设备之间的mac地址)

arp协议是介意网络层与链路层之间的协议—它通过IP地址来获取mac地址.
Linux---TCP/IP协议栈中网络层与链路层--实现与特性
如上图所示,后面28字节为一个arp请求/应答, 我们可以发现其中包含了发送端mac地址,发送端IP地址, 目的端IP地址, 目的端mac地址, 其中目的端mac地址在发送的时候空的. 之后将前面以太网首部中的目的地址置为广播地址, 将arp协议数据报发送到所有相邻的设备上, 之后所有相邻的设备,通过后面28字节中的目的IP地址是否是属于自己的, 如果是,就将自己的mac地址封装成一个arp响应发送回去,如果不是就将arp协议数据报丢弃, 在这之中, 也将IP地和mac地址的关系进行映射缓存(缓存事假通常只有30分钟)

MTU(最大传输单元)

MTU限制了链路层数据帧所能传输的最大数据大小

  • MTU对TCP协议的影响 :
    TCP在传输层进行数据传输的时候,会自动进行数据分段, 分段大小称为MSS(最
    大数据段大小), 通信双方在三次握手时 自动计算MSS, (MSS=MTU-IP-TCP),
    传递给对方,双方取较小的MSS作为传输的最大数据段大小; 因为TCP在传输层
    会进行自动数据分段, 因此不会再网络层进行数据分片
  • MTU对UDP协议的影响 :
    UDP数据报在网络层的时候若数据报大小大于MTU大小, 小于64k-28;则会在网
    络层进行数据分片
    UDP数据分片传输过程中, 任意一个分片出现问题, 整个UDP数据报都会被丢弃, 意为着UDP数据分片越多危险性越大, 因此在应用层进行数据分包时, 要计算号MSS大小

其他典型协议

DNS(域名系统) :

域名 : 一串由点分隔的名字所组成的互联网上的一个主机/机组名称
域名服务丢弃的划分:
根域名服务器—*域名服务器—二级域名服务器—三级域名服务器
域名的层级划分
*域名: .com / .org / .gov / .edu / .cn / .jp / .us
二级域名: .baidu.com / .qq.com
三级域名 : .baike.baidu.com
域名的解析流程 : 通过域名访问服务器最终转换为通过服务器IP地址访问服务器
1,查看浏览器缓存–>2. 本机hosts文件—>3. 根域名服务器—>4. 本地域名服务器…
解析过程中, 从本地域名服务器往下有两种解析过程 : 迭代/递归

面试问题 : 当浏览器中输入url回车后发生了那些事
1. 根据域名解析流程进行域名解析得到服务器的IP地址

2.根据url组织http协议格式的请求数据
3. 基于socket流程搭建TCP客户端, 向得到的服务器地址发送http协议请求数据

ICMP(网络层协议,主要进行网络探测功能)

向对端发送一个ICMP请求,等待对端的响应, 如果应答,则网络通畅, 如果多次发送仍不应答,则认为网络不通畅

面试问题 : ping 使用多少端口?(telnet使用23号端口, ssh使用22号端口)
ping 使用ICMP协议实现, 该协议为网络层协议, 因此根本不涉及端口