IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 《TCP-IP详解》笔记 -> 正文阅读

[网络协议]《TCP-IP详解》笔记

本文主要参考了《TCP/IP详解-卷1》、Yes-Lab视频lifei6671的笔记的内容,在此表示感谢。

一、概述

二、链路层

主要介绍以太网和IEEE 802封装。

首先,以太网是私有技术,IEEE 802.3标准是公有技术。

1. 封装格式

以太网和802.3的封装格式很不一样

802.3的封装格式(很少用到,了解即可):

目标地址+源地址+长度+不需要了解的固定位以及类型位和上层的协议内容

以太网的封装格式(很常用):

目标地址+源地址+类型位(0806表示后面是ARP协议,ARP协议内容不够46bit,因此需要补位;0800表示IP协议,后面跟IP协议内容)+上层协议内容(IP等)/ ARP协议

下面是以太网的头部信息,类型位0800后面就是IP协议:

在这里插入图片描述

2. 环回接口

环回接口是一个很有意思的概念,只要是127开头的都是环回接口,都可以ping通,但是常用的就是127.0.0.1。环回接口的处理流程如下所示:

在这里插入图片描述

Slides中列出了三种使用到环回接口的场景:

  1. 传给换回接口的数据:IP输出函数→环回驱动程序(IP输入队列)→IP输入函数
  2. 广播/多播中复制给本地的数据报:IP输出函数→判断目标IP地址与广播/多播地址相同→环回驱动程序(IP输入队列)→IP输入函数
  3. 任何传给本地IP地址的数据:IP输入函数→→判断目标IP地址与广播/多播地址不同→判断目标IP地址与本地地址相同→环回驱动程序(IP输入队列)→IP输入函数

使用到环回接口的例子:

假设有内部局域网1.1.1.0和2.2.2.0,1.1.1.0的一部分流量输出到互联网(any),一部分在本地的2.2.2.0(VPN),我们并不想将1→2的流量进行NAT转换,此时只需要随便配一个环回接口,然后做一个对应的策略路由,把1→2的流量做策略路由,指向环回接口,就不会走NAT接口了。

原理:NAT被调用成功的三个条件,列表、内部接口输入、外部接口输出,可见1→2的流量从环回接口输出又从环回接口输入,所以不会走NAT了。

在这里插入图片描述

3. MTU与路径MTU

众所周知,以太网和802.3对数据帧的长度有限制,其中上限是1500字节和1492字节,即最大传输单元(MTU)。

如果IP数据包>以太网的MTU,就需要对数据包进行分片,以太网的MTU是以输出端MTU为准(不是输入端,而且是一段线路的输出端,不是整条线路的输出端),在传输过程中,可能会多次分片。

在这里插入图片描述

三、IP协议

最核心的协议,是一个不可靠,无连接的数据报传输服务。

不可靠:尽可能最好的传输服务,不能保证IP数据报一定能发送成功,如果发生错误,会丢弃该数据报,然后发送ICMP消息报给信源端。(TCP通过三次握手和四次挥手保证了可靠性)

无连接:IP不维护后续数据报的状态信息,即每个数据报都是独立传输的。(TCP会排序)

1. IP首部

在这里插入图片描述

组成:

  • 版本号(4bit)
  • IP头部长度(4bit,即IP首部最多15行,每行四个字节,IP首部最多60个字节)
  • 服务类型TOS(3bit,IP优先级;4bit,每位 置一 代表不同的服务质量,分别代表,最小延迟,最大吞吐量,最高可靠性,最小费用,中间路由器会参考这些标记,一般是企业私有云会自定义一些QoS测量会用到;1bit,没用)
  • 总长度(16bit,IP数据报最大是65535字节)
  • 标识位(16bit,标识IP数据报,用于组装)
  • 标志(3bit,包含DF位,如果设置为1,当传输的IP数据报遇到MTU小于当前数据报长度的情况,路由器直接丢包,并返回ICMP消息报)
  • 片偏移(13bit,对于一个IP数据包被分割成了很多的片,在组装这些片的时候会参考偏移量信息)
  • 生存时间(TTL,8bit,每一跳都会减一,防止环路)
  • 协议位(8bit,下一个协议的类型,1-ICMP,6-TCP,17-UDP)
  • 首部校验和(16位)
  • 源IP(32bit)
  • 目标IP(32bit)
  • 选项字段(最多40字节)

