IP地址和IP协议基本上构成了网络层的核心和所有。而网络层又是 TCP/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部分加上子网掩码算出网络号,从而得出该地址是在本网络内部仍是外部,从而决定如何转发。网络
规定下面三种地址属于私有地址:架构
公有地址是全局惟一的,即一个IP只能被一个主机拥有。而私有地址则只须要在网络内部惟一,不一样的网络内的主机的IP地址能够是相同的私有地址。例如家庭用的路由器的IP地址每每都是 192.168.0.1,连到路由器上的电脑都会被分配一些很相近的IP。
私有地址是为了解决公有地址耗尽的问题。由于IP地址总共五亿左右,远远小于互联网上的主机数。而如今广泛采用一个网络只有不多几个公有IP,网络内的主机持有私有地址,经过 NAT 实现与外部的通讯。spa
有了IP地址这个基础架构,剩下的就是怎么样把数据发送到正确的地址。而IP协议是这样实现的:
发送方须要知道如下两个信息:router
路由控制表就是一张表,它告诉咱们碰到哪一种IP就把数据报发送到哪一个路由器上。比较IP地址每每就是匹配它的网络号。
因为每一个主机上都有路由控制表(至少有个默认路由,指向网关),每一个路由器也有路由控制表,所以一个报文就会这样一跳一跳地最终到达目的地。就好像京东上买东西,先是上海仓库发货,而后发到上海总运输站,再到江苏总运输站,再到南京XX区物流中心,而后快递员上门送货。
下面是一个路由转发的例子:blog
关于路由咱们只须要知道这么多。至于路由间是如何商量出一条通道来传输数据的,这有专门的路由协议,并不属于TCP/IP。
为了更直观,如下是我用Windows自带命令 tracert 查看个人电脑到 baidu.com 的路由路径。
图中第一跳先找 192.168.0.1 即网关,接着就是三个叫 "adsl-pool.sx.cn"的路由器,能够猜到是山西电信的路由器(此刻我人在山西)。最后又通过不少跳到达百度的服务器。图片
这部份内容在《图解TCP/IP》第五章中有完善的讲解。一句话来讲——仅凭IP没法完成通讯。好比,你刚刚输入的baidu.com是什么鬼?NAT又是怎么工做的?路由
这个不用多说了,它提供IP地址与主机名之间的映射。DNS还有域名规范,从根域名往下分红 org, com, cn 等等… 而域名服务器又是级联的。DNS协议用UDP实现,其大体工做流程是:如在浏览器输入 www.baidu.com, 主机先找最近的域名服务器(多是电信的某个服务器),若是它不知道,就去问根域名服务器,根域名服务器知道能够去问百度的域名服务器,因而该域名服务器又去问百度的域名服务器,后者返回一个IP地址,最终被开始的域名服务器返回。
须要提到的就是DNS记录里面几个重要的值。
A | IP地址 |
NS | 域名 |
CNAME | 主机别名 |
PTR | IP地址反向解析 |
MX | 邮件 |
IP数据报在底层还得通过数据链路来传递。而数据链路只认MAC地址,不认识IP地址。ARP就是地址解析协议——由IP地址解析出MAC地址。它的工做方式也很是简单:发送方在网络内广播:谁是老王?而后老王听到了回应:我就是老王,我MAC地址是XXX。
ICMP是IP协议实现的一部分,用于网络诊断和错误通知。例如,若是接收方不可达,通过屡次尝试超时后,路由器会发送ICMP数据报回来,告诉发送方错误信息。
ICMP常见的有几类重要消息。如:
很是简单,就是解决静态IP配置太麻烦的问题。搭建一个DHCP服务器,新加入网络的主机就能租用到新的IP,从而可以联网。路由器通常能配置DHCP功能。
前面讲到网络内部的主机现在都是私有地址。在网络内部通讯没问题,但要想与外界的公有网络通讯,发送没问题,接收就有大问题:外部网络不认识私有地址,不知道发给谁。就好像你给人写信,发件人地址是“三年二班小王”,人家怎么给你回信呢?
NAT(狭义上又叫NAPT)的解决方法是:由网关提供一次转换。每次内部网络向外请求时,都修改源地址,改成本网关的外部地址加上本身才能认识的端口号,这样外部网络也能发消息回来。当收到消息时,再根据端口号转发到对应的内部主机上。
NAT完美地解决了全局地址不足的问题,也使IPv6的需求不那么迫切了。只是由于安全缘由,大多数路由器不容许外部网络主动链接内部主机。这个问题就给P2P软件如QQ、BT下载带来了困难。而借助一个外部公网服务器,就能够实现路由器的“打洞”(学名“NAT穿越”),解决这个问题。详细描述请自行搜索,这里简要叙述下。
假如A、B两个主机都在内网,显然任何一台主机直连对方都是作不到的。但它们链接外部的公网服务器就没问题。如今搭建一台公网服务器,它和A、B都创建了链接。此时A想链接B,它就经过服务器告诉B本身想链接。而后B就发起一个请求直连A的公网地址加端口号。因为是外部请求,A的网关会屏蔽这个链接,但B已经在B的网关上“打了个洞”。A接着直接请求B的公网地址加端口号,此时就能链接成功,从而创建通讯。