0.简介

什么是TCP/IP:

TCP/IP(Transmission Control Protocol/Internet Protocol):传输控制协议和网络协议。这里我们一般使用TCP/IP代指整个TCP/IP 协议簇。这个协议簇其实包含很多其他的协议,但是这里TCP和IP是它们中的代表。

由于网络上大部分的TCP/IP 协议介绍都是把是书中的内容提取出来了,但是,对于许多新接触这些协议的人而言,什么网络分层,网络控制,数据链路这些专业名词大都是一头雾水。

这里我试着使大部分没接触过的人也能看懂的文字来描述这个协议,以及让我们了解这个协议为什么要这样设计,这样设计的优点是什么。

1.信息是如何传递的

在日常生活中,我们可能已经习惯了使用手机和电脑来发送和接收信息了。但是,其实我们今天所有在网络上传输的信息,其底层大都是基于TCP或UDP协议来传输的(后面将详细解释它们的区别)。

在信息发展的过程中,当语言刚形成的时候,人类祖先传递信息的效率十分低下,大部分信息只能依赖于口口相传,但是,随着文字和造纸术的出现,人类又开始了是使用文字和纸张的方法来写信进行沟通,尽管如此,信息的传输效率依然十分的低下。后来,随着电力的发展,人们发现电线可以十分快速的传递电信号,于是人们又发明了使用电力的方式传输信息。

然而,不论采用哪种方式传递信息,其本质都是把信息(语音,文字,画面等)通过一种媒介(人,信件,电线等)传递到另一个地方供其他人进行解读。这样,我们对于通信的需求就有了一个基本的认识了,同时我们也对通信的要求越来越高了,更快,更多,更安全等等需求也被人们所提出了了。

随着通信的技术和电脑的发展,人们发现越来越多的通信方法被使用,但是由于方法众多,因此,通信双方的机器必须要有一套相同的协议,只有这样,发送方的信息才能被接收方收到,并且正确的解析出来。在这样的背景下,1984年,美国国防部开始起草和制定了一个这样的通信协议,于是TCP/IP就作为计算机标准的通信协议而诞生了。

2.TCP/IP 协议族对于生活实际

现在,我们假设你要给你的朋友写信但是你不识字,那么,这里我们先思考一下,在这个过程中,我们都需要做些什么。

首先,我们需要一个识字的人,然后是纸,还有一个信封,信封用于装我们的信。之后,我们还需要知道好友的居住地址和他的名字,这里我们可能还需要一张邮票。之后我们就可以把我们的信投递到当地的邮箱中了。

当邮递员从邮箱中拿到我们的信的时候,他应该会把信收到本地的邮局,然后邮局会根据信上的地址进行划分,最后把邮件通过火车或其他的交通工具运输到你朋友所在的城市或地区。而在你朋友的所在地的邮政中心,这封信又会按照他所在的详细地址进行分类,最后交由邮递员给发到你朋友的邮箱里面。

分析这整个过程,我们其实可以发现,整个信件在传输的过程中,其实包含了以下的几点:

  • 信息本身
  • 信息的载体
  • 信息的包装
  • 信息的发送地址和接收地址
  • 信息需要中转的地方
  • 信息的传输媒介
  • 信息传输的方式

这里我们在对应到我们的 TCP/IP 协议中,我们的 TCP/IP 协议对整个通信进行了四层的分层,而标准的 OSI 模型对通信过程进行了七层的分层。这里把它们列出来:

OSI 标准模型由上至下:

  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

TCP/IP 实际使用的模型:

  • 应用层
  • 传输层
  • 网络层
  • 网络接口层

下面是它们的对应关系

好了,上图是我们的 TCP/IP 和 OSI 参考模型的对应关系,下面我们一生活中的寄信为例,看下 TCP/IP 和我们实际寄信的关系:

这里我们从高往低依次和我们的实际的寄信过程进行对应一下。这里我们先使用 TCP/IP 模型进行对应。

首先是应用层,这里的应用层在 TCP/IP 当中对应的就是 HTTP,FTP 这一类的协议。它们的主要作用就是把我们收到的数据交给应用程序解析。这里对应到现实,你家的收件箱相当于你电脑的端口,而当信件到达你家的收件箱的时候,需要你把他取出来拿到家里。这里相当于电脑的应用程序从电脑的网络缓存中把数据拿到自己的应用缓存中,当你拿到信的时候,由于你不识字,因此需要你找人给你翻译一下这封信。这里对应的就是电脑的应用程序解析它拿到的数据,这个解析所用的就是应用层的协议。