IP首部可用的几种选项(并非所有主机和路由器都支持):

  1. 记录路径(让每个路由器记下IP地址)
  2. 时间戳(让每个路由器记下IP地址和时间)
  3. 宽松的源站选路(指定必经的IP地址)
  4. 严格的源站选路(只能经过指定的IP地址)

2. IP路由选择的工作机制

分为源地址和目的地址是否在同一个网络中(判断是否在同一网络:目的IP和源IP做与运算,网络号一样就表示在同一个网络),工作机制有所不同,左边代表同一网络,右边代表不同网络:

在这里插入图片描述

总结:除非使用NAT转换或者使用源路由选项(目的IP逐跳改变,很少使用),数据报中的IP地址一般不变(所有的路由选择决策都是基于这个目的IP地址,ARP中的FTP实验会详细介绍此处的机理),但是mac地址会逐跳改变,始终指向下一站的链路层地址。

3. 特殊的IP地址

  1. 全零IP地址只能做源IP地址,DHCP协议会用到(属于UDP的流量,没有获取IP地址之前,源IP就是全零)
  2. 网咯号全零,但是主机号不为零的IP地址极少用到
  3. 环回接口,127开头在这里插入图片描述
    IP地址的都是
  4. 头部全为1的IP地址(-1)只能做目的IP,受限的广播

4. IP的未来

受益于NAT和无类别的域间路由选择(CIDR,classless Inter-domain routing),IPV4域名不足的问题被缓解,但是没有得到根本解决。

四、ARP协议

1. ARP介绍

ARP是一个非常不安全的协议,因为设备驱动程序从不检查IP数据报中的目的IP地址(可能当前直连网络中根本没有该IP地址,ARP就会找不到设备)。

ARP为逻辑地址(IP地址)到硬件地址(以太网中一般指mac地址)提供动态映射,之所以强调 动态 ,是因为这个过程是自动完成的(下面的FTP实验会看到这一点),用户不用操心,所以在使用ping dest_IP时,不需要指定mac地址。

2. 隐藏在ARP背后的概念

例子:输入ftp 服务器的域名bsdi之后的处理流程:

在这里插入图片描述

  1. FTP客户端调用DNS解析域名;
  2. FTP客户端请求TCP使用得到的IP地址建立连接;
  3. TCP根据得到的IP地址封装数据报,发送给IP协议
  4. IP协议查路由表,判断PC和FTP服务器地址是不是直连,如果是直连,给ARP发送目标IP,下一步的ARP直接解析FTP服务器的IP地址对应的mac地址;否则根据IP选路函数确定下一跳IP地址,发送给ARP,ARP会解析下一跳(静态路由/默认网关)的IP地址的mac地址,无论如何都会得到一个IP地址,发送给ARP协议
  5. ARP协议发送ARP请求(二层广播,即以太网头部的mac地址全1,代表所有的设备都能接收),询问IP地址的mac地址,对应IP地址的设备收到后,会发送ARP回应(**二层单播)**给发出询问的设备。(对应图中第七步)

详细过程如下所示
在这里插入图片描述

总结:ARP背后的概念——知道主机的IP地址并不能让内核发送一帧数据给主机(telnet实验,如果尝试使用telnet去连接不存在的IP地址(mac地址不存在),ARP会不断的发送请求,直到因为指数退避不再发送为止),要想成功发送数据报,必须知道逻辑地址(IP地址)和硬件地址(以太网中的mac地址)

3. ARP高速缓存

ARP高效运行的关键是每个主机都有一个ARP高速缓存,这个高速缓存存放了最近IP地址到硬件地址的映射记录,高速缓存的每一项的生命周期一般为20分钟。

查询ARP缓存的命令:

pc: 查询 arp -a,清除 arp -d

路由器 查询 show arp 清除 clear arp(不完全清除。因为清除的时候也在解析)

4. ARP分组格式

在这里插入图片描述

ARP的数据报是一种以太网帧,其中:

  1. 类型:0800 IP, 0806 ARP
  2. 硬件类型: 以太网 1
  3. 协议类型: 0800 ARP

5. ARP代理(实验)

在这里插入图片描述

特别**当R1没有默认网关(no ip routing)**想要ping R3,所以不论R3是否是直连(此时并没有查询路由表的能力,判断R3是否是直连),都会发送一个R3 IP地址的ARP请求,如果R2的接口E0开启了代理ARP的feature,R2如果也知道R3的mac地址,R2就会告诉R1:接口E0的硬件地址就是R3的mac地址。

