Linux网络编程 --- 网络层,数据链路层

前言

IP协议的本质工作:提供一种能力,将数据跨网络从A主机送到B主机!用户需要的是:提供一种能,将数据可靠的跨网络从A主机送到B主机!

一、前置认识

在进行数据包转发的时候,跨网络通信需要经过很多的路由器。

  1. 要对所有的主机进行标识,源IP地址,目的IP地址来标识源主机和目的主机。
  2. 去目标城市,去目标地点,IP到达目标城市。IP = 目标网络 + 目标主机。构建网络的时候,为我们将来高速定位一台主机,为我们提供效率保证。先到达目标网络,再交给目标主机。路由器在其中有很大的作用。

二、IP报头

1、报头和有效载荷如何分离

通过4位首部长度(单位4字节)+固定长度,有40字节的选项字段。4位版本,就是IPV4还是IPV6版本的IP协议。

2、如何将有效载荷交付给上层

固定长度 + 自描述字段(首部长度 + 总长度)

3、8位服务类型:3位优先权字段(已经弃用), 4TOS字段, 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.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

 但是这种划分法已经不被使用了,因为IPv4已经枯竭了。

随着 Internet 的飞速发展 , 这种划分方案的局限性很快显现出来 , 大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就被分配完了, A 类却浪费了大量地址;针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号 ;
子网掩码也是一个 32 位的正整数 . 通常用一串 "0" 来结尾 ;
IP 地址和子网掩码进行 " 按位与 " 操作 , 得到的结果就是网络号 ;
网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关 ;

举出两个例子:

子网掩码,可以对IP32位,进行任意划分。

特殊的IP地址:

IP 地址中的主机地址全部设为 0, 就成为了网络号 , 代表这个局域网 ;
IP 地址中的主机地址全部设为 1, 就成为了广播地址 , 用于给同一个链路中相互连接的所有主机发送数据包;
127.* IP 地址用于本机环回 (loop back) 测试 , 通常是 127.0.0.1
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, 其余的则称为全局 IP( 或公网 IP);
IP地址被硬性的划分称为 = 公网IP和私有IP。  
在我们的使用生涯中,我们都在直接使用的都是私有IP!
将源IP替换成每一个路由器的WAN口IP。私有IP不断被替换的技术叫做NAT技术。路由器有LAN口IP和WAN口IP。家用路由器理解上和运营商的路由器是性质是类似的。
实际上,在一台主机中,报文并没有通过网络层直接发出去,而是继续交给了自己的下一层协议数据链路层。数据链路层,不能一次发送过大的报文,要求上层不能给我交付过大的报文。mtu最大的传输报文大小。如果报文就是特别大,要求IP层进行分片转发。
数据链路层,解决的是:直接相连的主机之间,进行数据交付的问题。这里包括包括电脑到路由器之间。Mac地址,解决的是区分在同一个局域网中,区分特定的主机。
这里的网络层必须去看一下介绍计算机网络的书。这篇博客不完整。

数据链路层

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转换表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值