然后是传输层,这里就比较抽象一些了,这里我们的 TCP/IP 里面对应的是传输协议如:TCP和UDP这些协议,这些协议用于保证通信的信息不会丢失。对应于我们的现实中,假设你的这封信非常的重要,那么你如何保证邮局一定能给你配送成功呢。一般我们可以在信的结尾加上收到请回复。这样,当我们收到对方的回信的时候,我们就知道了我们的信被安全送达了,而这个我们加上的这个机制就相当于传输层所用的协议了。当然,这里由于计算机的网络情况和数据量都比我们现实写信的情况要复杂很多,因此,其信息保障机制要比我们实际的复杂很多,这里我们后面再进行详细介绍。

再然后就是网络层,这个看名字我们不知道是什么意思,但是在我们的 TCP/IP 协议里面,它对应的其实就是我们的 IP 协议,而 IP 协议的功能主要就是规定如何打包我们的 IP 地址和数据。而对应到我们的实际生活,其实就是你的写信的时候,如何把信装进信封里,并且信封上面要有那些必要的信息。

最后就是网络接口层开始,网络接口,故名思意,其就是我们的电脑的网线或光纤。这里对应到我们实际的邮件发送其实就是交通运输的工具我们可以选择火车,也可以选自高铁,汽车,轮船等等。当然,无论我们选择哪种交通工具,对于交通工具本身也都要遵守相应的交通规则,而这些交通规则其实就相当于我们的物理层的协议,只是这些协议不在我们的 TCP/IP 协议内。

总结一下:

应用层对应的就是你的信被翻译成你能理解的信息的协议

传输层对应于你要保证你的信不丢失而和你朋友之间定义的约定

网络层对应的就是你的信封本身,它包含了你信的内容以及你和你朋友的地址等必要信息

网络接口层对应的就是运输你的信所使用的交通工具以及与其对应的交通规则

3.IP协议( 网络层分析)

上面介绍了我们的 TCP/IP 协议族和我们实际的写信的过程进行了比较,其主要就是方便我们理解每一层的实际意义。

一个报文完整数据分析:
下面我们分析一下网络层的一个完整的数据报文:

这个是一帧完整的网络数据的分层结构,这里我们详细分析一下这帧数据,以及了解一下为什么要这样定义,以及它们的意义。

我们应该知道,我们所有在网络上传输的数据实际上都是以二进制的方式传输的,而我们平时网络上无论是视频还是文字,其在实际发送的时候其实都是以一帧一帧的形式发送的。上面就是一帧数据所要包含的基本信息了。

这里我们假设你要给你的朋友寄一千块钱,而这些钱是放在一个信封中的。这里我们把这个信封就当作一帧网络数据。我们来分析一下你这个信封里的内容,信封内部肯定包含这样几个内容:

  • 金钱本身
  • 钱的数量信息
  • 你的地址
  • 你朋友的地址
  • 写信的时间
  • 你所使用的快递信息
  • 邮票
  • 你的附件信息
  • 其他隐藏信息(比如你的快递公司的交通工具,收件人员等等)

这里我们把这些信息和数据帧中的信息进行对应:

数据 :这里对应的就是你的金钱,也是最重要的

32位目的IP地址:你朋友的地址

32位源IP地址:你的地址

16位校验和:你所写的钱的数量和防伪方法(防止钱被掉包或错误)

8位协议:你和你朋友之间的约定,保证他收到了这些钱后给你回复(这里其实是你所使用的传输层的协议类型如:TCP UDP 等)

8位生存时间TTL:这个记录的值是你的数据每经过一个路由器,该值就会减一,相当于你的实际的邮件每到一个邮局就盖一个章。当信件到达你朋友手里的时候,他可以根据上面的章的数量判断出邮件经过了几个邮局。

13位片偏移:当你在发送一个大的数据是,该数据会被拆分,而这里记录的就是该帧相对于整个数据的偏移。(这里实际上相当于你一次性想要寄1万块钱,但是由于邮局每次只能寄1千,因此你要分10次寄,你每寄一次,就会在邮件上面写个第几次,而你朋友收到的时候也知道这个你第几次寄给他,你还剩多少钱没寄)。

3位标志字段:这里的标志是告诉计算机是否分片,当数据过大的时候需要分片发送。

16位标识:唯一的标示主机的报文,如果IP报文在数据链路层被分片了,那么这里的所有的ID都是相同的。

16位总长度:这里记录整帧的数据的大小(相当于你快递的总重量信息,当快递到达的时候,你只需要对比上面的重量和实际的重量,你就知道你的快递是否完整)。

8位服务类型:这里包含了优先级和最小延时和吞吐量的信息(对应于快递,相当于你的快递是否是特快,是否保值,是否当面签收或有限制签收日期等信息)。

