Linux 网络基础--网络层+数据链路层
Posted qnbk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 网络基础--网络层+数据链路层相关的知识,希望对你有一定的参考价值。
网络层+数据链路层
网络层
在复杂的网络环境中确定一个合适的路径。
网络层:ip具有能将数据跨网络传送到对端主机的能力
(主机-》网络-》主机)
ip前提:把报文从一台主机送到和自己直接相连的下一台主机(数据链路层提供:mac帧)
ip协议
主机:配有ip地址,但是不进行路由控制的设备;路由器:即配有ip地址,有能进行路由控制;节点:主机和路由器的统称
协议头格式
- 4位版本号:指定ip协议的版本,对于ipv4来说就是4
- 4位首部长度:ip头部的长度是多少个32位bite,也就是length*4的字节数,4bite的最大的数字是15,因此ip头部的最大长度是60字节
- 8位服务类型:3位优先权字段(已弃用),4位TOS字段,和1位保留字段(必须设置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四个互相冲突,只能选一个,对于ssh/telnet这样的应用程序,最小延时重要;对于ftp最大吞吐量重要
- 16位总长度:ip数据报整体占多少个字节
- 16位标识:唯一的标识主机发送的报文,如果ip报文在数据链路层被切分了,那么每一个片里面的这个id都是相同的
- 3位标志字段:第一位保留,第二位置为1表示禁止分片,此时如果报文长度超过MTU,ip模块就会丢弃报文;第三位表示”更多分片“,如果分片了,最后一个置为1,其他是0,类似于一个结束标记。0:标识后续没有了;1:标识后续还有报文
- 13为分片偏移,是分片相对于原始ip报文开始处的偏移,其实就是在表示当前分片在原报文处在哪个位置,实际偏移量的字节数是这个值*8得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文不连续)
- 8为生存时间:数据报到达目的地的最大报文跳数,一般是64,每次经过一个路由,TTL-=1,一直减到0还没有到达,那么就丢弃了,这个字段主要是用来防止出现路由循环
- 8为协议:表示上层的协议类型
- 16为首部校验和:使用CRC进行校验,来鉴别是头部是否损坏
- 32为源地址和32为目标地址:表示发送端和接收端
- 选项字段:不定长,最大40字节
MAC的有效载荷最大是MTU,MTU=ip报头+ip数据(->tcp报头+tcp数据->http报头+数据)。每一个分片必须携带ip报头
网段划分
为什么需要网络划分?
ip地址分为两个部分:网络号和主机号
- 网络号:保证相连的两个网段有不同的标识
- 主机号:同一网段内,主机之间具有相同的网络号,但是必须要不同的主机号
1、不同的子网其实就是把网络号相同的主机放到一起
2、如果在子网中新增一台主机,则这台主机的网络号和这个子网号一致,但是主机号不能和次网中其他主机重复
通过合理设置主机号和网络号就可以保证在互联的网络中,每台主机的ip地址都不相同
管理子网ip很麻烦
- 有一种技术叫做DHCP,能够自动给子网内新增主机节点分配ip地址,避免了手动管理ip的不便
- 一般的路由器都带有DHCP功能,因此路由器也可以看做是一个DHCP服务器
有一种划分网络号和主机号的方案,把所有ip地址分为5类
- A类:0.0.0.0到127.255.255.255
- B类:128.0.0.0到191.255.255.255
- C类:192.0.0.0到223.255.255.255
- D类:224.0.0.0到239.255.255.255
- E类:240.0.0.0到247.255.255.255
随着互联网发展,这种划分方案出现了弊端,大多数申请B类地址,导致B类地址很快用完,而A类浪费了大量地址。
针对这种情况,提出了新的划分方案:称为CIDR
- 引入一个额外的子网掩码来区分网络号和主机号
- 子网掩码是一个32为的正整数,通常用一串0来结尾
- 将ip地址和子网掩码进行按位与操作,得到的结果就是网络号
- 网络号和主机号的划分与ip地址是A类还是B类无关
特殊的ip地址
- ip地址中的主机地址全部设置为0,就成了网络号,代表这个局域网
- 将ip地址中的主机地址全部设置为1,就成了广播地址,用于给同一个链路中互相连接的所有主机发送数据包
- 127.*的ip地址用于本机环回测试,通常是127.0.0.1
ip地址的数量限制
ip地址(ipv4)是一个4字节32位的正整数,那么只有2^32个ip地址,大概是43亿,而tcp/ip协议规定,每个主机都要有一个ip地址。
那么,只有43亿台主机能接入网络吗?
实际上,由于一些特殊的ip存在,数量不足43亿;另外ip地址并非是按照主机台数来设置的,而是每一个网卡都需要配置一个或多个ip地址
CIDR在一定程度上缓解了ip地址不够的问题(提高利用率,减少浪费,但ip地址数并没有增加),但是还是不够用,这时有三种方式解决
- 动态分配ip地址,只给接入网络的设备分配ip地址,因此同一个mac地址的设备,每次接入互联网中,得到的ip不一定是相同的
- NAT技术
- ipv6:ipv6不是ipv4的简单升级版,这是两个互不相干的协议,彼此并不兼容。ipv6用16字节128位来标识一个ip地址。
私有ip地址和公网ip地址
如果一个组织内部组建局域网,ip地址只用于局域网内的通信,而不直接连到Internet上,理论上,使用任意的ip地址都可以,但是RFC98规定了用于组建局域网的私有ip地址
- 10.*,前8位是网络号,共16777216个地址
- 172.16. 到172.31. ,前12位是网络号,共1048576个地址
- 192.168.* 前16位是网络号,共65536个地址
- 包含在这个范围中的,都称为私有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,这种技术称为NET(网络地址转换)
- 如果自己实现的服务器程序能够在公网被访问到,就需要把程序都部署在一台具有外网ip的服务器上
路由
在复杂的网络结构中,找出一条通往终点的路线
ip数据包的传输过程也同问路一样
- 当ip数据包到达路由器时,路由器会先查看目的ip
- 路由器决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器
- 依次反复一直到达目标地址ip
查看路由表
route
- 如果目的ip命中了路由表,直接转发即可
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其他行都不匹配时,就按缺省路由条目规定的接口发到吓一跳地址
- Genmask:子网掩码;Destination:目的网络地址;Getway:下一跳地址;IFace:发送连接口;Flags中的U表示此条目有效,G表示此条目标的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机直接相连的网络,不必经路由器转发。
数据链路层
以太网
- 以太网不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含一些物理层的内容。eg:规定网络拓扑结构,访问控制方式,传输速率等
- 以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等
- 以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等
以太网帧格式
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的
- 帧协议类型字段有三种值,分别对应IP,ARP,RARP;
- 帧末尾时CRE校验码
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位及6个字节,一般用16进制数字加上冒号表示
- 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的
对比MAC和IP
- ip地址描述的是路途总体的起点和终点
- MAC地址描述的是路途上的每一个区间的起点和终点
MTU
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节 ,要在后面填充位
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片
- 不同的数据链路层标准的MTU不同
MTU对IP协议的影响
由于数据链路层MTU的限制,对于较大的IP数据包要进行分包
- 将较大的IP包分成多个小包,并给每个小包打标签
- 每个小包协议ip报头的16位标识都是相同的
- 每个小包的ip协议头的3位标志字段中,第2位置问0,表示允许分片,第三位来表示结束标记(当前是否是最后一个小包,是为1,不是为0)
- 到达对端后时再将这些小包按顺序重组,拼装到一起返回给传输层
- 一旦这些小包中的任意一个丢失,接收端的重组失败,但是ip层不负责重新传数据
MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500-20(ip首部)-20(tcp首部)),那么就会在网络层分成多个ip数据报
- 这多个ip数据报有任意一个丢失,都会引起接收端网络层重组失败,那就意味着如果UDP数据报在网络层被分片,整个数据被丢失的概率大大增加
MTU对TCP协议的影响
回顾TCP协议
- TCP的一个数据报受制于MTU,TCP单个数据报的最大长度为MSS
- TCP在建立连接的过程中,通信双方会进行MSS协商
- 最理想的情况下,MSS的值正好是在ip不会被分片处理的最大长度(此长度受制于数据链路层的MTU)
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
- 双方得知对方的MSS值后,选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项中
查看硬件地址和MTU
ifconfig
ARP协议
ARP不是一个单纯的数据链路层协议,而是介于数据链路层和网络层之间的协议
ARP协议的作用
ARP协议建立了主机ip地址和MAC地址的映射关系
- 在网络通讯时,源主机的应用程序直到目的主机的ip地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件按地址与本机地址不符,则直接丢弃
- 因此在通讯前必须获得目的主机的硬件地址
ARP协议的工作机制
- 源主机发出ARP请求,询问ip地址是xxx的主机的硬件地址是多少,并将这个请求广播到本地网段(以太网首部的硬件地址填:FF:FF:FF:FF:FF:FF表示广播地址)
- 目的主机接收到广播的ARP请求,发现其中的ip地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写到应答包中
- 每台主机都维护一个ARP缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为20min),如果在20min内没有再次使用某个表项,则该表项失败,下次还要发ARP请求来获得目的主机的硬件地址
ARP协议的格式
- 注意到源MAC地址,目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其他类型的网络则有可能是必要的
- 硬件类型是指链路层网络类型,1为以太网
- 协议类型是指要转换的地址类型,0x0800为ip地址
- 硬件地址长度对于以太网地址为6字节
- 协议地址对于ip地址是4字节
- op字段为1表示ARP请求,op字段为2表示为ARP应答
其他重要的协议/技术
DNS
DNS是一整套从域名映射到IP的系统
DNS背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是ip地址不方便记忆,于是人们发明了一种叫做主机名的字符串,并且使用hosts文件来描述主机名和ip地址的关系
最初,是通过互联网信息中心来管理hosts文件的
- 如果一个新计算机要接入网络,或者某个计算机ip变更,都需要到信息中心申请变更hosts文件
- 其他计算机也需要定期下载更新版本的hosts文件才能正确上网
太麻烦了,于是产生了DNS系统。
- 一个组织的系统管理机构,维护系统内的每个主机的ip和主机名对应的关系
- 如果新计算机接入网络,将这个信息注册到数据库中
- 用户名输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的ip地址
查找hosts文件
cat /etc/hosts
域名介绍
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称
eg: www.baidu.com
域名使用/连接
- com:一级域名,表示是一个企业名,同级的还有net(网络提供商),org(非营利组织)等
- baidu:二级域名,公司名
- www. :习惯用法,人们往往命名成ftp.xxx.xxx/www.xxx.xxx这样的格式来表示主机支持的协议
使用dig工具分析DNS过程
安装dig
yum install bind-utils
使用dig查看域名解析过程
eg: dig www.baidu.com
- 开头位置是 dig指令的版本号
- 第二部分是服务器返回的详情, status参数 NOERROR表示查询成功
- QUESTION SECTION 表示要查询的域名是什么
- ANSWER SECTION表示查询结果是什么
- 最下面是结果统计,包含查询时间和DNS服务器的地址等
ICMP协议
ICMP是一个网络层协议
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否通畅,但是ip协议并不提供可靠传输,如果丢包了,ip协议并不能通知传输层是否丢包以及丢包的原因
ICMP的功能
ICMP正是提供这种协议的功能的协议,主要功能包括
- 确认ip包是否成功达到目标地址
- 通知在发送过程中ip包被丢弃的原因
- ICMP也是基于IP协议工作的,但是它不是传输层的功能,因此把它归结为网络层协议
- ICMP只能搭配ipv4使用,如果是ipv6的情况下,需要使用ICMP6
ICMP的报文格式
ICMP分为两种报文
- 通知出错原因
- 诊断查询
ping命令
- 此处ping的是域名,而不是Url,一个域名可以通过DNS解析成ip地址
- ping命令不光能验证网络的连通性,还能统计响应时间和TTL(IP中的生存周期)
- ping命令会先发送一个ICMP Echo Request给对端
- 对端接收后会返回一个ICMP Echo Reply
ping命令基于ICMP是在网络层,不是传输层的内容,所有没有端口号。ICMP不关注端口号
traceroute命令
基于ICMP协议实现,能够打印出可执行程序主机,一直到目标主机之前经历过多少路由器
NAT
NAT技术解决了IP地址不够用的主要手段,是路由器的一个重要功能
- NAT能将私有IP对外通信时转为全局IP,也就是一种私有ip和全局ip互相转化的方法
- 家庭,公司内部采用每个终端设置私有ip,而在路由器或必要的服务器上设置全局ip
- 全局ip要求唯一,但是私有ip不需要;在不同的局域网中出现相同的私有ip是不影响的
NAT IP转化过程
- NET内部有一张自动生成,用于地址转化的表
- NET路由器将源地址从10.0.0.1替换成全局的ip123.3.2.3
- NET路由器收到外部的数据时从123.3.2.3替换成10.0.0.1
- 当10.0.0.1第一次向123.3.2.3发送数据时就会生成表的映射关系
NAPT
如果局域网内有多个主机访问同一个外网服务器,那么对于 服务器返回的数据中,目的ip都是相同的,NAT路由器如何判定这个数据包该转发给哪个局域网的主机?
NAPT使用ip+port来建立关系解决此问题
这种关系是由NET路由器自动维护,eg:在TCP情况下,建立联系时,就会生成表项,在断开连接后就会删除此表项
NAT
由于NAT依赖转换表,会有很多限制
- 无法从NAT外部向内部服务器建立连接;
- 转换表的生成和销毁都需要额外开销
- 通信过程中一旦NAT设备异常,即使存在设备,所有的TCP连接都会断开
NAT和代理服务器
路由器往往具有NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程
代理服务器看起来和NAT设备有点像,客户端向代理扶额u我发送请求,代理服务器将请求发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端
- NAT设备是网络基础设备之一,解决的是IP不足的问题,代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙
- 从底层讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层
- 从使用范围讲,NAT一般在局域网的出口部署代理服务器可以在局域网做也可以在广域网做,也可以跨网
- 从部署位置来看,NAT一般集成在防火墙,代理服务器则是一个软件程序,需要部署在服务器上
代理服务器是一种应用较广的技术
- 翻墙:广域网中的代理
- 负载均衡:局域网中的代理
代理服务器是又分为正向代理和反向代理
以上是关于Linux 网络基础--网络层+数据链路层的主要内容,如果未能解决你的问题,请参考以下文章