1.网络层
1.1.IP协议
IP协议格式:报头+数据
- 4位版本 :IP协议的版本号.当前只有两个取值,4和6(0100 0110).( 这里讨论IPv4 )
- 4位首部长度 :IP报头和TCP类似,都是可变的,带有选项.
- 8位TOS :只有4位有效,那四位TOS分别表示( 最小延时,最大吞吐量,最高可靠性,最小成本 )(同一时刻只能取一种状态)
- TOS相当于切换形态.根据TOS,IP协议能够规划出两点之间一条比较合适的路径
- 16位总长度 (如果整个IP数据报太长了,IP协议就会把这个大包拆成多个小包,保证每个包都不超过64k).
- 16位标识 :被拆成的多个包的16位标识是相同的.
- 3位标志 :结束标记:结束标记为0表示还有后续其他包,1表示这是最后一个包.
- 13位片偏移 :通过13位片偏移来组织拆分后包的顺序.
- 8位生存时间(TTL) :表示一个IP数据报在网络上还能存在多久,这里的单位不是时间,而是 转发次数 .
- IP数据报被发送的时候,会设置一个初始的TTL(比如常见取值 128/64).
- IP数据报每次经过一个路由器TTL就会-1.如果TTL减到0了,路由器就会将这个包丢弃.
- 因为有些包里的IP地址,可能永远到不了,这样的包如果多了,就会无休止且无意义的占用网络资源,所以TTL可以限制这个包无休止的转发.
- 8位协议 :用来识别传输使用的是哪种协议.TCP或者是UDP都有不同的取值.
- 16位首部校验和 :用来校验数据是否正确
- 32位源IP :表示发件人地址(点分十进制表示)
- 32目的IP :表示收件人地址
- 选项
- 数据
1.2.地址管理
IP地址:网络号+主机号
子网掩码: 左侧都为1,右侧都为0.
- 为1表示这些位网络号
- 为0表示这些位主机号
特殊IP
- 如果主机号全为0,该IP就表示网络号(局域网里的一个正常的设备,主机号不能设为0).
- 如果主机号全为1(255),该IP就表示"广播地址",往这个广播地址上发的消息,整个局域网中都能收到.
- IP地址是127开头的,该IP都表示"环回IP",表示主机自己(127.0.0.1)
- IP地址是 10 开头, 192.168 开头, 172.16-172.31 开头,表示该IP地址是一个局域网内部的IP(内网IP).
- 除此以外剩下的IP称为外网IP.(直接在广域网上使用的IP).
- 要求外网IP一定是唯一的,每个外网IP都会对应到唯一的一个设备.
- 内网IP只是在当前局域网中是唯一的,不同的局域网里,可以有相同的内网IP的设备.
1.2.1.IP地址不够用
随着网络发展:让每个设备都有唯一的IP地址已经不现实了.那该怎么办呢.我们来看一些解决方案.
- 动态分配IP地址.
- 让每个设备连上网的时候,才有IP,不联网的时候就没IP.不联网的时候IP就可以被别人使用.
- 这个方案不能从根本上解决问题(设备没有减少,IP地址也没有增加)治标不治本
- NAT机制(当前网络环境).
- 把网络IP分成内网IP(局域网)和外网IP(广域网).
- 外网IP表示外网中的唯一的设备.
- 内网IP表示内网中的唯一的设备.
- NAT的 动态转换 将内网IP转换成外网IP,从而使内网IP访问可以到外网IP.这样内网中的若干设备就可以共用一个外网IP.
- 同时同一个内网IP可以在不同的局域网中重复出现.
- 这样就可以理解为每个外网IP都表示多个设备.这样IP地址的压力就缓解了很多.
- IPv6(IPv6和IPv4不兼容)
- 在报头中使用了一个更长的字段来表示IP地址(16字节,128位)
- IPv6的表示形式:每个数字都是一个十六进制的数字.每个冒号分割了2个字节.
1.3.路由选择(规划路径)
路由选择就是在两个设备之间,找出一条能够完成传输过程的通道.
- IP数据报中的目的地址,就表示了这个包要发到哪里去.
- 如果当前路由器认识这个目的地址就直接告诉你路了.
- 如果当前路由器不认识就会告诉你一个大概的方向,让你走到下一个路由器的时候再来问问.总有一条路会在询问的过程中离目标越来越近.
- 这个时候就总会遇到一个认识这个地址的路由器于是就可以具体的转发过去了.
- 有的时侯不光遇到了一个认识这个地址的路由器,并且他还认识很多条路,就可以选一个更合适的路了.
什么叫路由器"认识"这个IP地址?
- 在路由器内部维护了一个数据结构,路由表.
- 路由表里面就记录了一些网段信息(网络号),目的IP就在这些网络号中匹配对应的网络号和对应的网络接口(网络接口就是路由器里面具体的端口)
2.数据链路层
数据链路层的主要协议:以太网
- 平时插得数据线叫做以太网线.
- 以太网协议不仅规定了数据链路层的内容,也规定了物理层的内容.
2.1.以太网数据帧
- 目的地址(6) :通过6个字节来表示 源地址和目的地址(这个就要比IPv4 更长,长6w多倍)
- 源地址(6)
- 这里的地址称为"mac地址".mac地址做到了每个设备都是唯一的(每个网卡都是唯一的).是在网卡出厂的时候就写死了(当然也可以通过配置来更改).
- 类型 :类型决定数据
- 0800 表示数据是 完整的IP数据报(46-1500)
- 以太网帧中的数据长度规定最小46字节, 最大1500字节, ARP数据包的长度不够46字节,要在后面补填充位.
- 最大值1500称为以太网的最大传输单元(MTU), 不同的网络类型有不同的MTU.
- 0806 表示数据是 ARP请求/应答(28) + PAD(18)
- PAD用于填充
- 0835 表示数据是 RARP请求/应答(28) + PAD(18)
- 0800 表示数据是 完整的IP数据报(46-1500)
- CRC校验和(4) :基于CRC算法的校验和.
- 例: 循环冗余算法
2.1.1.美好的误会
大家可能觉得 mac地址和IP地址,有点重复了.(按理来说一套地址就够了) 那已经有IP地址了为啥还要物理地址?
- 原因是因为当年网络层协议和数据链路层协议.是各自独立研发出来的.
- 所以现在的现状就是 mac地址和IP地址 同时使用.表示不同的功能
- IP用来表示一次传输过程中的起点和终点. (不考虑NAT的情况,一个IP 数据报中的源IP和目的IP是固定的)
- mac用来表示传输过程中,任意两个相邻节点之间的地址(一个以太网数据帧,在每次转发过程中,源mac和目的mac都会改变)
2.1.2.MTU
- MTU是一个以太网数据帧能够承载的数据范围.
- 这个范围取决于硬件设备,以太网是和硬件密切相关的.
- 不同的硬件设备,对应的数据链路层协议可能不一样,MTU 也可能不相同.
数据链路层考虑的是相邻节点之间的数据传输,考虑这个细节的时候就需要关注到硬件设备的数据搭载量.
- 不同的交通工具,能够搭载的数据量就不太相同
- 那如果数据报超过了MTU 咋办?
- 这就考虑到IP层的分包了.
- IP层的分包其实不是给IP的报头64k准备的, 更多的是为了适应数据链路层的MTU.
2.1.2.1.MTU对UDP和TCP的影响
- MTU对UDP的影响
- 一旦UDP携带的数据过大, 那么就会在网络层分成多个IP数据报
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败.
- 那么这就意味着, 如果 UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
- MTU对TCP的影响
- TCP的一个数据报也不能无限大, 还是受制于MTU.
- TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size).
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度 (这个长度仍然是受制于 数据链路层的MTU)
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
- MSS的值就是在TCP首部的40字节变长选项中 (kind=2)
- 所以MTU对TCP的影响是比较小的.
- TCP的一个数据报也不能无限大, 还是受制于MTU.
2.1.3.ARP协议
ARP协议的作用: ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
- 发送数据时源主机发出ARP请求, 在知道目的IP的情况下,广播形式询问目的IP“硬件地址是多少” (以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播).
- 目的主机接收到广播的ARP请求, 发现其中的IP地址与本机相符, 则发送一个ARP应答数据包给源主机, 将自己的硬件地址填写在应答包中.
- 每台主机都维护一个ARP缓存表, 可以用arp -a命令查看. 缓存表中的表项有过期时间 (一般为20分钟), 如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址.
2.1.4.DNS协议
DNS是一个应用层协议.用于域名解析.
域名
因为IP地址不好记.即使写成了点分十进制,仍然对于人类来说不太友好.所以就使用一串英文单词,来表示这个IP地址.这串英文单词,就称为域名.
- gitee.com就是域名
- 域名和IP地址之间,是一一对应的关系
DNS 系统最开始的时候,只是一个普通的文件.称为hosts文件.
- hosts文件的每一行,就描述了IP和域名(140.82.114.3 github.com)之间的关系
- 后续其他程序(浏览器)中使用这个域名,就会被自动转换成IP地址
- 现在, hosts文件已经不再使用了
- 虽然仍然是好使的
- 但是全世界的域名那么多,总不能天天在这对这个 hosts改来改去.
- 所以干脆就专门成立一个机构,负责维护这里的域名和IP的应对关系
- 比如你要申请一个域名,就去这个机构报备即可
- 这个机构维护一组服务器,把 hosts 文件存到这个服务器里域名解析服务器( 根域名解析服务器 )
- 想要进行域名解析,就访问一下这个人家的服务器就行了
全世界的设备这么多.每个设备上网,都要去访问这个域名解析服务器的话,域名解析服务器就会压力很大.
- 为了避免根域名解析服务器压力太大的情况,全世界各个地方的国家,地区,城市,有各自的网络运营商, 这些网络运营商会就近架设域名解析镜像服务器(定期和根域名解析服务器同步即可)
- 咱们平时上网的时候,一般就是就近访问了咱们的镜像服务器.(可以配置访问镜像服务器)