4位首部长度:IP帧头部的长度。

4位版本号:这里是IP协议的版本,一般有IPv4和IPv6两种。(这里可以想象成你信封的地址是中文还是英文的,方便分配给不同的邮递员查看地址)

总结:

上面是我根据理解,尽可能的使用我们能够理解的语言对一个完成的IP帧进行分析,我们可以看到,这个IP帧其实和我们邮件或快递的信息差不多,只不过我们的快递很多信息都隐藏掉了,因为快递大部分是人处理的,而人可以很轻易的得知其中所隐含的信息。但是,我们的电脑并不具备这样的智能,因此,我们必须要把所有可能用到的信息都完全的记录在一个IP帧上面,防止意外发生。

IP地址分类:

上面介绍了一个完整的IP帧数据所包含的信息,下面简单介绍一下IP地址的分类。

我们都知道,在广域网中,如果知道了对方的公网IP地址,那么我们也就可以锁定对方的所在位置了。那么为什么一个IP地址就可以锁定对方的具体位置呢?这里就跟IP地址的分配有关系了。

在网络诞生之初,我们为了使不同的计算机之间可以相互通信,我们发明了一个叫交换机的设备,在这个设备里,我们记录了所有要通信的计算机的名字,每台计算机我们都给他编了一个号码,这个号码就作为它和其他计算机通信的地址。而交换机也可以根据这个号码来把不同的计算机之间的消息进行相互转发。

但是,随着计算机数量的增多,人们发现,如果所有的计算机都经过一个交换机的话,那么这个交换机的负荷就会变得非常重。于是,人们又想办法,在不同的地方使用多个交换机,而每个交换机所管理的计算机的数量是一定的,因此,在一个交换机的负荷就会变小了。但是随之而来的又有一个问题,那就是不同地方的两个计算机无法进行通信,因为每个交换机中的计算机的地址都是数字,而不同地方的两台计算机的数字肯定有重复的,这样它们之间的通信就变得困难了。

为此,人们划定了一个IP地址表,首先IP地址是由32bit组成的一个数字,这个数字为了便于区分,我们把它分为4个部分,每部分的大小从0-255,这样,一个IP地址就变成了下面的这种方式了 http://xxx.xxx.xxx.xxx 而这种方式还有一个优点,那就是我们可以根据地方的不同,把不同的位置赋予其不一样的含义。

例如:192.168.1.1 这个IP地址,我们可以把192当作一个网络号来处理,后面的168.1.1 就对应位一个主机号了。这样不同的地区的网络号不同,而每个网络号又可以有多台主机。假如地区A的网络号是192,地区B的网络号是193.那么当地区A的主机a想和地区B的主机b进行通信,那么我们的交换机看到a发送的数据的IP地址是193开头的,于是就知道了他要和B地区的主机进行通信,那么后面的主机号它就不用解析了,直接将数据送到B地的交换机就行了。于是B地的交换机在收到了193开头的地址的数据之后,一看,是本地的地址,于是就把这个数据发送到和本地地址对应的主机上面。

这样我们不同地区的主机就可以相互通信了,而由于历史原因,当初在划分地址的时候使用了以下的这个规则:

其范围如下:

A类:以0开头的地址,地址范围:1.0.0.0---126.0.0.0

B类:以10开头的地址,地址范围:128.0.0.0---191.255.0.0

C类:以110开头的地址,地址范围:192.0.0.0---223.255.255.0

D类:以1110开头的地址,地址范围:224.0.0.0---239.255.255.255

E类:以11110开头的地址,地址范围:240.0.0.0---255.255.255.254

由上图可以看出,A类的网络号较少,主机号很多。而C类的网络号较多,主机号较少。D类主要用于多播服务(稍后再说多播和单播)

当时人们在制作这个IP分类表的时候,其实是打算给这个世界上的每一台计算机都配备为一个不同的IP地址的,这样我们只需要知道该计算机的IP地址,就可以锁定这台计算机的位置了。

但是,随着网络的发展,我们发现现在世界上的计算机的数量早已超过了其设定的IP地址的数量的上限了,而且随着物联网设备的使用,该IP分类现在也早已不适用了。

因此,我们现在的世界的主要使用了以下几种办法来避免出现IP冲突的问题:

