网络体系之TCP/IP模型

TCP/IP参考模型是因特网使用的参考模型,这个体系结构在它的两个主要协议出现以后,被称为TCP/IP参考模型。该模型将网络协议分为四层:网络接口层、网络层、运输层、应用层。

TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。

(若将模型分为五层即计算机网络教材上分的五层,主机上有五层的协议栈,而路由器只有下面的三层,即物理层、数据链路层、网络层)

1、网络接口层

 网络接入层(即主机-网络层)与OSI参考模型中的物理层和数据链路层相对应,实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层即网络层一个访问接口,以便在网络接口层上传递 IP 数据报。

1.1、IP 地址与 Mac 地址在网络通信中

物理地址是数据链路层和物理层使用的地址,而 ip 地址是网络层和以上各层使用的地址,是一种逻辑地址。在发送数据时, 数据从高层下到低层, 然后才到通信链路上传输。使用 ip 地址的 ip 数据报一旦交给了数据链路层, 就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址, 这两个硬件地址都写在MAC帧的首部中。

(在局域网中, 由于硬件地址通常固定在网卡上的ROM 中, 因此常常称之为物理地址,也称 MAC 地址。但应注意, 有时, 如在X.25网中, 计算机的硬件地址并不是固化在ROM中的。)

1.2、ARP协议

概念:ARP协议可以通过 ip 地址找到对应的 MAC 地址。由于传送 ARP 分组使用的是IP协议, 因此应当把 ARP 协议划归网络层。 但ARP协议的用途是为了从网络层使用的 IP 地址解析出在数据链路层使用的硬件地址,因此, 有的教科书也把 ARP 协议分在数据链路层。两种说法都可以的。

由图 4-8 我们能知道, 网络层使用的是 IP 地址, 但在实际网络的链路上传送数据帧时, 最终还是必须使用该网络的硬件地址。 但 ip 地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如, IP 地址有 32 位, 而局域网的硬件地址是 48 位)。 此外, 在一个网络上可能经常会有新的主机加入进来, 或撤走一些主机。 更换网络适配器也会使主机的硬件地址改变。 地址解析协议 ARP 解决这个问题的方法是在主机 ARP 高速缓存中应存放一个从 ip 地址到硬件地址的映射表, 井且这个映射表还经常动态更新。

每个主机都设有一个 ARP 高速缓存(ARP cache), 里面有本局域网上的各主机和路由器的 ip 地址到硬件地址的映射表, 这些都是该主机目前知道的一些地址。如果在映射表上找不到对应的地址,那么主机就通过广播新增映射地址项目;而且每个映射地址项目都有一定的生存时间,凡超过生存时间的项目都会被删除而得以更新。

   

请注意, ARP 解决的是同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的目标主机和源主机不在同一个局域网上,例如,在上图 4-9 中, 主机 H1 就无法解析出另一个局域网上主机 H2 的硬件地址(实际上主机 H1 并不需要知道 H2 的硬件地址)。主机 H1 发送给 H2 的 IP 数据报首先需要通过与主机 H1 连接在同一个局域网上的路由器 R1 来转发。因此主机 H1 这时需要把路由器 R1 的 IP 地址解析为硬件地址 HA3, 以便能够把 IP 数据报传送到路由器 R1 以后, R1从转发表找出了下一跳路由器 R2。 同时使用ARP 解析出 R2 的硬件地址 HA5。于是 IP 数据报按照硬件地址 HA5 转发到路由器 R2 。路由器 R2 在转发这个 ip 数据报时用类似方法解析出目的主机 H2 的硬件地址 HA2 使IP 数据报最终交付主机 H2。

 主机 H1 要把一个IP数据报发送给目的主机H2,先要查找自己的路由表,看目的主机是否就在本网络上。如是, 则不需要经过任何路由器;如不是, 则必须把 IP 数据报先发送给某个路由器(图中的R1),R1 在查找了自己的路由表后, 知道应当把数据报转发给 R2 进行间接交付。以此类推,直到直接交付。

