网上快速阅读所获得的知识只是轮廓,要看清知识的面目就要啃书:《计算机网络》、《TCP/IP详解 卷一》 。

 我们常常把一个复杂的问题分解成若干个相对简单的问题,然后再一个个解决。计算机网络是一个复杂的系统,所以使用分层来简化,各层各自负责自己的事:
TCP/IP协议模型

 整个网络通信模型如上图所示:网络通信时可以大概划分成四层,上层依赖于下层。从下往上看,由第一层(链路层)解决通信时数据传输问题(它负责两个设备之间数据传输,可以理解为两台设备用网卡跟网线连接起来,能传输数据了)。由第二层(网络层)解决网络通信时的寻址问题(将数据设法从源端经过若干个中间节点传送到目的端,提供最基本的端到端的数据传送服务)。由第三层(传输层)解决程序间的通信问题(端口号区分程序就是在这一层)。第四层才是具体应用的数据通信问题(提供特定的应用服务)。

互联网的目标是隐藏不同物理网络的细节以便各互联网络中的所有主机呈现一个统一的网络架构,这意味着使用单个地址格式来标识互联网上的所有主机。——《linux系统编程手册》

 IP协议(Internet Protocol 网际协议)属于第二层网络层,在讨论它之前还得先简单介绍第一层链路层。

链路层

  • 链路(物理链路):从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
  • 数据链路(逻辑链路):把实现通信协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是网络适配器来实现这些协议和软件。一般的适配器都包括了数据链路层和物理层这两层的功能。
  • 帧:数据链路层的协议数据单元。

 数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据去除并交给网络层。
《计算机网络》-数据链路层

 点对点信道的数据链路层在进行通信时的主要步骤如下:

  1. 结点A的数据链路层把网络层交下来的IP数据报添加到首部和尾部封装成帧。
  2. 结点A把封装好的帧发送给结点B的数据链路层。
  3. 若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报上交给上面的网络层,否则就丢弃这个帧。

数据封装

协议分层如此强大和灵活的其中一个原因是透明——每一个协议层都对上层隐藏下层的操作和复杂性,例如应用程序无需要知道IP和数据链路层的操作细节。
低层会将从高层向低层传递的信息当成不透明的数据来处理。换句话说,低层不会尝试对高层发送过来的信息进行解释,而只会将这些信息放到低层所使用的包中并在将这个包向下传递到低层之前添加自身这一层的头信息。当数据从低层传递到高层时将会进行一个逆向的解包过程。
——《linux系统编程手册》

 链路层在接收网络层的数据时,会进行 封装(encapsulation) 。封装即每一层接收上层数据时,都会添加自己特定的头部数据(有时也会有尾部数据)。 如下图所显,应用层到传输层时,应用数据的基础上添加了TCP的header,它就变成了一个TCP segment。传输层到网络层时,就在TCP segment的基础上添加IP header,整个数据变成了IP datagram。从网络层到链路层,Ip datagram的基础上添加 Ethnet header 与 Ethnet triler数据,整个变成了Ethernet frame。
数据封装

通信过程-数据封装

IP协议

 IP协议提供非可靠,无连接的数据报传输服务。(IP provides an unreliable,connectionless datagram delivery service.)

  • 非可靠:这意味着它并不保证所要传输的数据一定会到达目的地。(当路由出错导致某个数据传输失败时,会丢掉此数据并发回一个ICMP信息回去。可靠性需要由更上层的协议提供,如TCP协议)
  • 无连接:这代表IP datagrams(数据报)在传输中没有连接起来,它们是一块一块各自分开的,分开独立处理。(比如需要向某个地方发送两个数据报:A、B,它们两个有可能会经由不同的路径去到达目的地,有可能B要先于A到达。)