设定动态IP,只有在线的设备才分配IP地址,不在线的设备不分配IP地址(常见于手机等移动设备)。
设置局域网,每个局域网内有一个广域网接口,该接口使用路由器和外部联通,这样,外部的IP和内部的IP就可以实现隔离了,我们只需要保证广域网接口的IP不重复就可以了(常见于办公环境需要多台个人主机的情况)。
发展IPv6技术,由于IPv4使用的总的IP长度是32bit的,因此,其从根本上就固定了IP设备的数量上限。而IPv6使用的是64bit的长度,其数量级可以给地球上的每粒沙子都分配一个地址。这样就保证了其数量足够的大了(目前并不普及,只有大公司的网络支持)。
由于现实中已经基本不在使用上述的IP分类方法了,因此,现在的IP地址网段大都是我们的网络服务商从政府的相关机构申请得到的,所以,我们的网络的通信都要经过我们所在地网络服务商那里,我们使用的广域网IP地址也都是他给我们的分配的。

4.数据的流动:

上面我们主要讲了IP地址的分类,和其使用方法,虽然我们已经知道了当初这样分类的目的,但是对于数据的转发的细节我们并不明白。这里我要说明一下,数据是如何在广大的互联网上进行流动的。

我们都知道,现在的一个完整的网络系统构成一般都要包含以下几个部分:

  • 计算机
  • 交换机
  • 路由器

这几个部分就可以构成一个简单的网络系统,但是其中的路由器的功能是干嘛的呢?交换机又是如何进行数据交换的呢?这里我们详细说一下。

路由器的功能:

路由器硬件组成:
一般我们使用的家用路由器大部分由主要由处理芯片和网络接口两部分组织:

  • 处理芯片:主要负责处理和转发网络接口传进来的数据。
  • 网络接口:一般分为WAN口了LAN口,WAN口主要是外接广域网的,LAN口主要是接内部局域网的。

路由器软件工作:

为了理解路由器的功能,我们这里首先要知道什么是路由表。

那么什么是路由表呢,其实它就是一个表,这个表里记录的一些信息,我们的电脑可以根据这些记录的信息把我们的想要发送的数据发送到指定的地址。这里我们还以寄邮件为例,这里的路由表就相当于我们的邮件需要从A地发到B地,此时呢你的邮件在A地的邮局,A地的邮局有一张表上面记录着A地到B地可以途径的几个地方,比如从A到B可以有如下几种走法:

1. A -> C -> D ->B
2. A -> E -> C -> B
3. A -> D -> F -> B
我们的邮局的工作人员,可以根据这个表中的几种走法来选择一个最快的分配给我们的邮件,然后让我们的信件就被按照这个路径进行送达。

具体到我们的路由器中,我们的路由器中也有一个这个表,而这个表中保存了以下几个基本信息:

  • Destiation:目的地址
  • Netmask: 子网掩码
  • Gateway/NextHop:网关/下一跳服务器
  • Interface:接口
  • Metric:跳数
  • Proto: 路由协议
  • Pro : 路由表优先级

这里我们解释一下上面几个名词的具体含义和功能:

目的地址:

这里的目标地址指的是我们的路由器可以识别的网络地址(例如:大部分路由器的目的地址是192.168.1.0,也就是说这个路由器只能接收的IP数据范围是 192.168.1.1-192.168.1.255 这个范围内的IP数据)。

子网掩码:

这个码主要用于和主机地址一起得出我们的本地计算机可以识别的网络地址。(例如:你的主机地址是192.168.1.128,而主机的子网掩码是255.255.255.0,那么我们就可以把你的主机地址和子网掩码进行按位与操作,从而得出你的网络地址是192.168.1.0,具体的如何按位与操作,自行搜索)

网关:

这里的又被叫做下一跳服务器,主要原因是,当我们的路由器收到数据后特定的IP数据后,路由器可以把这些数据转发到网关所指定的服务器。(我们电脑的网关大部分都是指向路由器地址的,因为我们的局域网的数据都是要发给路由器来处理的)

接口:

对应于你电脑和路由器的物理网络接口。

跳数:

跳数指的是数据想要经过路由器要想到达某个地址所走的路径的质量(其值越低表示该路径质量越好)。

路由协议:

这个协议决定了我们的路由表是如何生成的(静态路由是人手工分配的,动态路由需要根据路由协议进行分配)。

路由表优先级:

这个值越小,优先级也就越高。

总结:

其实我们的每台电脑都有自己的路由表,电脑根据它自己的路由表把数据发送给我们的路由器,而我们的路由器也根据它的路由表计算出它所要转发的数据的下一跳服务器,然后把所有收到的数据进行转发出去。

拓展知识:

这里由于我们明白了路由器的基本功能,而且也知道了电脑上面也有路由表,因此,我们这里其实可以把路由器进行分类:

软路由:路由器的本身的路由算法是由软件实现的,其软件是需要跑在一个操作系统上面的,因此,软路由本身也可看做一个带有多个网口的专用计算机。