2、网络层

2.1、网络层介绍

网络层通常也称网际层或者 ip 层,它向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接。每一个分组(也就是 ip 数据报)独立发送, 与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说, 所传送的分组可能出错、丢失、重复和失序(即不按序到达终点), 当然也不保证分组交付的时限。由于传输网络不提供端到端的可靠传输服务, 这就使网络中的路由器可以做得比较简单, 而且价格低廉(与电信网的交换机相比较)。如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责(包括差错处理、流量控制等)。

上图给出了网络提供数据报服务的示意图。主机H1 向 H2 发送的分组各自独立地选择路由,并且在传送的过程中还可能丢失。

2.2、IP 协议

IP 的责任就是把数据从源传送到目的地。它不负责保证传送可靠性,流控制,包顺序和其它对于主机到主机协议来说很普通的服务。

IP 协议的用途:在相互连接的网络之间传递IP数据报。其中包括两个部分:

(1)寻址。用 IP地址来标识 Internet 的主机:在每个 IP 数据报中,都会携带源IP地址和目标IP地址来标识该IP数据报的源和目的主机。IP协议可以根据路由选择协议提供的路由信息对 IP 数据报进行转发,直至抵达目的主机。IP 协议使用 ARP 协议来进行地址匹配。

(2)分段与重组。IP 数据报通过不同类型的通信网络发送,IP数据报的大小会受到这些网络所规定的最大传输单元(MTU)的限制。IP 协议将 IP 数据报拆分成一个个能够适合下层技术传输的小数据报,被分段后的IP数据报可以独立地在网络中进行转发,在到达目的主机后被重组,恢复成原来的IP数据报。

与 ip 协议配套使用的有三个协议:地址解析协议ARP、网际控制报文协议ICMP、网际组管理协议IGMP。下图中, ARP 画在最下面, 因为 ip 经常要使用这个协议。ICMP和IGMP画在这一层的上部, 因为它们要使用 ip 协议。

       
       

 一个 IP 数据报由首部和数据两部分组成

2.3、ICMP网际控制报文协议

为了更有效地转发 ip 数据报和提高交付成功的机会, 在网络层使用了网际控制报文协议ICMP。ICMP 允许主机或路由器向源点主机报告差错情况和提供有关异常情况的报告。ICMP报文作为 ip 层数据报的数据, 加上数据报的首部, 组成IP数据报发送出去。

ICMP 报文的种类有两种:ICMP差错报告报文、ICMP 询问报文。

ICMP 差错报告报文共有五种:

(1 )终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
(2)源点抑制:    当路由器或主机由于拥塞而丢弃数据报时, 就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
(3)时间超过:    当路由器收到生存时间为零的数据报时, 除丢弃该数据报外, 还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时, 就把己收到的数据报片都丢弃, 并向源点发送时间超过报文。
(4)参数问题:    当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报, 井向源点发送参数问题报文。
(5)改变路由(重定向): 路由器把改变路由报文发送给主机, 让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

常用的ICMP询问报文有两种:
(1)回送请求和回答报文:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
(2)时间戳请求和回答报文:ICMP 时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP 时间戳回答报文中有一个32位的字段, 其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。

2.4、PING和 tracert 命令

(1)ICMP 的一个重要应用就是分组网间探测 PING 用来测试两个主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层 ICMP 的一个例子,它没有通过运输层的TCP或UDP。

