目录
IP协议
编辑
基本概念:
协议头格式:
编辑
网段划分
DHCP :
CIDR:
特殊的IP地址:
IP地址的数量限制:
私有IP和公网IP
路由
路由的过程:
数据链路层
认识以太网:
以太网帧:
认识MAC地址
认识MTU:
MTU对IP协议的影响:
MTU对UDP协议的影响:
MTU对TCP协议的影响:
MSS和MTU 的关系:
ARP协议
ARP协议的作用:
ARP协议的工作流程:
编辑
ARP数据报的格式:
其他重要协议或技术
DNS(Domain Name System)
背景:
域名简介:
[经典面试题 ]
浏览器输入url后,发生的事情?
ICMP协议
ICMP功能 :
ICMP报文格式:
编辑
ping命令
NAT技术
NAT技术背景 :
NAPT
NAT的技术缺陷:
NAT和代理服务器:
总结
数据链路层:
网络层:
传输层:
应用层:
IP协议
基本概念:
主机:配有IP地址,但是不进行路由控制的设备
路由器:即配有IP地址,又能进行路由控制
节点:主机和路由器的统称
协议头格式:
详情:
- 4位版本号:指定IP协议的版本 。对于IPv4来说,就是4
- 4位头部长度:IP头部的长度是多少个32bit,也就是length * 4 字节数,4bit能表示的最大的数字是15,因此IP头部最大长度是60字节
- 8位服务类型:3位优先权字段(已弃用),4位TOS字段,和一位保留字段(必须置位0)
- 4位TOS分别表示:最小延迟,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个,对于ssh和telnet这样的应用程序来说,最小延迟比较重要,对于ftp来说最大吞吐量比较重要
- 16位总长度:IP数据包整体占多少个字节
- 16位标识:唯一的表示主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的
- 三位标志字段:第一位保留(保留的意思是现在就算不同也留下以备以后使用),第二位置位1的话表示禁止分片,如果这时候报文长度超过MTU,就直接被IP模块丢弃,第三位表示更多分片,如果分片的话这个分片置为1,其他是0,类似一个结束标记
- 13位片偏移:是分片相对于原始报文IP开始处的偏移,其实就是相当于当前分片应该在原始报文中的哪一个位置。实际偏移的字节数是这个值* 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍
- 8位生存时间:数据包到达目的地最大报文跳数,一般输64,没经过一次路由,TTL -= 1,一直减到0还没到达的话,就直接丢弃了。这个字段主要是为了防止路由循环
- 8位协议:表示上层协议的类型(tcp/udp ....)
- 16位头部检验和:使用CRC进行校验,来鉴别头部是否损坏
- 32位源地址和32位目标地址:表示发送端和接收端
- 选项字段(不定长):最多40字节
网段划分
- 网络号:保证相互连接的两个网段具有不同的标识
- 主机号:同一网段内,主机之间具有相同的网络号,但是主机号必须不同
- 不同的子网其实就是把网络号相同的主机放到一起
- 如果在子网中新增一台主机,则这台诸暨的网络号和这个子网的网络号一致,但是主机号不能和该子网中的其他主机重复
通过设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都相同
DHCP :
- 有一种技术叫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
随着Internet的发展,大多数组织都申请了B类网络地址,导致B类地址很快就分配完了,而A类缺浪费了大量地址
- 例如,申请了一个B类地址,理论上 一个子网内能允许6万5千多个主机,A类地址更多
- 然而实际网络架设中,不会存在一个子网有这么多使用的情况,大多数都是浪费掉了
针对这种情况,提出了一个新的方案
CIDR:
- 引入一个子网掩码来区分网络号和主机号
- 子网掩码也是一个32位的正整数,通常用一串 0 结尾
- 将子网IP和子网掩码进行按位与操作,得到的结果就是网络号
- 网络号和主机号的划分与这个IP地址是A类、B类、C类无关
所以IP地址和子网掩码与运算后就可以得到网络号,主机号从0~1就是子网的地址范围
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24 表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0
特殊的IP地址:
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
- 将IP地址中的主机地址全部设为1,就是广播地址,用于给同一链路中相互连接的所有主机发送数据包
- 127.*的IP地址用于本机环回测试,通常是127.0.0.1
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地址;但是目前IPv6没有普及
私有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地址,一个是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数据包,到达路由器时,路由器会先查看目的IP
- 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下个路由器
- 依次反复,直到到达目的IP
- 路由表可以使用route命令查看
- 如果IP命中了路由表,直接转发就可以了
- 路由表中的最后一行,只有由下一跳地址和发送端口两部分组成,当目的地址与路由表中其他行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址
路由表中的flags中如果是U标志,表示此条目有效,如果是G标志表示此条目的下一条的地址是某个路由器的地址,没有G标志的条目表示目的网络是与本机接口直连的,不用路由器转发
假设某主机上的网络接口配置路由表如下图
样例1
转发过程 1: 如果要发送的数据包的目的地址是192.168.56.3
- 先跟第一行的子网掩码做运运算 得到192.168.56.0和第一行的网络地址不符
- 再跟第二行的子网掩码与运算一下,发现网络地址相符,因此从eth1接口发送出去
- 由于192.168.56.0/24正是与eth1 接口直接相连的网络,因此可以直接发送到目标主机,不需要经过路由器的跳转
样例2
转发过程2:如果要发送的数据包的目的地址是202.10.1.2
- 一次和路由表前嘉兴进行对比,发现都不匹配
- 按缺省路由条目,从eth0接口发送出去,发往192.168.10.1路由器
- 由192.168.10.1路由器根据他的路由表决定下一个地址(if 不知道 那就 反复往上直到它知道)
数据链路层
认识以太网:
-
"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
-
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
-
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
以太网帧:
认识MAC地址
-
MAC地址用来识别数据链路层中相连的节点;
-
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
-
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
对比理解IP地址和MAC地址
- IP地址是代表起点和终点
- MAC地址描述的是路径上的每一个区间的起点和终点
认识MTU:
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的MTU是不同的;
MTU对IP协议的影响:
由于数据链路层MTU的限制,对于大的IP数据包要进行分包
- 将较大的IP包分成多个小包, 并给每个小包打上标签
- 每个小包IP协议头的 16位标识(id) 都是相同的
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据
MTU对UDP协议的影响:
MTU对TCP协议的影响:
- TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项中(kind=2)
MSS和MTU 的关系:
查看硬件地址和MTU
ARP协议
ARP不是一个单纯的数据链路层协议,而是一个结余数据链路层和网络层之间的协议
ARP协议的作用:
ARP协议建立了主机IP地址和MAC地址的映射关系
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的,如果接受到的数据包的硬件地址和本机不符,则直接丢弃
- 因此在通信前必须获得目的主机的硬件地址
ARP协议的工作流程:
- 源主机发送ARP请求,询问IP地址是192.168.0.1的主机的硬件地址是多少,并将这个请求广播到本地网段(以太网首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送ARP应答数据给源主机,将自己的硬件地址填写在应答包中
- 每台主机都维护一个ARP缓存表,可以使用arp -a查看,缓存表中的过期时间一般为20分钟
Q1:为什么要有缓存表 ?
A1:
- 第一当然就是提高性能,当我们没有对方的MAC的时候,会进行ARP请求广播,最后返回中包含MAC地址,但是如果每次通信前都要进行这一步就会大大增加通行时间
- 减少网络负载:在大规模的局域网中,每次都广播ARP请求会产生很大的网络负载。使用缓存表,可以有效减少这种广播流量,提高网络的效率。
-
优化网络交互:缓存表可以提供一种快速查找映射关系的方式,确保主机可以快速而准确地找到目标主机的MAC地址。这样可以在通信过程中减少不必要的等待和延迟。
Q2:为什么缓存表要有过期时间?
-
动态网络拓扑:局域网中的设备和网络拓扑可能会发生变化。例如,当设备重新启动、添加新设备、更换设备,或进行网络重组时,IP地址与对应的MAC地址的映射关系可能会发生变化。为了避免使用过时的映射关系,设备需要定期刷新ARP缓存表。
-
IP地址分配变更:动态主机配置协议(DHCP)通常用于分配局域网中的IP地址。IP地址的分配和释放可能会导致映射关系的变动。缓存表中的映射关系应该及时更新以反映最新的IP地址分配状态。
-
缓存表空间有限:设备上的ARP缓存表通常有一定的存储空间限制。如果持续保留所有的映射关系,可能会消耗过多的资源。
-
对应关系变更:由于网络攻击、欺骗或设备故障等原因,MAC地址的对应关系可能会被恶意篡改或伪造。
ARP数据报的格式:
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答;
其他重要协议或技术
DNS(Domain Name System)
DNS是一整套从域名映射到IP的系统
背景:
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
最初,通过互联网信息中心(SRI-NIC) 来管理这个hosts文件的
- 如果一个新的计算机要接入网络,或者计算机的IP变更,都需要到信息中心申请变更hosts文件
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网
这样太麻烦了,于是有了DNS系统
- 一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系
- 如果新计算机接入网络, 将这个信息注册到数据库中
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址
域名简介:
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称
www.csdn.com
- com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等
- csdn: 二级域名, 公司名.
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx 这样的格式, 来表示主机支持的协议.
[经典面试题 ]
浏览器输入url后,发生的事情?
① 首先,在浏览器输入需要的网址
② 浏览器查找域名对应的IP地址,DNS查找过程如下
- 浏览器缓存 -- 浏览器会缓存DNS记录一段时间,不同的浏览器不同(2~30min不等)
- 系统缓存 -- 如果浏览器缓存里没有,那浏览器会做一个系统调用(window是gethostbyname)可以获取系统缓存中的记录
- 路由器缓存 -- 接着,前面的查询请求发送给路由器,路由器一般都能找到对应的缓存记录
- ISP DNS 缓存 -- 接下来check的就是ISP缓存DNS的服务器,一般都能找到
- 递归搜索 -- 你的ISP的DNS服务器从根域名服务器开始递归搜索,从.com顶级域名服务器到Csdn的域名服务器
③ 浏览器给web服务器发送一个http请求(get or post)
④ 目标服务(csdn)重定向相应:即我请求csdn.com 就会重定向到 https://www.csdn.com/
⑤ 浏览器跟踪重定向地址,浏览器知道了https://www.csdn.com/ 是正确的地址之后,它会发送一个正确的请求
⑥ 服务器"处理"请求 :收到请求后处理后并返回响应(响应可能是html,也可能是一串json等等)
⑦ 服务器返回HTML响应 状态码是200 表示请求成功
⑧ 浏览器开始显示HTML
⑨浏览器发送获取嵌入在html中的对象,比如登录在线OJ的时候,有个登录图片,这就是嵌入在html中的
⑩浏览器发送异步(AJAX)请求:持续的与服务器保持联系
ICMP协议
ICMP是一个网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因
ICMP功能 :
- 确认IP包是否到达目标地址
- 通知发送过程中IP包被丢弃的原因
- ICMP也是基于IP协议工作的,但是他并不是传输层的功能,所以归结为网络层
- ICMP只能搭配IPv4使用,如果是IPv6,需要用ICMPv6
ICMP报文格式:
ICMP大概分为两类报文:
ping命令
- ping的是域名不是url ,一个域名可以通过DNS解析成IP地址
- ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live生命周期)
- ping 命令会先给对端发送一个ICMP Echo Request给对端
- 对端接收到之后,会返回一个ICMP Echo Reply
- 记住,ping命令基于ICMP,在网络层,而端口号是传输层的东西,在ICMP中根本就不关心端口号
NAT技术
NAT技术背景 :
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的
- NAT路由器将源地址从10.0.0.10替换成全局的IP 202.222.144.33;
- NAT路由器收到外部的数据时, 又会把目标IP从202.222.144.33替换回10.0.0.10;
- 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
- 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系,便于收到请求
NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
NAT的技术缺陷:
由于NAT依赖转换表,所以有很多限制
- 无法从NAT外部向内部建立连接
- 转换表的生成和销毁需要额外开销
- 通信过程中一旦NAT异常,所有的TCP连接都会断开
NAT和代理服务器:
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上
代理服务器是一种应用很广的技术:
代理服务器又分为正向和反向代理
代购例子
我去国外进口手机,但是我嫌麻烦,叫我弟替我出国买,我弟这里就是正向代理
之后找我弟买的人过多,我弟一次囤了不少手机,之后别人找他代购,他就把屯下来的手机卖给这些人,这时候是反向代理
总结 :正向代理用于请求的转发 ,反向代理往往作为一个缓存
总结
数据链路层:
-
数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
-
以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等
-
以太网帧格式
-
理解mac地址
-
理解arp协议
-
理解MTU、
网络层:
- 网络层的作用: 在复杂的网络环境中确定一个合适的路径
- 理解IP地址, 理解IP地址和MAC地址的区别.
- 理解IP协议格式
- 了解网段划分方法
- 理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP
- 理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
- 理解IP数据包分包的原因
- 了解ICMP协议
- 了解NAT设备的工作原理
传输层:
- 传输层的作用: 负责数据能够从发送端传输接收端
- 理解端口号的概念
- 认识UDP协议, 了解UDP协议的特点.
- 认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
- 掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性
- 理解TCP面向字节流, 理解粘包问题和解决方案
- 能够基于UDP实现可靠传输.
- 理解MTU对UDP/TCP的影响
应用层:
- 应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
- 能够根据自己的需求, 设计应用层协议.
- 了解HTTP协议
- 理解DNS原理和工作流程