硬路由:其路由算法是在硬件设计的时候就直接做在硬件里面的,因此,其硬件只能作为路由器使用,不能作为其他的用途。市面上大多数的品牌路由器都是这一类的。

广域网的数据流:

上面我们只是介绍了路由表的内容和路由器要实现的功能,但是并没有说路由器如何根据路由表的内容操作数据进行转发,这里我们以一个实际的例子来看一下:

实例介绍:

这里是一个最简单网络拓扑结构:

现在我们有一个局域网,这个局域网内有三台主机,现在我们需要访问一台服务器。如图,LP1 的 IP 是 192.168.1.3 而我们的路由器的内网IP是192.168.1.1 外网 IP 是1.1.1.1 由于我们的路由转发规则是根据路由表来确定的,而路由表的生成一般有两种方法。静态路由表和动态路由表,由于动态路由表需要专门的路由算法,而这个算法比较复杂。因此,我们这里就直接是用一个静态路由表来举例。

这里我们的静态路由表设置如下:

  • Destiation:192.168.1.0/8
  • Netmask:255.255.255.0
  • Gateway:1.1.1.1
  • Interface:wan
  • pre: 1

这里我们分析一下当 LP1 要访问服务器的时候的IP报的处理方式,首先,LP1会根据其内部的路由表,来决定将IP包从自己的哪一个网口发给我们的Router。而这个IP包内的源地址和目的地址如下:

源地址:192.168.1.3 (主机的IP)
目的地址:172.196.2.3 (服务器的IP)

当这个包到达我们的路由器的时候,我们路由器先检查IP包的源地址是否和路由器中的Destiation处于同一个网络地址,这里路由器会把IP包的源地址192.168.1.3 和路由器的Netmask 255.255.255.0 进行与操作,得到192.168.1.0比较得出它们是在一个网络地址,然后再执行接下来的操作,否则会直接丢弃。

然后,路由器会对这个包进行进一步的包装,这里它会把IP包中的源地址192.168.1.3 换为自己的外网IP地址1.1.1.1,此时,我们的IP包的源地址和目的地址如下:

源地址:1.1.1.1 (变为我们的路由器的公网IP地址了)
目的地址:172.196.2.3 (依然是服务器的IP地址)

于此同时,路由器会在自己的表单中生成一个记录并保存在路由器内,这个记录是:

192.168.1.3 ---> 1.1.1.1 (表示内网的IP 192.168.1.3 映射为外网IP 1.1.1.1 )

最后,路由器将重新封好的IP包通过wan口转发出去。后面的路由器也会重复这个操作,直到这个IP包被发送给我们的最终目的 172.196.2.3 这个服务器。

当服务器要回复我们的主机的时候,它的IP包也会每经过一个路由器就被重新打包一次,只不过这里在重新打包时会根据记录的表单信息,将它的目的地址给替换成表单中的映射前的地址,然后再根据路由表的信息进行转发。

总结:

这里我们分析了一个IP包从我们的局域网内的主机到达广域网中的一个服务器的过程。整个过程中,路由器作为了一个关键的数据中转站,承担了转发和重新打包的功能。这个过程中,路由表起到了关键的作用,因此,这里的路由表动态生成协议其实很重要,只是,这里我们不对其进行深入讨论了。

局域网的数据流:

上面我们介绍了一个IP帧从局域网到广域网转发的流程以及路由器在其中的作用。这里我们会介绍一下局域网内的通信以及广播和单播等内容。

在讲解局域网的数据流之前,首先我们这里先介绍一下MAC地址和交换机的作用:

什么是MAC地址:

MAC地址是我们的物理层设备的地址,所有的网络设备在其网络接口上都会有一个固定的地址,这个地址在设备出厂的时候就直接在其接口芯片内部固定的了,且该地址一般是全球唯一的。而我们的交换机可以通过该地址直接定位到我们的具体硬件设备。

这里由于我们的MAC地址是保存在我们的链路层,因此,这里需要用到以太网协议来给我们的IP包在进行一次打包:

这里的目的地址和源地址主要指的是MAC地址,而这里的数据则是指IP报文。由于前面介绍过了IP报文的格局,这里我们就不对以太网的帧数据进行详细介绍了。

关于以太网帧中的目的地址是如何获取到的,这里就涉及到ARP请求了,这里简单介绍一下ARP请求的功能吧。

ARP请求一般是由我们的主机发起的,他是一个广播请求,因此,其可以到达这个局域网内的所有的主机,而其他主机收到这个ARP请求之后,会返回一个RAPR应答。在这个RAPR应答中,就包含了这个主机的IP地址和MAC地址。这样,我们的主机就可以知道当前局域网内的所有的主机的IP地址和MAC地址了。