上图中是我的电脑到百度服务器www.baidu.com的连通性的测试结果。PC一连发出四个 ICMP回送请求报文。如果百度服务器www.baidu.com正常工作而且响应这个ICMP回送请求报文(有的主机为了防止恶意攻击就不理睬外界发送过来的这种报文), 那么它就发回ICMP回送回答报文。由于往返的ICMP 报文上都有时间戳, 因此很容易得出往返时间。最后显示出的是统计结果: 发送到哪个机器(IP 地址〉, 发送的、收到的和丢失的分组数(但不给出分组丢失的原因)。往返时间的最小值、最大值和平均值。

(2)另一个非常有用的应用是 tracert 命令(在Unix系统上是 traceroute),它用来跟踪一个分组从源点到终点的路径。

tracert 从源主机向目的主机发送一连串的 ip 数据报, 数据报中封装的是无法交付的UDP 用户数据报。第一个数据报P1 的生存时间TTL 设置为1。当P1 到达路径上的第一个路由器R1 时, 路由器R1 先收下它, 接着把TTL的值减1,由于TTL等于零了,R1 就把P1 丢弃了, 并向源主机发送一个 ICMP 时间超过差错报告报文。以此类推,发送P2、P3,直到发送最后一个数据报,此时数据报到达目的主机时TTL是1。主机不转发数据报, 也不把TTL值减1 。但因 IP 数据报中封装的是无法交付的运输层的UDP用户数据报, 因此目的主机要向源主机发送ICMP 终点不可达差错报告报文。这样, 源主机达到了自己的目的, 因为这些路由器和最后目的主机发来的ICMP 报文正好给出了源主机想知道的路由信息一一到达目的主机所经过的路由器的 IP 地址, 以及到达其中的每一个路由器的往返时间。

上图中每一行有三个时间出现,是因为对应于每一个TTL值,源主机要发送三次同样的 IP 数据报

3、运输层

3.1、概念:

运输层向它上面的应用层提供通信服务,运输层提供的是端到端的通信。真正进行通信的实体是在主机中的进程, 是这个主机中的一个进程和另一个主机中的一个进程在交换数据(即通信)。因此严格地讲, 两个主机进行通信就是两个主机中的应用进程互相通信。IP 协议虽然能把分组送到目的主机, 但是这个分组还停留在主机的网络层而没有交付主机中的应用进程,因此还需要运输层。

当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时, 只有主机的协议钱才有运输层, 而网络核心部分中的路由器在转发分组时都只用到下三层的功能,如下图所示:

上图中的双向粗箭头写明“ 运输层提供应用进程间的逻辑通信”,“ 逻辑通信” 的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把这报文传送到对方的运输层(那怕双方相距很远, 例如几千公里),好像这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向(经过多个层次) 传送的。“ 逻辑通信” 的意思是“ 好像是这样通信, 但事实上并非真的这样通信”。

上图中可以看出网络层和运输层有明显的区别。网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。

运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间再一条端到端的逻辑通信信道, 但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP 协议时, 尽管下面的网络是不可靠的(只提供尽最大努力服务), 但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。

 3.2、运输层的端口(port)

在两台计算机通信时,只发 IP 地址是不够的。通过 IP 地址能找到对应的主机,但是因为同一台计算机上跑着多个应用程序,一个IP包来了之后,到底是交给浏览器还是QQ,这时候就需要端口号了。每个应用程序都应该有着唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。

由下图可知,UDP用户数据报和TCP报文都有源端口和目的端口这两个重要宇段。当运输层收到 IP 层交上来的运输层报文时, 就能够根据其运输层首部中的目的端口号把数据交付应用层的目的应用进程。

    

端口号只具有本地意义, 它只是为了标志本计算机应用层中的各个进程在和运输层交互时的接口,在不同计算机中,相同的端口号是没有关联的。16位的端口号可允许有65535 个不同的端口号,这个数目对一个计算机来说已经足够用了。

由此可见, 两个计算机中的进程要互相通信, 不仅必须知道对方的IP 地址(这是为了找到对方的计算机),而且还要知道对方的端口号(这是为了找到对方计算机中的应用进程)。可以看到有些时候访问网站并不需要输入端口号,是因为有些应用程序是默认使用某个端口号的,比如:http://www.baidu.com 和 http://www.baidu.com:80 输入这两个地址访问的结果是一样的,因为http程序的默认端口就是80。再比如:https://www.baidu.com 和 htts://www.baidu.com:443 这两个地址是一样的

因特网上的计算机通信是采用客户 -- 服务器方式。客户在发起通信请求时, 必须先知道对方服务器的IP地址和端口号。因此运输层的端口号共分为下面的两大类:

(1)服务器端使用的端口号:分为熟知端口号、登记端口号。IANA把熟知端口号指派给了TCP/IP最重要的一些应用程序, 让所有的用户都知道。当一种新的应用程序出现后,IANA必须为它指派一个熟知端口, 否则因特网上的其他应用进程就无法和它进行通信。

登记端口号是为没有熟知端口号的应用程序使用的。使用这类端口号必须在IANA按照规定的手续登记, 以防止重复。

(2)客户端使用的端口号:这类端口号仅在客户进程运行时才进行动态选择, 因此又叫做短暂端口号。这类端口号是留给客户进程暂时使用的,当服务器进程收到客户进程的报文时, 就知道了客户进程所使用的端口号, 因而可以把数据发送给客户进程。通信结束后, 刚才已使用过的客户端口号就不复存在, 这个端口号就可以供其他客户进程使用。

3.3、UDP协议

用户数据报协议UDP只在 IP 的数据报服务之上增加了很少一点的功能, 就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:
(1) UDP是无连接的, 即发送数据之前不需要建立连接(当然, 发送数据结束时也没有连接可释放), 因此减少了开销和发送数据之前的时延。

(2) UDP使用尽量大努力交付, 即不保证可靠交付, 因此主机不需要维持复杂的连接状态表

(3) UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付 ip 层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文, UDP就照样发送, 即一次发送一整个报文

3.4、传输控制协议TCP

TCP协议的特点:

(1) TCP 是面向连接的运输层协议。这就是说, 应用程序在使用TCP 协议之前, 必须先建立TCP 连接。在传送数据完毕后, 必须释放已经建立的TCP 连接。

(2)每一条TCP 连接只能有两个端点(endpoint), 每一条TCP 连接只能是点对点的(一对一)

(3) TCP提供可靠交付的服务。通过TCP连接传送的数据, 无差错、不丢失、不重复、并且按序到达。

(4) TCP 提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存, 用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后, 就可以做自己的事,而TCP在合适的时候把数据
发送出去。在接收时,TCP把收到的数据放入缓存, 上层的应用进程在合适的时候读取缓存中的数据。

(5)面向字节流。TCP中的“ 流” 指的是流入到进程或从进程流出的字节序列。“ 面向字节流” 的含义是: 虽然应用程序和TCP的交互是一次一个数据块( 大小不等), 但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个 TCP 报文段应包含多少个字节(而UDP发送的报文长度是应用进程给出的)。如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去。

把两个主机间的TCP连接的端点叫做套接字(socket)或插口。端口号拼接到 IP 地址即构成了套接字,中间用冒号或逗号隔开。例如,若 ip 地址是192.3.4.5而端口号是80,那么得到的套接字就是(192.3.4.5:80)。

理想的传输条件有以下两个特点:(1) 传输信道不产生差错。(2)不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。然而实际的网络都不具备以上两个理想条件。但可以使用一些可靠传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。这样就能在不可靠的传输信道上实现可靠传输了。

3.5、TCP 报文段的首部格式

TCP 传送的数据单元是报文段。一个TCP 报文段分为首部和数据两部分, 而TCP 的全部功能都体现在它首部中各宇段的作用。

首部固定部分各字段:

(1)源端口和目的端口

(2)序号:占4 字节,序号增加到最大后,下一个序号就又回到0。在一个TCP 连接中传送的字节流中的每一个字节都是按顺序编号的,整个要传送的字节流的起始序号在连接建立时设置。一个报文段中首部的序号字段值指的是本报文段所发送的数据的第一个字节的             序号。例如,一报文段的序号宇段值是301,而携带的数据共有100字节,这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话) 的数据序号应当从401 开始, 即下一个报文段的序号字段值应为           401。

