前言
IP协议的本质工作:提供一种能力,将数据跨网络从A主机送到B主机!用户需要的是:提供一种能,将数据可靠的跨网络从A主机送到B主机!
一、前置认识
在进行数据包转发的时候,跨网络通信需要经过很多的路由器。
- 要对所有的主机进行标识,源IP地址,目的IP地址来标识源主机和目的主机。
- 去目标城市,去目标地点,IP到达目标城市。IP = 目标网络 + 目标主机。构建网络的时候,为我们将来高速定位一台主机,为我们提供效率保证。先到达目标网络,再交给目标主机。路由器在其中有很大的作用。
二、IP报头
1、报头和有效载荷如何分离
通过4位首部长度(单位4字节)+固定长度,有40字节的选项字段。4位版本,就是IPV4还是IPV6版本的IP协议。
2、如何将有效载荷交付给上层
固定长度 + 自描述字段(首部长度 + 总长度)
3、8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
4、16位总长度:IP数据报的总长度。
5、8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
6、8位协议:我们要把IP的有效载荷交付给上层的哪一个协议?注意是上层的协议。也就是传输层的协议。
7、16位首部校验和:保证数据的一致性。
8、32位源IP地址:4个字节,谁发来的数据
9、32位目的IP地址:4个字节,根据它来进行路径选择。
10、16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
11、3位标志:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记
前置问题:你怎么知道IP是被分片了呢?
如果没有分片,片偏移 = 0,更多分片 = 0;如果分片:片偏移 != 0,更多分片 = 1。
确保将分片全部聚到一起(相同的标识)
1、丢一个:片偏移没有一个是0的
2、丢中间:片偏移
3、丢最后一个:没有一个是更多分片 = 0的报文。
我们建不建议分片?我们是不建议的。要求TCP不发很长的报文。IP中任何一个分片丢失,都要重新发送。可能增加丢包的概率。
这里可以得到一个结论 tcp->端口号 ip -> ip地址。socket = IP地址 + 端口号。这里需要注意路由器没有传输层。只有网络层,数据链路层和物理层。
三、网段划分
IP地址分为网络号和主机号
1、路由器本质也是特定一个子网的主机,也要配置IP地址。
2、路由器一定至少要连接2个子网。路由器也就相当于同时在两个子网。路由器可以配置多个IP,一定要有的。认为路由器有多张网卡。
3、路由器一般是一个子网中的第一台设备,一般它的IP地址都是网络号.1。
4、路由器功能,IP报文的转发,不仅仅如此。构建子网或者构建局域网。能够对子网内的IP地址做管理,路由器还相当于一个DHCP服务器。
四、IP地址的分类
A 类 0.0.0.0 到 127.255.255.255B 类 128.0.0.0 到 191.255.255.255C 类 192.0.0.0 到 223.255.255.255D 类 224.0.0.0 到 239.255.255.255E 类 240.0.0.0 到 247.255.255.255
但是这种划分法已经不被使用了,因为IPv4已经枯竭了。
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号 ;子网掩码也是一个 32 位的正整数 . 通常用一串 "0" 来结尾 ;将 IP 地址和子网掩码进行 " 按位与 " 操作 , 得到的结果就是网络号 ;网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关 ;
举出两个例子:
子网掩码,可以对IP32位,进行任意划分。
特殊的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, 其余的则称为全局 IP( 或公网 IP);
数据链路层
1、mac帧如何做到解包和封装。
定长报文。
2、如何做到分用。
有一个类型。
3、MTU :1500,决定了IP协议的最大数据包长度不能超过1500,TCP就不能超过1480,TCP的报头 + tcp的有效载荷 1480 - 20 = 1460 : MSS。
一、ARP协议
所谓的数据发送到目标网络,本质:是通过无数个连续的子网实现的。
在局域网中,将目标主机的IP地址转换成MAC地址。
1、ARP原理
主机发出 ARP 请求 , 询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少 ”, 并将这个请求广播到本地网段( 以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播 );目的主机接收到广播的 ARP 请求 , 发现其中的 IP 地址与本机相符 , 则发送一个 ARP 应答数据包给源主机 , 将自己的硬件地址填写在应答包中;每台主机都维护一个 ARP 缓存表 , 可以用 arp -a 命令查看。缓存表中的表项有过期时间 ( 一般为 20 分钟 ), 如果20 分钟内没有再次使用某个表项 , 则该表项失效 , 下次还要发 ARP 请求来获得目的主机的硬件地址
2、谈ARP报头
注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次 , 对于链路层为以太网的情况是多余的, 但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型 ,1 为以太网 ;协议类型指要转换的地址类型 ,0x0800 为 IP 地址 ;硬件地址长度对于以太网地址为 6 字节 ;协议地址长度对于和 IP 地址为 4 字节 ;op 字段为 1 表示 ARP 请求 ,op 字段为 2 表示 ARP 应答。封装ARP协议的MAC帧。每个主机都会收到应答和请求。所以我们需要先看op字段,看是请求还是应答。然后对照目的IP是否为自己的IP。如果不是直接丢弃,是返回ARP应答。结论:收到ARP报文,先看OP字段。OP决定了什么?决定了ARP的类型,请求还是应答决定了要看ARP的源地址(源头ip :mac)还是目的地址(目的ip :mac)请求看目的IP,应答看源地址。
ARP的周边问题
1、ARP只有在缓存失效的时候,才会进行。
2、我可以通过我的IP和子网掩码,得到我的网络号,然后拼接IP地址,ping所有的主机,得到所有主机的IP和MAC。
3、如果我收到多次同样的ARP应答,我会以最新的为准。
如果我们不管不顾,给HOST A主机疯狂发送我自己的ARP应答。HOST A 会把ipR的物理地址转换为macM。以后的所有报文会给macM这个主机发送。这种攻击称为arp欺骗。
hostM就变成了中间人。
NAT技术
NAT转换过程
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 来建立这个关联关系
上面的转换表IP + port一定是唯一的。 右边也是有唯一性的。NAT在替换的时候,不仅仅会替换IP,还会替换PORT。
互为键值,这张表称为NAT转换表。