交换机的工作原理:

交换机主要的功能是对局域网内的主机设备的数据进行交换,而这个数据交换其实大部分是发生在链路层的。

当交换机在收到数据帧后,首先会记录数据帧的源MAC地址和其对应的网络接口到其内部的MAC表中,然后会检查自己的MAC表中是否有与收到的数据帧中的目标MAC一致的MAC地址。如果有,则直接会根据MAC地址表中记录的把该帧发送到其对应的网络接口。这样,我们的局域网的网络数据就可以不经过IP层,只在链路层就完成了转发的工作。

除了只在链路层工作的交换机外,现在还有一种也可以工作在网络层的交换机,也就是我们常说的三层交换机。这种交换机也可以对IP报文进行解析,其主要目的是在复杂的局域网中进行跨网段的数据交换,这里的原理我们就不进一步说明了。

这里我们根据一个简单的局域网的拓扑结构图来分析一下:

这是一个简单的局域网,其中每个设备都有一个唯一的MAC地址与其对应,这里我们假设设备LP1要和LP6进行通信。此时,LP1会先查找本地的ARP表内有没有与设备LP6的IP对应的MAC地址。如果没有,则LP1会发送一个ARP报文,此时,在本局域网内的所有的主机都会收到这个报文数据,然后,它们会把各自的MAC地址和IP地址发给我们的LP1。当LP1收到这些RARP报文后,会在本设备内生成一张ARP表。

这时,拥有了ARP表的LP1主机就可以查询到LP6主机的IP对应的MAC地址了。当我们的IP报文经过我们主机的网卡的时候,网卡就会自动的把这个IP报文重新打包成一个以太网帧,其中就包含了我们的LP6的MAC地址。

当这个以太网帧到达我们的交换机的时候,交换机会查询在它内部的MAC表,根据MAC表内记录的MAC地址和网络端口的对应关系,将这个以太网报文转到到LP6网线对应的那个网络端口。

而当LP6收到这个转发过来的以太网帧的时候,其网卡会和本机的MAC地址比较,如果MAC地址符合,那么网卡就将这个以太网帧中的IP报文提取出来,再次将报文给到更高级别的应用程序去处理。

至此,一次局域网内部的单播通信就完成了,除了单播之外在局域网中我们的还经常使用有广播和多播的通讯方式。

广播:

所谓的广播就是所有的设备都可以收到这个数据。

当初在设计IP分段的时候,已经预留出了广播地址:255.255.255.255 这个地址主要用于局域网内部的所有网络设备,含有此目的地址的IP报文不会被路由器转发。

多播:

所谓多播又叫组播,其功能主要是为了在一个局域网内部可以设置多个多播组,每个组内的IP报文只会在本组内部互通。

多播当初预留的IP地址为D类地址:224.0.0.0---239.255.255.255 在这个地址段的IP报文都是多播报文。设置多播的设备需要交换机也支持多播功能,否则,交换机会把多播的IP报文当广播处理。

如果交换机支持多播功能的话,我们在使用多播的时候需要开启IGMP snooping功能,该功能主要是为了让交换机把不同的多播组和其所对应的端口进行归类,方便数据在这个组内进行转发,不会影响到其他的组。

总结:

局域网内的数据传输相比广域网而言比较简单,因为数据不需要经过路由器路由,只需要在局域网内部经过交换机转发就可以了。相对而言其大部分都工作在链路层。

5.TCP和UDP介绍(传输层):

上面介绍的大部分都是在网络层和链路层相关的内容,它们大都是和数据包相关的。往往只是对单个数据进行打包和转发的协议。这些协议只负责数据在传输的过程中能够到达正确的地点,但是其本身并不能保证数据一定能够到达,如果传输过程中其中一个环节出现问题,那么这个数据也就会出现丢失的问题。

为了保证数据传输足够的稳定和安全,我们还需要设计一个传输层相关的协议,这里就是主要是TCP和UDP了。

TCP和UDP的区别:

TCP:(Transmission Control Protocl)传输控制协议

UDP:(User Datagram Protocol)用户数据报协议

这里先简单说下他们的区别:

由上图可以看出,这两个协议对于其设计的使用场景是完全不一样的,也由此导致了其在通信协议的上面的完全不同。

TCP如何保证通信的可靠性?

我们知道,假如一个IP报文被计算机发送出去,对于它是否能够到达我们想要它到达的地点,这点我们发送报文的主机是完全不知道的。这个完全依赖于整个通信网络的可靠性,但是如果数据在被转发的过程中,其中的某个路由器或交换机出现了问题,那么这个IP报文就会被丢失,此时,我们的发送主机不能得到任何的反馈。

