TCP/IP 网络基础(二)网络层

IP地址和IP协议基本上构成了网络层的核心和全部。而网络层又是 TCP/IP 的心脏,或者是精华… 还拿前面的例子来说,数据链路层负责网络内“直连”(广义的直连也包括通过交换机、集线器等连起来)的设备的通信,而IP协议(又叫网际协议)负责网络间的连通。也就是说,数据链路层相当于快递员骑着小电驴在你小区里面找到你;而IP协议则负责把包裹从北京朝阳区某小区运到上海某小区。

IP协议是无连接的。它只提供尽力服务。而更可靠的协议则留待上层实现。

IP地址

在网络层通信离不开网络层地址,即IP地址。
IP地址由32位正整数构成,通常用点分十进制表示。如 192.168.0.1.
IP地址分为两部分,前面是网络号,后面是主机号。意思是在同一个网络内的所有主机的网络号应该是一致的,而主机号则用来区分是哪台电脑。根据网络内能容纳多少台主机又可以分为 A、B、C、D等几类地址,然而现在也不用了,因为出现了子网掩码。

子网掩码

子网掩码就是网络号部分全部为1,后面全部为0. 同样可以用点分十进制表示。如 255.255.255.0 表示IP地址的前24位是网络号。也可以用 192.168.0.1 /24 这种式子表示一个带有子网掩码的IP地址。
简单地说,路由器根据一个地址的IP部分加上子网掩码算出网络号,从而得出该地址是在本网络内部还是外部,从而决定如何转发。

公有(全局)地址和私有地址

规定下面三种地址属于私有地址:

  • 10.0.0.0 /8
  • 172.16.0.0 /12
  • 192.168.0.0 /16

公有地址是全局唯一的,即一个IP只能被一个主机拥有。而私有地址则只需要在网络内部唯一,不同的网络内的主机的IP地址可以是相同的私有地址。例如家庭用的路由器的IP地址往往都是 192.168.0.1,连到路由器上的电脑都会被分配一些很相近的IP。
私有地址是为了解决公有地址耗尽的问题。因为IP地址总共五亿左右,远远小于互联网上的主机数。而现在普遍采用一个网络只有很少几个公有IP,网络内的主机持有私有地址,通过 NAT 实现与外部的通信。

路由控制

有了IP地址这个基础架构,剩下的就是怎么样把数据发送到正确的地址。而IP协议是这样实现的:
发送方需要知道以下两个信息:

  1. 接收方的IP
  2. 本机的路由控制表

路由控制表就是一张表,它告诉我们碰到哪种IP就把数据报发送到哪个路由器上。比较IP地址往往就是匹配它的网络号。
由于每个主机上都有路由控制表(至少有个默认路由,指向网关),每个路由器也有路由控制表,因此一个报文就会这样一跳一跳地最终到达目的地。就好像京东上买东西,先是上海仓库发货,然后发到上海总运输站,再到江苏总运输站,再到南京XX区物流中心,然后快递员上门送货。
下面是一个路由转发的例子:
《TCP/IP 网络基础(二)网络层》

关于路由我们只需要知道这么多。至于路由间是如何商量出一条通道来传输数据的,这有专门的路由协议,并不属于TCP/IP。
为了更直观,以下是我用Windows自带命令 tracert 查看我的电脑到 baidu.com 的路由路径。
《TCP/IP 网络基础(二)网络层》
图中第一跳先找 192.168.0.1 即网关,接着就是三个叫 “adsl-pool.sx.cn”的路由器,可以猜到是山西电信的路由器(此刻我人在山西)。最后又经过很多跳到达百度的服务器。

IP协议相关技术

这部分内容在《图解TCP/IP》第五章中有完善的讲解。一句话来说——仅凭IP无法完成通信。比如,你刚刚输入的baidu.com是什么鬼?NAT又是怎么工作的?

DNS

这个不用多说了,它提供IP地址与主机名之间的映射。DNS还有域名规范,从根域名往下分成 org, com, cn 等等… 而域名服务器又是级联的。DNS协议用UDP实现,其大致工作流程是:如在浏览器输入 www.baidu.com, 主机先找最近的域名服务器(可能是电信的某个服务器),如果它不知道,就去问根域名服务器,根域名服务器知道可以去问百度的域名服务器,于是该域名服务器又去问百度的域名服务器,后者返回一个IP地址,最终被开始的域名服务器返回。
需要提到的就是DNS记录里面几个重要的值。

AIP地址
NS域名
CNAME主机别名
PTRIP地址反向解析
MX邮件

ARP

IP数据报在底层还得经过数据链路来传递。而数据链路只认MAC地址,不认识IP地址。ARP就是地址解析协议——由IP地址解析出MAC地址。它的工作方式也非常简单:发送方在网络内广播:谁是老王?然后老王听到了回应:我就是老王,我MAC地址是XXX。

ICMP

ICMP是IP协议实现的一部分,用于网络诊断和错误通知。例如,如果接收方不可达,经过多次尝试超时后,路由器会发送ICMP数据报回来,告诉发送方错误信息。
ICMP常见的有几类重要消息。如:

  • 地址不可达;
  • 超时:即IP报头中的TTL表示跳数,每经过一个路由TTL减一,当变为0时路由器将回送超时消息,这种方法可以防止IP消息在网络中无限传播,浪费带宽。tracert的实现就是利用超时消息:先把TTL设为1,就能得到第一跳路由回送的超时消息,再每次TTL增加1,这样就能依次收到路径上路由器的超时消息。
  • ECHO消息:ping命令的实现原理。

DHCP

非常简单,就是解决静态IP配置太麻烦的问题。搭建一个DHCP服务器,新加入网络的主机就能租用到新的IP,从而能够联网。路由器一般能配置DHCP功能。

NAT

前面讲到网络内部的主机如今都是私有地址。在网络内部通信没问题,但要想与外界的公有网络通信,发送没问题,接收就有大问题:外部网络不认识私有地址,不知道发给谁。就好像你给人写信,发件人地址是“三年二班小王”,人家怎么给你回信呢?

NAT(狭义上又叫NAPT)的解决方法是:由网关提供一次转换。每次内部网络向外请求时,都修改源地址,改为本网关的外部地址加上自己才能认识的端口号,这样外部网络也能发消息回来。当收到消息时,再根据端口号转发到对应的内部主机上。
《TCP/IP 网络基础(二)网络层》

NAT完美地解决了全局地址不足的问题,也使IPv6的需求不那么迫切了。只是因为安全原因,大多数路由器不允许外部网络主动连接内部主机。这个问题就给P2P软件如QQ、BT下载带来了困难。而借助一个外部公网服务器,就可以实现路由器的“打洞”(学名“NAT穿越”),解决这个问题。详细描述请自行搜索,这里简要叙述下。

假如A、B两个主机都在内网,显然任何一台主机直连对方都是做不到的。但它们连接外部的公网服务器就没问题。
现在搭建一台公网服务器,它和A、B都建立了连接。此时A想连接B,它就通过服务器告诉B自己想连接。然后B就发起一个请求直连A的公网地址加端口号。由于是外部请求,A的网关会屏蔽这个连接,但B已经在B的网关上“打了个洞”。A接着直接请求B的公网地址加端口号,此时就能连接成功,从而建立通信。

    原文作者:TCP
    原文地址: https://segmentfault.com/a/1190000011458232
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