编辑推荐: |
本文来自于博客
Kyrie lrving,主要讲解TCP/IP协议七层模型合并为四层协议的体系结构,以及原理解析,希望对您的学习有所帮助。 |
|
TCP/IP概述
TCP/IP起源于1969年美国国防部(DOD:The United States Department
Of Defense)高级研究项目管理局(APRA:AdvancedResearch Projects
Agency)对有关分组交换的广域网(Packet-Switched wide-area network)科研项目,因此起初的网络称为ARPANET。
1973年TCP(传输控制协议)正式投入使用,1981年IP(网际协议)协议投入使用,1983年TCP/IP协议正式被集成到美国加州大学伯克利分校的UNIX版本中,该“网络版”操作系统适应了当时各大学、机关、企业旺盛的连网需求,因而随着该免费分发的操作系统的广泛使用,TCP/IP协议得到了流传。
TCP/IP技术得到了众多厂商的支持,不久就有了很多分散的网络。所有这些单个的TCP/IP网络都互联起来称为INTERNET。基于TCP/IP协议的Internet已逐步发展成为当今世界上规模最大、拥有用户和资源最多的一个超大型计算机网络,TCP/IP协议也因此成为事实上的工业标准。IP网络正逐步成为当代乃至未来计算机网络的主流。
早在TCP/IP协议出现之前,国际标准化组织(ISO)就提出了开放系统互连(OSI)网络模型,为网络的设计、开发、编程、维护提供了便利的分而治之的思想,其先进性、科学性、实用性是不言而喻的。
TCP/IP协议不是单纯的两个协议,是一组不同层次上的多个协议的组合,常称为TCP/IP协议簇或者互联网协议簇。TCP/IP也是互联网的事实上的标准,为实现整个网络的互联提供指导。TCP/IP层次组合很难用OSI的七层模型来套用,它是OSI模型的浓缩,将原来的七层模型合并为四层协议的体系结构,自顶向下分别是应用层、传输层、网络层和网络接口层,没有OSI参考模型的会话层和表示层,一般认为TCP/IP的会话和表示功能是在传输层或应用层上完成的。
TCP/IP不是一个单独的协议,而是一个协议簇,是一组不同层次上的多个协议的组合。上面给出了OSI与TCP/IP模型对比、TCP/IP不同层次的协议。
网络接口层:有时也称作数据链路层或链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。在TCP/IP协议簇中,链路层的协议比较多,它决定了网络形态,但很多都不是专门为TCP/IP设计的。常用的链路层协议包括:以太网协议、PPP协议、帧中继协议、ATM等。
网络层:IP层有时也称作互连网层,处理分组在网络中的活动,在底层通信网络的基础上,完成路由、寻径功能,提供主机到主机的连接。IP是尽力传送的、不可靠的协议。在TCP/IP协议簇中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互连网控制报文协议),ARP/RARP(地址解析/反向地址解析协议),以及IGMP协议(Internet组管理协议)。
传输层:主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议簇中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议),它们分别承载不同的应用。TCP协议提供可靠的服务,UDP协议提供不可靠但是高效的服务。
应用层:这一层负责具体的应用,比如HTTP访问、FTP文件传输、SMTP/POP3邮件处理等等。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:远程登录(Telnet)、文件传输协议(FTP)、简单邮件传输协议(SMTP)、简单网络管理协议(SNMP)。
严格来讲,分层模型的动机就是将各层的功能尽量独立,每层的功能对另一层来说是透明的,只对通信的另一端负责,为编程和诊断提供良好的层次隔离,然而实际情况并非如此,首先软件编程上完全按照分层模型来做编程效率会降低,与其分层,不如按功能实现来模块化。其次,对于许多功能实现来说,必须实现两层子间的交互,这又违背了当初的出发点,比如链路层在成帧时需要接收端的物理地址,该地址必须由网络层处理ARP地址解析才行,简单地将ARP放在那一层都有些牵强。所以说,分层模型对于理解网络的抽象性是有益处的,它有助于指导网络入门,但并不是网络的精髓,只有结合具体的系统分析才有实际意义。
在发送端,数据由应用产生,它被封装在传输层的段中,该段再封装到网络层报文包中,网络层报文包再封装到数据链路帧,以便在所选的介质上传送。当接收端系统接收到数据时,是解封装过程。当数据沿着协议栈向上传递时,首先检查帧的格式,决定网络类型,去掉帧的格式,检查内含的报文包,决定传输协议。数据由某个传输层处理,最后数据递交给正确的应用程序。
应用层
在应用层包含了不同类型的应用进程,如:telnet远程登录、FTP文件传输等。
传输层
传输层主要为两台主机上的应用程序提供端到端的通信服务。在TCP/IP协议族中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小数据块(数据段)交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时间等。由于传输层提供了高可靠性的端到端的通信服务,因此应用层可以忽略掉所有这些细节。
而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。
这两种传输层协议分别在不同的网络环境与应用场合中有不同的用途。
TCP和UDP采用16 bit的端口号来识别不同的应用程序。
网络服务一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务的TCP端口号都是21,每个Telnet服务的TCP端口号都是23,每个TFTP(简单文件传送协议)服务的UDP端口号都是69。任何TCP/IP实现所提供的服务都使用知名的1~1023之间的端口号。这些知名端口号由Internet号码分配机构(Internet
Assigned Numbers Authority, IANA)来管理。现在IANA管理1~1023之间所有的端口号。
大多数TCP/IP实现给临时端口分配1024~5000之间的端口号。大于5000的端口号是为其他服务(Internet上并不常用的服务)预留的。
如果仔细检查这些标准的简单服务以及其他标准的TCP/IP服务(如Telnet、FTP、SMTP等)的端口号时,我们发现它们都是奇数。这是因为这些端口号都是从NCP端口号派生出来的(NCP,即网络控制协议,是ARPANET的传输层协议,是TCP的前身)。NCP是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的传输层协议时,每个应用程序只需要一个端口号,因此就使用了NCP中的奇数。
TCP首部的数据格式,如果不计任选字段,它通常是20个字节。
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32
bit的无符号数。
当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(Initial
Sequence Number)。因为SYN标志消耗了一个序号,该主机要发送数据的第一个字节序号为这个ISN加1。
确认序号包含发送确认的一端所期望收到的下一个序号。确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
发送ACK无需任何额外代价,因为32 bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
在TCP首部中有6个code bits 中的多个可同时被设置为1。含义如下:
URG紧急指针(urgent pointer)有效. ACK确认序号有效。 PSH接收方应该尽快将这个报文段交给应用层。
RST重建连接。 SYN同步序号用来发起一个连接。 FIN发端完成发送任务。
TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,窗口大小是一个16 bit字段,因而窗口大小最大为65535字节。
检验和覆盖了整个的TCP报文段:包括了TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
HOSTA对HOSTZ进行TELNET远程连接,其中目的端口号为知名端口号23,源端口号为1028。源端口号没有特别的要求,只需保证该端口号在本机上是唯一的就可以了。一般从1023以上找出空闲端口号进行分配。源端端口号又称作临时端口号,这是因为源端口号存在时间很短暂。
这是同一主机上多个应用进程同时访问一个服务的示例。HOST A上具有两个连接同时访问HOST Z的TELNET服务,HOST
A使用不同的源端口号来区分本机上的不同的应用程序进程。
IP地址和端口号用来唯一地确定数据通讯的连接。
序列号的作用:一方面用于标识数据顺序,以便接收者在将其递交给应用程序前按正确的顺序进行装配;另一方面是消除网络中的重复报文包,这种现象在网络拥塞时会出现。
确认号的作用:接收者告诉发送者哪个数据段已经成功接收,并告诉发送者接收者希望接收的下一个字节。
TCP三次握手/建立连接
TCP是面向连接的传输层协议,所谓面向连接就是在真正的数据传输开始前要完成连接建立的过程,否则不会进入真正的数据传输阶段。
TCP的连接建立过程通常被称为三次握手(three-way handshake),过程如下:请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN)。这个SYN段为报文段1。
服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。 这三个报文段完成连接的建立。
发送第一个SYN的一端将执行主动打开(active open)。接收这个SYN并发回下一个SYN的另一端执行被动打开(passive
open)
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。RFC
793 [Postel1981c]指出ISN可看作是一个32比特的计数器,每4 ms加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。
如何进行序号选择? 在4.4 BSD(和多数的伯克利的实现版)中,系统初始化时初始的发送序号被初始化为1。这个变量每0.5秒增加64000,并每隔9.5小时又回到0。另外,每次建立一个连接后,这个变量将增加64000。
TCP四次握手/终止连接
一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独进行关闭。当一方完成它的数据发送任务后就发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。所以TCP终止连接的过程需要四个过程,称之为四次握手过程。
窗口实际上是一种流量控制的机制。
当窗口尺寸是1时,发送一个数据段后必须等待确认才可以发送下一个数据段,好处是在接收端接收的数据段顺序不会出错,缺点是传输速度慢,效率低。
利用大于1的窗口,可以同时发送几个数据包。当确认返回时,则发送新数据段。在这种方式下,可以提高传输效率。一个经过仔细调整的滑动窗口协议可以保持网络始终充满数据包,并且可以得到较高的吞吐量。
其优点是传输速度快,效率高;缺点是由于TCP靠IP传输数据,而IP在传输过程中可能会选择不同的路径而导致在接收端接收的数据段顺序混乱。
UDP用户报文协议
UDP是一个简单的面向数据报的传输层协议,UDP不提供可靠性,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。
两个传输层协议TCP与UDP具有不同的特点,适合在不同的网络环境及不同的应用需求中使用。
网络层
网际协议(IP)在RFC 971中定义,它同时被TCP和UDP使用,处于OSI参考模型的网络层。IP可以被认为是将数据包从一个主机移动到另一个主机的传递机制。因为它处理传递,它必须提供寻址功能。IP提供3种主要的功能:
无连接的,不可靠的传递服务
数据包分段和重组
路由功能
ICMP(Internet互连网控制报文协议)是IP协议的附属协议,主要被用来与其他主机或路由器交换错误报文和其他重要信息。尽管ICMP主要被IP使用,但应用程序也可以访问它,例如我们常用的两个诊断工具ping和traceroute,都使用了ICMP协议。
ARP(地址解析协议)和RARP(反向地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
IP数据包中包含的主要部分如下:
版本:目前的协议版本号是4,因此IP有时也称作I P v 4。- iOS现已支持IPV6
首部长度:首部长度指的是IP包头中32 bit的数量,包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节。普通IP数据报(没有任何选择项)字段的值是5,即长度20个字节。
服务类型(TOS)字段:包括一个3 bit的优先权子字段,4 bit的TOS子字段和1 bit未用位但必须置0的子字段。4
bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置其中1 bit。如果所有4
bit均为0,那么就意味着是一般服务。现在大多数的TCP/IP实现都不支持TOS特性,但是自4.3BSD
Reno以后的新版系统都对它进行了设置。另外,新的路由协议如OSPF和IS-IS都能根据这些字段的值进行路由决策。
总长度字段:指整个IP数据包的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节。尽管可以传送一个长达65535字节的IP数据包,但是大多数的链路层都会对它进行分片。总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据包的内容。
标识字段:唯一地标识主机发送的每一份数据包。通常每发送一份报文它的值就会加1样,物理网络层一般要限制每次发送数据帧的最大长度。IP把MTU与数据包长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。把一份IP数据包分片以后,只有到达目的地才进行重新组装。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对传输层(TCP和UDP)是透明的,即使只丢失一片数据也要重传整个数据包。
已经分片过的数据包有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和重新组装提供了足够的信息。
对于发送端发送的每份IP数据包来说,其标识字段都包含一个唯一值。该值在数据包分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”除了最后一片外,其他每片都要把该比特置1。
片偏移字段指的是该片偏移原始数据包开始处的位置。当数据包被分片后,每个片的总长度值要改为该片的长度值。标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片,在网络传输过程中如果遇到链路层的MTU小于数据包的长度时将数据包丢弃并发送一个ICMP差错报文。
TTL(time-to-live)生存时间:该字段设置了数据包可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
协议字段:根据它可以识别是哪个协议向IP传送数据。
首部检验和字段:根据IP首部计算的检验和码。它不对首部后面的数据进行计算。因为ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据效验和码。
每一份IP数据报都包含32 bit的源IP地址和目的IP地址。
最后一个字段是任选项,是数据包中的一个可变长的可选信息。这些任选项定义如下:
安全和处理限制(用于军事领域,详细内容参见RFC 1108[Kent 1991])
记录路径(让每个路由器都记下它的IP地址)
时间戳(让每个路由器都记下它的IP地址和时间)
宽松的源站选路(为数据报指定一系列必须经过的IP地址)
严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。
这些选项很少被使用,并非所有的主机和路由器都支持这些选项。选项字段一直都是以32 bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32
bit的整数倍。
最后是上层的数据,比如TCP或UDP的数据段。
由于TCP、UDP、ICMP和IGMP及一些其他的协议都要利用IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明其承载的数据属于哪一类。为此,IP在首部中存入一个长度为8
bit的数值,称作协议域。
其中1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议。
ICMP是一种集差错报告与控制于一身的协议。在所有TCP/IP主机上都可实现ICMP。ICMP消息被封装在IP数据报里,ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。
常用的“ping”就是使用的ICMP协议。“ping”这个名字源于声纳定位操作,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回应请求报文给主机,并等待返回ICMP回应应答。一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主机。反过来,如果不能Telnet到某台主机,那么通常可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。
然而随着Internet安全意识的增强,出现了提供访问控制列表的路由器和防火墙,那么像这样没有限定的断言就不再成立了。一台主机的可达性可能不只取决于IP层是否可达,还取决于使用何种协议以及端口号。
数据链路层协议如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的。当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48
bit的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。
ARP协议需要为IP地址和MAC地址这两种不同的地址形式提供对应关系。
ARP过程如下:ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,ARP请求数据帧中包含目的主机的IP地址,其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。
连接到同一LAN的所有主机都接收并处理ARP广播,目的主机的ARP层收到这份广播报文后,根据目的IP地址判断出这是发送端在寻问它的MAC地址。于是发送一个单播ARP应答。这个ARP应答包含IP地址及对应的硬件地址。收到ARP应答后,发送端就知道接收端的MAC地址了。
ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近IP地址到硬件地址之间的映射记录。当主机查找某个IP地址与MAC地址的对应关系时首先在本机的ARP缓存表中查找,只有在找不到时才进行ARP广播。
具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址。但是无盘工作站或被配置为动态获取IP地址的主机则需要采用其他方法来获得IP地址。
RARP实现过程是主机从接口卡上读取唯一的硬件地址,然后发送一份RARP请求(一帧在网络上广播的数据),请求某个主机(如DHCP服务器或BOOTP服务器)响应该主机系统的IP地址。
DHCP服务器或BOOTP服务器接收到了RARP的请求,为其分配IP地址等配置信息,并通过RARP回应发送给源主机。
|