(3)确认号:是期望收到对方下一个报文段的第一个数据字节的序号。例如,B 正确收到了A 发送过来的一个报文段, 其序号字段值是501,而数据长度是200 字节(序号501 ~ 700),这表明B正确收到了A发送的到序号700 为止的数据。因此,B期望收到A的下一个           数据序号是701, 于是B在发送给A的确认报文段中把确认号置为701。总之, 应当记住:若确认号= N, 则表明: 到序号 N -1 为止的所有数据都已正确收到。由于序号字段有32位长, 可对4 GB (即4千兆字节) 的数据进行编号。在一般情况下可保证当序号重            复使用时, 旧序号的数据早已通过网络到达终点了。

(4)数据偏移(5)保留(6)紧急URG

(7)确认ACK:仅当 ACK= 1 时确认号字段才有效。当ACK= 0时,确认号字段无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK 置1。

(8)推送PSH(9)复位RST

(10)同步SYN:在连接建立时用来同步序号。 当SYN= 1 而 ACK= 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN= 1 和 ACK = 1。 因此,SYN 置为 1 就表示这是一个连接请求或连接接受报文。

(11)终止FIN(12)窗口(13)检验和(14)紧急指针(15)选项

3.6、TCP的连接建立(三次握手)

TCP的运输连接有三个阶段,即:连接建立、数据传送和连接释放。TCP的运输连接的建立和释放是每一次通信中必不可少的过程。

