linux-网络基础三

网络层

  • 负责地址管理与路由选择;
  • 在复杂网络通信环境中,为每一条数据选择一条合适路径进行传输;
  • 而选择路径是根据每一条数据中的目的端地址决定的
  • 并且路由选择也依托于良好的地址管理

IP协议

IP协议字段:

linux-网络基础三_第1张图片

  • 4位协议版本:
  • 4位头部长度:以4字节为单位 20~60
  • 8位服务类型: 4位TOS字段
  • 16位数据报长度:包括IP头在内,一个IP报文的长度—一个udp报文的最大数据段大小64k-20-8
  • 16位标识: udp数据报大小大于MTU大小,但是小于64K-20-8时,会在网络层进行数据分片
  • 为了能够在对端有序对分片进行udp数据报重组,因此需要标识哪个分片属于哪个udp数据报
  • 3位标记: 1位保留,1位标记是否禁止分片, 1位标记末位分片
  • 13位片偏移:标识每个分片数据相对于完整udp数据报起始位置的偏移量–实现分片有序重组
  • 8位TTL:默认64,每经过一个路由器跳数则-1,为0时数据丢弃
  • 8位上层协议:用于数据分用时选择上层解析协议
  • 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
  • 32位源地址和32位目标地址: 表示发送端和接收端.
  • 选项字段(不定长, 最多40字节):

地址管理:

IP地址:用于唯一标识网络中的一台主机

  • 每一个路由器都可以组建一个局域网, 并且局域网中的IP地址大多都是经过路由器进行DHCP动态分配的地址,如果IP地址随意进行分配,很容易就会出现地址冲突;因此IP地址不能随意分配
  • 路由器为每一个局域网中的设备 分配的IP地址中都应该包含这个网络的标识-网络号
  • 并且在局域网中为了能够唯一标识每个主机,因此IP地址中还包含有这个主机标识-主机号
  • IP的组成:网络号+主机号
    相邻的网络只要规定不能使用相同的网络号,就可以避免IP地址分配上的冲突

网段的划分:

早期网段划分方式:所有的IP地址分了五类

  • A类:高1位固定,高7位是网络号,低24位是主机号0.0.0.0~127.255.255.255
  • B类:高2位固定,高14位是网络号,低1 6位是主机号128.0.0.0~191.255.255.255 64k个主机号
  • C类:高3位固定,高21位是网络号,低8位是主机号192.0.0.0~223.255.255.255 256个主机号
  • D类: 223.0.0.0~239.255.255.255
  • E类: 240.0.0.0~247.255.255.255

现在的网段划分式: CIDR方案

在CIDR方案中引入了一个关键信息:子网掩码子网掩码:

本质: uint32 t整数,必须由一串连续的二进制1组成作用:

  • 1.子网掩码与IP地址相与可以得到网络号

  • 2.子网掩码取反,可以得到局域网中主机号个数

例如:

IP: 192.168.122.132 NETMASK: 255.255.255.0
IP & NETMASK: 192.168.122.0
~NETMASK: 255 主机号范围: 0 ~ 255 局域网中由256个主机

网络中的特殊地址:

  • 主机号全为0的IP地址—网络号–用于标识一个网络,不能分配给主机
  • 主机号全为1的IP地址—UDP局域网广播地址,不能分配给主机
  • 在一个局域网中能够分配给主机的主机号只有主机号个数-2
    127.0.0.1:本机的虚拟环回网卡地址,常用于本机的网络回环测试
    0.0.0.0 255 255.255.255

私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址

  • 10.* . * .*, 前8位是网络号,共16,777,216个地址
  • 172.16.* .* ~172.31.* .* , 前12位是网络号,共1,048,576个地址
  • 192.168.* .*, 前16位是网络号,共65,536个地址 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

路由

  • 在复杂的网络结构中, 找出一条通往终点的路线;
  • 路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.
  • 所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
    linux-网络基础三_第2张图片
    IP数据包的传输过程也和问路一样.
  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  • 依次反复, 一直到达目标IP地址

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表

  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表, 就直接转发即可;
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:
linux-网络基础三_第3张图片

  • 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络;
  • 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;