应用:一般来说,将公司内部网页的地址(10.1.1.0)一对一转换到互联网地址(202.100.1.10),外部访问公司网页的时候,会直接访问服务器外侧的路由器R的代理ARP接口(202.100.1.10)

在这里插入图片描述

总结:通常ARP会被路由器隔离,但是支持代理ARP(proxy ARP)的路由器可以将ARP请求发送到邻近的网段,由此,两个网段可以像是在同一个网段中通信。

6. 免费ARP

开机时设备一般会检测当前网络下是否有其他主机与当前设备设置了相同的IP地址,此时就是通过免费ARP完成的。

应用场景:公司有两台设备(IP地址相同,但是mac地址不同),每次只运行其中一台(冷备),早期切换设备的时候不能关闭一台,再打开另一台,否则路由器上的ARP缓存没有变化(20分钟的生命周期内),此时ARP映射就会找不到已关闭设备的mac地址。

目前已经可以这么做了,因为新设备开机的时候就会发送免费ARP请求,而路由器就会据此更新。

免费ARP攻击:攻击者会利用免费ARP的漏洞(比如原设备已关机),将网络上其他接收者的映射更新为发送者(攻击者)的mac地址,此时所有设备的ARP就被毒化了。

五、ICMP

ICMP被认为是IP的附属协议,一些ICMP报文将 差错报文 返回给用户进程,例如ping程序。

1. ICMP报文的结构

ICMP是在IP数据报文内部被传输的【IP数据报=IP首部+ICMP报文】,ICMP报文的结构:

  • 8位类型,需要记住 【类型位8,代码位0,表示 请求回显,即ping请求;类型位0,代码位0,表示 回显应答,即ping 应答;类型位3,表示不可达,根据代码位进一步细分】
  • 8位代码
  • 16位校验和

注意:以太网和IP校验和仅校验以太网头部和IP头部,但是TCP和ICMP的 校验和 校验之后所有的位。

在这里插入图片描述

2. ICMP报文的类型

从总的分类上,可以将ICMP报文分为查询报文(例如ping应答00和ping请求80)和差错报文(例如不可达3x)。

当发送一份ICMP差错报文时,报文中始终包括IP首部IP数据报的前8个字节,这样,接收ICMP差错报文的模块就会把它与某个特定的协议(IP首部的协议字段)和用户进程(IP数据报的前8个字段,含有TCP或UDP的端口号)联系起来。(这其实很合理,毕竟你要告诉源机,究竟是哪个协议哪个进程丢了包)

以下情况不会产生ICMP差错报文:

  • ICMP差错报文出错不会产生差错报文
  • 目的地址是广播地址(主机地址全部为1)或者多播地址(D类地址)
  • 链路层的广播(例如ARP多播)
  • 不是IP分片的第一片(IP数据报的前8个字节没有端口号,发回去了也没用)
  • 源地址不是单个主机的数据报(即源地址不能是零地址、环回地址、广播地址和多播地址,防止广播风暴)

3. ICMP的应用:ping

常用ping来确定问题出现在哪儿,还能测出这台主机的往返时间,但是需要注意:一台主机的可达性不止取决于IP层是否可达,还取决于使用何种协议和端口,例如有的主机没有ICMP列表,但是可以telnet登录(?)。

注意大多数的TCP/IP实现都是在内核中直接支持ping服务器

ICMP报文结构(以下针对Unix):类型号0或8,代码0,校验和(覆盖之后所有),标识符(Unix的标识符字段 为 发送进程的ID),序号,选项数据(发包时间,由此获得往返时间)

记录路径

大部分ping程序都提供了-R选项,用来记录路由的功能,但是受限于IP数据包大小(60-20=40字节),最多纪录9个IP地址(一个IP地址占4个字节);而且因为需要放在选项功能中,所以要求所有的路由设备都要支持选项功能 —— trace可以更好的替代-R选项,但是trace是记录入接口,-R记录的是出接口。

标识符字段 为 发送进程的ID),序号,选项数据(发包时间,由此获得往返时间)

记录路径

大部分ping程序都提供了-R选项,用来记录路由的功能,但是受限于IP数据包大小(60-20=40字节),最多纪录9个IP地址(一个IP地址占4个字节);而且因为需要放在选项功能中,所以要求所有的路由设备都要支持选项功能 —— trace可以更好的替代-R选项,但是trace是记录入接口,-R记录的是出接口。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:19:48  更:2021-12-14 16:20:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:25:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码