TCP/IP协议网络层

目录

一、IP协议

二、协议头格式

三、网段划分

四、私有IP地址和公网IP地址

五、路由

六、NAT和NAPT技术


一、IP协议

TCP和IP的关系:

  • IP是事件的执行者,它提供了一种能力,能够大概率保证数据由主机A跨网络传输到主机B。
  • TCP是事件的决策者,当IP执行任务失败后,它能够创造条件使IP重新执行任务,从而达到数据百分之百传输成功。

二、协议头格式

TCP/IP协议网络层_第1张图片

  •  4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4
  • 4位头部长度:与TCP协议一样,是以4字节为单位
  • 8位服务类型:最小延时, 最大吞吐量, 最高可靠性, 最小成本,这四者相互冲突, 只能选择一个。对转账等服务来说可靠性很重要,对直播等服务来说延时可能就会更重要。
  • 8位生存时间:数据报到达目的地的最大报文跳数,一般是64, 每次经过一个路由,跳报数加1,如果超出最大数量限制那么就丢弃了,这个字段主要是用来防止出现路由循环。
  • 16位头部校验和:使用CRC进行校验, 来鉴别头部是否损坏。
  • 8位协议:表示上层协议的类型,有助于和上层进行交互。

分片:

TCP协议是面向字节流的,但IP协议是面向报文的。在数据链路层一次可以发送的数据是有限制的,如果ip报文太大,就要在传给数据链路层之前进行分片。每个分出来的报文都要有报头,方便接收方把分开的报文组合到一起。

  • 16位标识:用来标识ip报文,如果几个报文是有一个报文分片得来的,那么这几个报文标识相同,接收方可以通过16位标识把分片组装到一起。
  • 13位偏移量:表明分片在原报文中的偏移量(可以理解成距离报文开头的字节数),如果该报文不是分片,那么偏移量为0。
  • 3位标志:1位保留,1位标识禁止分片,1位标识后面还有没有更多报文,1代表有,0代表没有。

问题一:

接收方只要把具有相同16位标识的报文找到,然后通过偏移量对它们排序即可组合出原报文。那么我们如何判断出这些报文片有没有丢失呢?

  • 如果检测到偏移量为0的分片没有就说明头丢了。
  • 当前分片的偏移量加上当前分片报文的总长度等于下一个分片的偏移量,如果发现排序后的排序报文中有不符合这个规律的片段,则说明报文的中间丢了。
  • 如果检测不到3位标志中最后一位为0的分片则说明原报文尾部丢了。

只要有任何一段报文丢了,那么其它分片都会被丢弃掉。

问题二:

接收段需要判断接收到的报文是一个完整报文还是分片,因为这涉及到需不需要组合的问题,那么它如何判断呢?

  • 如果检测到某个报文偏移量和3位标识都为0,说明这是一个完整报文。
  • 否则是分片后的报文。

从上面的描述我们可以得出,分片有很大的坏处,因为会增加丢包的概率。所以一般而言我们需要尽量减少分片,这个工作当然要由决策者tcp来完成啦,tcp要尽量控制自己的单个报文大小。

三、网段划分

IP地址分为两个部分, 网络号和主机号

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:在同一个网段内,不同的主机要有不同的主机号。

TCP/IP协议网络层_第2张图片

  •  不同的子网其实就是把网络号相同的主机放到一起。
  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
  • 通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。

过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示:

TCP/IP协议网络层_第3张图片

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,会浪费掉大量的地址。例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机, A类地址的子网内的主机数更多。然而实际网络架设中, 不会存在一个子网内有这么多的情况, 因此大量的IP地址都被浪费掉了。

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
  • 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾。
  • 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号。

TCP/IP协议网络层_第4张图片

可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围。 

 四、私有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)。

路由器有构建网络的能力,可以构建出一个局域网。

TCP/IP协议网络层_第5张图片

  •  一个路由器可以配置两个IP地址,一个是一个是WAN口IP, 一个是LAN口IP(子网IP)。
  • 由路由器LAN口连接的主机,都属于当前路由器的子网中。
  • 子网内的主机IP地址不能重复。但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,都可以做为运营商路由器中的一个节点,这样的运营商路由器可能有很多层,最外层运营商路由器, WAN口IP就是一个公网IP了。
  • 子网的主机需要和外网进行通信时,路由器会把原节点的IP地址替换成WAN口的节点向上传输,这样主机替换,最终数据包中的IP地址变成一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。

五、路由

在复杂的网络结构中, 找出一条通往终点的路线。路由的过程就是一跳一跳问路的过程。

  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP。
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。
  • 依次反复, 一直到达目标IP地址。

如何判定当前这个数据包该发送到哪里,这个就要靠节点内部维护一张路由表。

假设某主机上的网络接口配置和路由表如下:

TCP/IP协议网络层_第6张图片

  • 如果目的IP命中了路由表, 就直接转发即可。
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。 
  • 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络。
  • 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口。Flags中如果是U则代表是与本机接口直接相连的网络,不必经路由器转发,如果是UG则代表下一跳地址是某个路由器的地址。

转发过程例子: 如果要发送的数据包的目的地址是202.10.1.2。

  • 依次和路由表前几项进行对比, 发现都不匹配。
  • 按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器。
  • 由192.168.10.1路由器根据它的路由表决定下一跳地址。

六、NAT和NAPT技术

NAT技术:

NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。NAT能够将私有IP对外通信时转为全局IP,也就是就是一种将私有IP和全局IP相互转化的技术方法。

NAPT技术:

前面提到过不同子网间的IP地址是可以重复的,那我们在通过某个私有IP访问公网向某个服务器发送请求后,服务器是怎样通过公网访问回来的呢?由于私有IP会重复在寻址时是没有意义的,所以就要用到NAPT技术。NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。这使得多台私有网主机利用1个NAT公共IP就可以同时和公共网进行通信。

由于每个私有IP和端口号在子网中都具有唯一性,所以每次通过路由器转接时,都会将子网中主机的IP地址和端口号与WAN口IP和端口进行转换并形成映射表,在服务器想要应答的时候就可以通过每个节点的映射关系锁定目标主机。这种关联关系也是由NAT路由器自动维护的。 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。

你可能感兴趣的:(Linux系统与网络编程,tcp/ip,网络)