IP协议-数据报字段
 数据报字段如上图所示,IP头部(IP header)至少有20个字节(1字节等于8位,1 byte = 8 bit),我们一一解释。

  • 4-bit version:是IP协议的版本,当前版本是4。
  • 4-bit header length:代表IP header的长度。
  • 8-bit type of service(TOS):服务类型,包括:最小延时、最大传输、最大可靠性、最小消耗等。
  • 16-bit total length(in bytes):整个IP数据报的字节数。
  • 16-bit identification:识别号,主机每发一次都会自动增加
  • 3-bit flags:标记位,用于标记是否被分段。(fragmentation)
  • 13-bit fragment offset:分段号
  • 8-bit time to live(TTL):生存时间
  • 8-bit protocol:代表此IP数据所运输的是来自哪个上层协议的数据,如TCP、UDP等。
  • 16-bit header checksum:用于校验header数据。
  • 32-bit source IP address:源IP地址。
  • 32-bit detination IP address:目标IP地址。(因为IP数据并不是从主机A直接到主机B,中间还会经过路由C,路由D….若干个中间点,IP路由选择这里就不提了,到时啃书自然会看到。)

 可以看到,数据都是01010101…..这样一堆二进制的数据,第几位至第几位代表XX意思。IP协议主要完成寻找网络主机的功能,具体详细请啃书,这里只简单介绍有个感性的大概认识。

查看IP地址

  • 查看本机内网IP
    打开命令提示符(win+R 输入cmd,或在菜单里输入cmd搜索),输入ipconfig
    打开cmd
    内网IP
  • 查看本机外网IP
    打开百度,搜索ip地址,会直接显示你本机的外网IP。(一般每隔一段时间就会变化一次)
    百度搜索ip地址
  • 查看一个网站的IP地址
    可以在命令提示符里ping网站的域名,能显示Ip地址。(部分是不可以显示IP地址的)
    pingQQ网站

外网IP与内网IP

 首先看看常见的网络类型:
外网IP与内网IP
 想一下我们电脑怎么连接上网的。喊电信移动给家里装宽带,工作人员就会给你家里安装一台拨号器与路由器,路由器与拨号器相连,电脑与路由器相连。公司也一样,不过是电脑多一些,可能会有几台路由器,而这些路由器最终都会连接到拨号器。对应上图的C类。

场景 是否接入互联网 是否向外提供服务 例子
A类 提供网页服务的云服务器
B类 × × 公安局用于存放敏感数据的服务器
C类 × 企业网络、家庭网络

 由于接入网络的电脑数量超出了设计者的设想,IPv4的地址并不够用,随时有超出的可能,所以提出了很多解决方案,除了IPv6(号称给地球所有东西都能分配一个独立的IP地址)之外,还有划分子网的方案,并让IPv4一直续命至今。现在IP地址不够用了,于是设计者把一部分IP地址列为私有IP,让处于内网的电脑使用私有IP,对外的使用公有IP。如上图所示,按旧的做法,所有接入互联网的电脑,都需要一个IP地址,A类一台电脑1个,C类三台电脑3个,共需要4个公有IP地址。划分子网后,A类电脑占用1个公有IP地址,C类三台电脑共使用1个公有IP地址,子网里使用3个私有IP来相互区分。 公有IP代表全球独一无二的IP地址,不可重复。而私有IP代表内网地址,只需要内网里保证独一无二即可。

 A类电脑需要向外提供服务,所以IP地址需要固定不变。而C类电脑并不需要向外提供服务,所以运营商会给这些电脑的调解网关动态分配IP地址就可以了,当这些电脑不用时,可以把这个IP地址再分配给别人。

 被列入私有IP地址是:

  • 10.0.0.0 - 10.255.255.255 (10/8 prefix)
  • 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
  • 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)

 另外一下,有一个IP地址很特别而且经常用到:127.0.0.1回环地址,它通常分配给主机名localhost。发送到这个地址的数据报实际上不会到达网络,它会自动回环变成发送主机的输入。

计算机网络基础 入门书籍
TCP/IP