转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3

  • 跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
  • 再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
  • 由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2

  • 依次和路由表前几项进行对比, 发现都不匹配;
  • 按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
  • 由192.168.10.1路由器根据它的路由表决定下一跳地址;

数据链路层

  • 负责相邻设备之间的数据帧传输;
  • 网络层的IP地址定位的是网络通信环境中的起点和终点
  • 链路层的MAC地址定位的是相邻的网络设备网卡

以太网协议

字段:

linux-网络基础三_第4张图片

  • 源MAC/目的MAC地址:定位相邻的两个设备. 是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
  • 上层协议:用于数据分用时选择上层协议,帧协议类型字段有三种值,分别对应IP、ARP、RARP;
  • 数据
  • CRC:数据帧尾标识,校验和

MAC地址:

uint8_ t mac[6]无符号48位的整数,用于标识相邻的设备;出厂的时候就会设定
如何获取相邻设备的MAC地址:

arp协议

  • ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网
    络层之间的协议;
  • 使用ARP协议获取相邻设备的mac地址:通过相邻设备的ip地址获取其mac地址

组织一个arp请求数据(包含源端mac+ip+目的端ip)进行广播(目的端mac=0FFFFFFFF)
相邻的设备都能收到这个arp请求,将数据中的目的IP地址与自己网卡的IP地址进行比对,是否相同;

  • 若不同,则丢弃数据;
  • 若相同则组织arp响应数据,包含自己mac响应给对方

请求方获取到相邻设备的mac地址之后,会缓存起来这个IP地址与mac地址的映射关系,但是并不会缓存太长时间(因为dhcp动态地址分配,主机的IP地址会改变)

MAC地址和IP地址

  • IP地址描述的是路途总体的起点和终点;
  • MAC地址描述的是路途上的每一个区间的起点和终点

MTU

MTU:最大传输单元,定义了链路层以太网帧数据最大有多长
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层标准的MTU是不同的
    linux-网络基础三_第5张图片

MTU对IP协议的影响

  • 由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
  • 将较大的IP包分成多个小包, 并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
  • 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据

MTU对UDP协议的影响

udp协议因为不会在传输层进行数据分段,当数据大小大于mtu但是小于64k- 20-8的时候,

在网络层就会进行数据分片,将一个完整的udp数据报分片成为一个个的小数据发送出去;这些分片到达对端之后就会进行分片重组,
一个分片出问题,这个udp数据报都会被丢弃,意味着分片越多越危险;
因此用户在应用层进行udp数据分包的时候最好就能考虑每个数据包的大怀要大于mss尽可能减小数据分片的几率

MTU对于TCP协议的影响

tcp协议在三次握手时就会双方协商mss大小(取决于自身的mtu),取双方较小的一方作为标准进行传输,从发送缓冲区中取出数据进行发送的时候,取出的数据不会大于mss;因此通常会说: tcp在传输层会自动进行数据分段,因此不会在网络层进行数据分片

重要技术:NAT技术(网络地址转换技术)

nat服务通常部署在网关设备上,对流经网关的数据进行地址替换,将数据中的源端地址,替换为本机地址目的是为了让数据怎么出去,响应就怎么回来

背景

之前讨论的 IPv4协议中, IP地址数量不充足的问题

NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;

  • NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的

NAT IP转换过程

linux-网络基础三_第6张图片

  • NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
  • NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
  • 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
  • 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系

NAPT

那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
linux-网络基础三_第7张图片
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项

NAT和代理服务器

路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.

NAT和代理服务器的区别

  • 应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行, 另外像迅游这样的加速器, 也是使用代理服务器.
  • 底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
  • 使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
  • 部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.

代理服务器又分为正向代理和反向代理:

  • 正向代理用于请求的转发(例如借助代理绕过反爬虫).
  • 反向代理往往作为一个缓存.

你可能感兴趣的:(网络编程,linux)