而TCP协议的设计目的就是为了防止此类事情的出现,而即使在通信过程中,这个通信线路中断了,或者通信对象的设备出现了问题。那么,我们作为数据发送方,也可以及时的知道数据没有被对方收到。

假设一种现实情况:
现在让我们先设想这样一种情况:

A和B是大学同学,A暗恋了B很长时间,其实B也喜欢A。
但是现在毕业,他们各个回到在自己的城市。
而A由于不甘心于是他主动向其他同学打听到了B的家庭住址,他想通过寄信的方式表白。
于是现在的出现了如下的情况:
1.A知道B的家庭地址,但是B不知道A家庭的地址.
2.B并不是每天都在家的(可能出去一去就是几个星期).
3.A也不是每天都在家.
4.信件可能在路上丢掉(小概率事件).
5.当信件在一天内没有被签收的话就会被丢掉(一定发生).

此刻,A想要和B进行通信。

我们不妨自己试着设计一个方法,看看能否保证A一定能和B进行通信。

假设一:B不在家:A按照他知道的地址给B写了一封信,当信到达的时候,B不在,因此,本次通信失败。

假设二:B在家,A不在家:当B收到A的信件的时候,此时B会立刻回复给A,而A此时没在家,那么通信失败。

假设三:双方都在家:当B收到信件,并立刻回复A,而A也在家,于是他也立刻回复B,此时,B和A都知道了对方在家。

于是,他们可以在接下来的一段时间内进行通信互相聊天。

正在此时,A突然接到上司的命令,他过几天需要出差,于是,他赶快给B写了封信,告诉B他要出差了。

当B收到A的回信时,他知道了A要过几天要出差去了,于是他立刻给A回信告诉他说收到这个消息了。而A收到B的信之后,就知道了B不会再给他写信了,于是放心的去出差了。

至此,我们的A和B完成了一次完整的通信过程,且双方对于对方的状态都有了解了。

计算机的实现方式:

对于计算机而言,上面假设的情况肯定是成立的,因为我们的计算机其实并不是百分百可靠的,也不一定是二十四小时开机和在线的。因此,上面对于现实情况的假设也就是计算机的真实情况了。

为了防止这种情况导致的计算机通信失败或异常,我们设计了这个TCP协议:

我们可以看上面这个图,其中Client为发起通信方,而Server为接受通信方。现在,让我们看下他们的通信过程和我们上面假设的现实情况的比较。

图片从上到下,上面绿色部分,Client首先发起了一次通信SYN,而Server收到后立刻回复给Client 一个ACK,Client收到ACK回复后,也立刻回复了对方ACK。此时,双方都确定了对方的存在。这也就是第一个阶段的通信(双方互相了解了对方的IP地址和端口号,建立了链接)。

中间蓝色部分,Client和Server都只是在进行正常的沟通,因为双方都知道了对方的存在,且通信过程没有问题。(进行真正的数据交换)

下面橙色的部分开始,Client想要结束这次通信,于是给Server发送了一个FIN信号,表示自己已经没有数据要发送了。而Server也立刻回复了一个ACK信号表示收到。(本来这里Client的通信就可以结束了,但是在建立链接之后,我们的通信双方都可以主动给对方发送数据,因此,如果对方没有发送FIN结束信号,你需要一直等待,保持连接不断,防止对方有重要消息发送)于是,Server又给Client也发送了一个FIN信息,表示自己也没有信息要发送了,而Client收到后也立刻回复了一个ACK。(双方结束通信)

这样,这次由Client主动发起又由Client主动结束的一次通信算是完成了。通过和我们假设的现实情况进行对比,可以发现,其实他们采用的通信策略是大致一样的,唯一的不同就是,在最后结束的时候,Server又给Client发了一个结束信号FIN,这里是为了保险起见进行设计的。

总结:

通过上面对现实的举例和计算机的具体实现,我们基本就明白了TCP通信中的所谓的三次握手(建立连接)和四次挥手(结束通信)是怎么回事了,也知道了通信双方是如何保证通信安全的。

上面举例的例子是一次正常通信的过程,但是在实际中,很可能会遇到很多不正常的情况。当通信不正常的时候,我们的TCP会重复发起连接。每次连接我们的TPC的报文头部会携带一些信息必要。

TCP报文分析:

上面分析了TCP如何保证通信的的报文一定可以到达对方,以及双方所采取的通信方法,这里我们再次分析一个TCP的报文的格式。