三次握手示意图:

上图中,主机下面的方框里的文字表示 TCP 进程的状态,A 是主动打开连接的, 而B 是被动打开连接的。起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

SYN:同步序号;SYN=1,ACK=0 表示连接请求报文。SYN=1,ACK=1 表示连接接受      ACK:确认ACK,只有ACK为 1 时,确认号 ack 才有效

ack:确认号                                         seq:序号,上图中的x表示的是初始一个序号,不一定要从0开始

三次握手:

第一次握手:客户端向服务端发送连接请求报文段。该报文段的头部中:SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。

第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。

第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

问题:为什么连接建立需要三次握手,而不是两次握手?

防止已经失效的连接请求报文段又被服务端接收到,从而产生错误让服务器端浪费资源。

情景假设:A发出连接请求,但因连接请求报文丢失而未收到确认报文,于是A便超时重发请求报文,然后收到了B发来的确认,建立连接,数据传输完毕后,就释放了连接。但如果A发出的第一个请求报文并没有失效而是滞留了,过段时间后到达了B,此时B就会向A发出确认报文。如果没有第三次握手,那么只要发出确认B就以为建立了新的连接,由于A早已处于CLOSED状态,并不会理睬B的确认报文,也不会向B发送数据,而此时 B 在继续等待 A 发来数据,从而导致白白浪费资源。

4、应用层

1、超文本传输协议HTTP:这是一种最基本的客户机/服务器的访问协议。浏览器向服务器发送请求,而服务器回应相应的网页。
2、文件传送协议FTP:提供交互式的访问,基于客户服务器模式,面向连接,使用TCP可靠的运输服务,主要功能:减少/消除不同操作系统下文件的不兼容性
3、远程登录TELNET:客户服务器模式、能适应许多计算机和操作系统的差异、网络虚拟终端NVT的意义
4、简单邮件传送协议SMTP:Client/Server模式,面向连接、基本功能:写信、传送、报告传送情况、显示信件、接收方处理信件、用户发信到邮件网关的传输协议:SMTP
5、DNS域名解析协议:DNS是一种用以将域名转换为IP地址的Internet服务。
6、简单文件传送协议TFTP:客户服务器模式、使用UDP数据报、只支持文件传输,不支持交互、TFTP代码占内存小
7、简单网络管理协议(SNMP):SNMP模型的4个组件:被管理结点、管理站、管理信息、管理协议、SNMP代理:运行SNMP管理进程的被管理结点、对象:描述设备的变量、管理信息库(MIB):保存所有对象的数据结构
8、DHCP动态主机配置协议:发现协议中的引导文件名、空终止符、属名或者空,DHCP供应协议中的受限目录路径名 Options –可选参数字段。参考定义选择列表中的选择文件

原文地址:https://www.cnblogs.com/wenxuehai/p/10389964.html