前言:
眼前小伙伴们对“tcpip协议族中什么为最终用户提供服务”大体比较关怀,我们都需要知道一些“tcpip协议族中什么为最终用户提供服务”的相关知识。那么小编在网络上收集了一些对于“tcpip协议族中什么为最终用户提供服务””的相关资讯,希望大家能喜欢,咱们一起来了解一下吧!1.1.TCP/IP协议简介
tcp/ip协议运行在各种操作系统上的一种网络通信协议,各个系统通过实现tcp/ip的相关协议,来达到相互之间通信的目的。
1.2.TCP/IP协议分层细节
网络协议通常都是分层开发,各个层负责其相对应的任务,TCP/IP协议也不例外。例如,TCP/IP协议的链路层负责保证局域网内的通信,网络层负责保证跨局域网之间的通信。
具体的分层细节如下:
链路层:有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
网络层:有时也称作互联网层,处理分组在网络中的活动,例如分组(分组可以理解为一条在网络中传输的报文)的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(常用的ping程序便是通过这个协议实现),以及IGMP协议(负责组播选路转发的相关协议)。
传输层:有时也称作运输层,运输层主要为两台主机上的应用程序提供端到端的通信(注意运输层负责的是应用程序之间的通信,而主机到主机之间的通信由链路层与网络层负责)。
在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信(TCP提供的服务是可靠的,即只要是TCP承载的协议报文,除非网络不通,否则网络报文必定能正常送达目的主机,这是由于网络层的IP服务时不可靠的)。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端(不具备可靠性,需要通过上层协议来保证)。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。
应用层:应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:
• Telnet 远程登录。
• FTP 文件传输协议。
• SMTP 简单邮件传送协议。
• SNMP 简单网络管理协议。
我们可以简单地将链路层、网络层与传输层这三层的协议的作用,统一理解成为了将报文成功送达目标主机对应的目的程序。而应用层的数据才是报文中真正承载的用户数据,即我们应用程序之间通信的真正数据。例如我们微信、QQ这些聊天软件发出去的聊天信息就是承载在应用层的数据包中。
1.3.TCP/IP协议分层图
TCP与UDP是最为著名的运输层协议,这两种协议都以IP协议作为其网络层协议。当前互联网中的绝大多数应用层协议都是承载在这两种运输层协议之上。
TCP协议是可靠的,虽然使用的是不可靠的IP服务,但其特殊的机制使得其提供的服务时可靠的,如报文确认机制、超时重传机制等。TELNET、FTP、SMTP等著名协议所使用的运输层协议就是TCP协议。
UDP协议是不可靠的,仅为应用程序提供发送和接收数据包的服务。其可靠性需要通过应用层协议来保证。DNS、TFTP、SNMP等著名协议所使用的的运输层协议就是UDP协议。
IP 是网络层上的主要协议,也是为TCP、UDP协议提供网络层服务的协议。在数据包到达目的主机之前,跨局域网之间的网络选路都由IP协议来提供。
ICMP是IP 协议的附属协议,其也是属于网络层协议。从报文上观察时,很容易将其误认为是运输层协议,但实际上是属于网络层协议。主要作用是在各个网络主机与路由器之间交换网络错误消息和其他的一些状态信息。
IGMP是负责组播转发的网络层协议。主要负责组播报文(报文有单播、组播与广播三种)在路由器上的选路转发。
ARP与RARP是属于链路层协议,有时也认为是2.5层协议。其主要负责的是链路层的地址(以太网即MAC地址)与网络层地址(TCP/IP协议即IP地址)之间的相互转换。
1.4.互联网的IP地址
互联网上每个接口都具备一个或多个ip地址来标识该网络接口。IP地址具有一定的结构,5类不同的ip地址格式如图1-2:
如上所述,有3类报文,分别是单播报文、组播报文与广播报文,对应的有3类ip地址,即单播地址,组播地址和广播地址。这32位地址通常用点分十进制的格式来描述,如C类地址 192.168.225.2。各类地址的IP范围如图1-3:
1.5.域名系统
虽然通过IP地址唯一标识一个接口可以顺利的找到该网络接口,进而访问该主机,但是网络接口的32位ip地址(甚至ipv6的128位地址)实在不好记。我们更希望一个主机能直接用一个主机名来描述,这样才能让使用者更加方便。因此,在TCP/IP领域中,存在一个域名系统,提供主机名与ip地址之间的相互查询服务,即大名鼎鼎的DNS。
1.6.报文封装
当我们数据要通过TCP协议来传输时,系统会将我们的数据做一层层的封装,先加上运输层TCP/UDP协议的头部信息,再加上网络层IP协议的头部,接着加上链路层协议的头部,最后从指定的端口发出。其中TCP传给IP的数据单元称作TCP报文段或简称为TCP段(TCP segment)。IP传给网络接口层的数据单元称作IP数据报(IP datagram)。通过以太网传输的比特流称作帧(Frame)。
报文若是通过以太网数据帧传输,那么其数据帧大小是有限制的,即其帧长必须在46-1500字节(数据由相关计算得来,主要与传输延时相关)之间。
TCP报文封装示意图如图1-4,UDP报文封装与TCP报文封装几乎一致,UDP报文封装将TCP首部换成UDP首部即可,且UDP首部长为8字节:
各个层的协议都有多种,因此承载各个协议的分层负责标识下一层所承载的相关协议。具体来说,以太网首部后面可能跟ARP/RARP/VXLAN/MPLS/IP等协议,因此以太网首部包含一个16位的帧类型字段,用来标识后面分层所承载的协议;相似的有IP层包含一个8位的协议域字段,用来标识后面分层所承载的是ICMP/IGMP/TCP/UDP等协议;相似的还有TCP/UDP首部包含16位端口号,来标识该报文所属的应用程序。
1.7.分用
当目的主机收到一个报文时,程序就开始一层层的解析,一层层地剥去各个首部,然后找到最终的应用程序,将真正的用户数据传给相对应的程序处理。具体如图1-5:
从这个架构图上观察,会发现ICMP与IGMP协议是在IP层上,貌似与TCP/UDP属于同一层,但实际上如上文所述,其实是属于IP协议的附属协议。ARP与RARP有同样的问题存在。这只能归结为一个问题,即分层协议设计的并不完美。
1.8.客户-服务器模型
绝大部分的应用程序所使用的网络模型都是客户服务器模型,客户通过向服务器发送请求,接着服务器应答客户请求的方式,来完成客户与服务器之间的交互。
这种交互模型实现又分为两类,重复型与并发型。
重复型通过以下步骤提供服务:
等待一个客户请求到来处理客户请求发送响应给客户请求返回第一步继续等待客户请求
并发型通过以下步骤提供服务:
等待一个客户请求到来生成一个新的进程/线程来处理到来的客户请求,处理结束后,终止相应进程。返回第一步继续等待客户请求
并发服务器相比于重复型服务器的优势在于,多任务系统上时可以支持同时处理多个用户请求。
1.9.常见的tcp/udp服务
若想知道哪些服务是使用tcp/udp承载实现的,那么可以在linux系统下,运行grep tcp/udp /etc/services,正常情况下就会罗列出相应的服务,可以发现有些服务在tcp和udp上都有实现。
图1-6是我在linux系统下运行查询到的部分截图:
可以看到snmp协议也有承载在tcp协议上的实现,而上文曾提到snmp协议是属于udp协议上的实现,因此snmp协议在udp和tcp协议上都有实现,可通过grep snmp /etc/services命令验证,如图1-7:
1.10.应用编程接口
使用TCP/IP协议的应用程序通常采用两种网络编程接口,分别是socket和TLI。目前我们更常用的接口是socket接口。网络编程的socket接口,后续会另开章节补充。