由上图可以看出,TCP的数据报文是包含在我们的IP协议的数据部分里面的。这里就充分体现了在设计协议的时候的分层的作用。高层的数据协议被包含在低层协议的数据里,而低层的又被更低层包含,这样,我们的数据包每经过一个层级的硬件,就会被剥掉一次的协议头,各层协议彼此之间互不影响。

这里我们类比一下我们的IP协议的数据头,简单分析一下各个数据段的作用:

  • 源端口:Client主机的端口号
  • 目的端口:Server主机的端口号
  • 序号:用来标示从TCP源端向目的端发送的数据的顺序的序号(防止因为网络导致的收到的数据的前后顺序反了)
  • 确认号:ACK标志,当ACK为1时,确认号加一 ack=seq+1
    数据偏移(头部长度):(这里应该头部长度,图上的是错误的)标识该TCP的头部有多少个32bit的字节数量。其值最大为15,因此TCP的头部长度最长为60字节。
  • 保留:没有功能,为以后预留的
  • 标志位:共6位如下
    ACK:确认需要有效
    FIN:释放一个连接
    PSH:接收方应尽快将这个报文交给应用层
    RST:重置连接
    SYN:发起一个新连接
    URG:紧急指针有效
  • 校验和:对TCP数据进行计算得到一个值,防止传输过程中的数据错误。
  • 紧急指针:指向后面是优先数据的字节,在URG设置的时候才有效。
  • 选项:长度不定,但必须是32bits的整数倍,常见的为MSS,SACK,Timestamp等。

总结:

这里的数据头其实和我们的IP协议的报头差不太多,大部分设计的目的都是一样的。后面我们在自己设计通信协议的时候也都可以参考这些内容。

UDP 设计目的:
上面介绍了TCP的协议和报文实现,因为我们已经知道TCP和UDP的区别了,这里我们简单说下UDP的设计目的和其协议实现。

设计目的:

UDP主要用于需要及时响应,对数据完整性要求不高的使用场景,例如:视频直播,语音通话等。

协议实现:

由于UDP没有连接,且对数据完整性没由太高的要求。因此,其几乎没有什么控制协议他只负责把数据发出去就可以了,至于有没有接收设备,接收设备是否收到了数据,它根本就不关心这些。也因此,它大多时候被用于多播和广播的通信方式中。

UDP 报文分析:

可以看到,UDP的报文的头部相比于TCP要小很多,这里我们先简单介绍一下他的头部组成:

  • 源端口:主动发送数据的Client主机端口
  • 目的端口:接收数据的Server主机端口
  • 长度:UDP用户报长度,其最小值是8(说明只有头部,没有数据)
  • 校验和:对整个UDP用户进行计算,得出一个结果(防止报文数据在传输过程中出现错误而没被接收端检测到)

伪首部:

其实TCP和UDP都存在这个伪首部数据,这里的数据在实际的数据报中式不存在的,而这里的添加他只是为了在计算校验和的时候更加的安全的一种措施。

这里的源IP地址和目的IP地址都是我们的IP协议里面的,这里在计算校验和的时候,需要把这些IP协议的内容也加进来,就是为了防止我们网络层出现错误,例如IP地址被搞错了,但是网络层在传输的时候没有检测出来,那么这个错误就有可能被使用,从而导致传输层也没有检测出来。

而这里添加了一些额外的伪首部信息,就可以防止IP出现错误而未被检测出来时,传输层会发现错误,直接丢弃,从而保证了数据的安全性。

但是,这里这个作用应该已经很小了,其设置之初可能时网络传输的稳定性过差,而校验和对于连续的数据错误的校验能力不足而做的吧。

总结:

这里总体简要了TCP和UDP这两大主要的传输层协议,我们现在几乎所有的网络通信设备都会使用这两个通信协议。通过对他们的描述,我们大致也对整个传输层的作用有了更深入的了解了。

6.全文总结:

陆陆续续写了一个多星期了,这里大致把TCP/IP协议中最重要的两个TCP协议和IP协议都做了介绍。其中也夹杂着一些其他的内容。

通过对数据从计算机的网口发出,到目标主机收到数据,这个完整的网络通信过程的了解,相信,即使你以前从没有接触过网络通信相关的内容,你也可以从我的描述中了解到整个网络是如何运作的。其中的一些协议具体是起什么作用的,当初的人们为什么要这样设计等一些问题有了自己的想法了。

其实 TCP/IP 协议族里面还有很多其他的协议,而且在应用层我们也可以自己设计属于我们自己的应用层通信协议。但是这些都是建立在对于底层的基础协议的了解和使用的基础之上的。

--转载于知乎晓鹏-King