TCPIP协议规范及UIP处理流程.docx
《TCPIP协议规范及UIP处理流程.docx》由会员分享,可在线阅读,更多相关《TCPIP协议规范及UIP处理流程.docx(46页珍藏版)》请在冰豆网上搜索。
TCPIP协议规范及UIP处理流程
简要历史
1973年,ARPANET核心组成员VintCerf和BobKahn发表了一篇里程碑论文,阐述了实现分组的端到端交付的协议。
这篇关于传输控制协议(TCP)的论文包括:
封装、数据报,以及网关的功能。
后来,TCP被划分为两个协议:
传输控制协议(TCP)和网际互联协议(IP)。
IP处理数据报的路由选择,而TCP负责高层的一些功能,如分段、重装和差错检测。
这个用来进行网际互联的协议后来就被称为TCP/IP。
TCP/IP协议族
简介
TCP/IP协议族由5层组成:
物理层、数据链路层、网络层、运输层和应用层。
前四层与OSI模型的前四层相对应,提供物理标准、网络接口、网际互联、以及运输功能。
而应用层与OSI模型中最高的三层相对应。
TCP/IP协议族中的各层包含了一些相对独立的协议。
在物理层和数据链路层,TCP/IP并没有定义任何协议。
在网络层TCP/IP支持网际互联协议(IP),而IP又由四个支撑协议组成:
ARP、RARP、ICMP和IGMP。
在传统上,TCP/IP协议族在运输层有两个运输协议:
TCP和UDP,然而现在已经设计出一个新的运输层协议SCTP以满足新的应用的需要。
IP是主机到主机的协议,即把分组从一个物理设备交付到另一个物理设备。
UDP和TCP是运输机协议,负责把报文从一个进程(运行着的程序)交付到另一个进程。
编址
使用TCP/IP协议的互联网使用3个等级的地址:
物理(链路)地址、逻辑(IP)地址以及端口地址。
每一种地址属于TCP/IP体系结构中的特定层。
物理地址
物理地址也叫链路地址,是结点的地址,由它所在的局域网或广域网定义。
物理地址包含在数据链路层使用的帧中。
以太网的地址是6字节(48位)长,通常用十六进制记法,如:
07:
01:
02:
01:
2C:
4B。
以太网的地址共3种:
单播、多播和广播。
在单播地址中的第一个字节的最低位0;在多播地址中的第一个字节的最低位是1。
广播地址是48个1。
逻辑地址
因特网的逻辑地址是32位地址,可以用来标志连接在因特网上的每个主机。
在因特网上没有两个主机有相同的IP地址。
同样,逻辑地址也可以是单播地址、多播地址和广播地址。
Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。
把所有IP地址分为五类,如下图1所示:
图2-1
A类到
B类到
C类到
D类到
E类到
在分类编址的A类、B类、C类地址中,IP地址可划分为net-id(网络标识)和host-id(主机标识)。
对于A类地址,1字节定义net-id而3字节定义host-id。
对于B类地址,2字节定义net-id,2字节定义host-id。
对于C类地址,3字节定义net-id而1字节定义host-id。
D类地址和E类地址不划分net-id和host-id。
网络地址是一个地址块的第一个地址,向因特网的其余部分定义这个网络。
路由器就是根据网络地址来选择分组的路由。
若给出网络地址,我们就能够找出这个地址的类别、地址块以及这个地址块的地址范围。
这种划分方案有很大的局限性,它对网络的划分是flat的而不是层级结构(hierarchical)的。
Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。
于是提出了新的划分方案,称为CIDR(ClasslessInterdomainRouting)。
网络号和主机号的划分需要用一个额外的子网掩码(subnetmask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为Classless的。
这样,多个子网就可以汇总(summarize)成一个Internet上的网络。
IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。
IP地址和子网掩码还有一种更简洁的表示方法,例如/24,表示IP地址为,子网掩码的高24位是1,也就是。
目的地址为,表示本网络内部广播,路由器不转发这样的广播数据包。
目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址表示广播至网络(假设子网掩码为)。
端口地址
计算机是多进程设备,即可以在同一时间运行多个进程。
因特网通信的最终目的是使一个进程能够和另一个进程通信。
为了能够同时发生这些事情,需要有一种方法对不同的进程打上标号,就是说这些进程需要地址。
在TCP/IP体系结构中,给一个进程指派的标号叫做端口地址。
TCP/IP中的端口地址是16位长,通常用10进制数表示。
分层数据包介绍
以太网帧
图2-2
目的地址(DA)DA字段有6字节,是下一站的物理地址(也叫MAC地址)。
源地址(SA)SA字段有6字节,是前一站的物理地址。
类型类型字段有三种值,分别对应IP、ARP、RARP。
数据携带从上层协议封装起来的数据。
它的最小长度是46字节,最大长度是1500字节。
ARP、RARP的数据包长度不够46字节,要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),如果一个数据包从以太网路由到链路上,数据包的长度大于链路的MTU了,则需要对数据包进行分片
CRC差错检测信息,4字节。
ARP报文格式
图2-3
如上图3所示,ARP分组的格式如下:
硬件类型16位字段,用来定义运行ARP的链路层网络的类型。
以太网是类型1。
协议类型16位字段,指要转换的地址类型。
0x0800位IP地址。
硬件长度8位字段,定义以字节为单位的物理地址长度。
对以太网这个值为6。
协议长度8位字段,定义以字节为单位的逻辑地址长度。
对IPv4协议这个值是4。
操作16位字段,定义分组的类型。
为1表示ARP请求,为2表示ARP应答。
发送端硬件地址可变长度字段,定义发送端的物理地址。
发送端协议地址定义发送端的逻辑地址。
目标硬件地址定义目标的物理地址。
对于ARP请求报文,这个字段是全0,因为发送端不知道目标的物理地址。
目标协议地址定义目标的逻辑(如,IP)地址。
IP数据报格式
图2-4
如上图4所示,IP数据报的结构包括:
版本(VER)这个4位字段定义IP协议的版本。
首部长度(HLEN)这个4位字段定义IP首部总长度,以4字节为单位计算。
当没有选项时,首部长度是20字节,这个字段的值是5(5*4=20)。
当选项字段位最大值时,这个字段的值是15(15*4=60)。
服务类型(DS)TOS位是4位子字段,共有5种不同的服务类型。
总长度这个16位字段定义了以字节计的数据报总长度(首部加上数据)。
要找出上层传来的数据长度,可以从总长度减去首部长度。
总长度字段是16位,因此IP数据报的长度限制是65535(216-1)字节。
标识(Identification)这个16位字段与源IP地址一起唯一地定义这个数据报。
IP协议使用一个计数器来标志数据报,当IP协议发送数据时,就把这个计数器的当前值复制到标识字段中,并加1。
当数据报被分片时,标识字段的值就复制到所有的分片中。
换言之,所有的分片具有相同的标识号,即原始数据报的标识号。
在终点重装数据报时,终点就知道所有具有相同标识号的分片必须组装成一个数据报。
标志(Flags)3位字段。
第一位保留。
第二位为不分片位,为1表示不对数据报进行分片;为0表示在需要时对数据报进行分片。
第三位为分片位,为1表示这个数据报不是最后的分片,在其后还有分片;为0表示这个数据报是最后的分片。
分片偏移(FragmentOffset)这个13位字段表示该分片在整个数据报中的相对位置,以8字节为度量单位。
生存时间(TTL)用来控制数据报所通过的最大路由跳数,这个生存时间的单位不是秒,而是跳(hop)。
协议这个8位字段定义使用IP层服务的高层协议。
如:
TCP、UDP、ICMP和IGMP等。
检验和IP分组中的检验和只在首部而不在数据部分进行。
因为,所有将数据封装在IP数据报中的高层协议,都有覆盖整个分组的检验和;其次,,每经过一个路由器,IP数据报的首部就要改变一次,但数据部分不变。
因此检验和只对发生变化的部分进行检验。
源地址这个32位字段定义源点的IP地址。
在IP数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。
目的地址这个32位字段定义了终点的IP地址。
在IP数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。
ICMP报文格式
类型8位字段,定义ICMP报文的类型。
ICMP报文的类型有:
终点不可达、源点抑制、超时、参数问题、改变路由、回送请求或回答、时间戳请求或回答、地址掩码请求或回答、路由器询问和通告。
代码8位字段,指明了发送这个特定报文类型的原因。
检验和(icmpchksum)16位字段。
在ICMP中,检验和的计算覆盖了整个报文(首部和数据)。
ICMP回送请求或回答报文头格式如下图5所示:
图2-5
ICMP终点不可达报文头格式如下图6所示:
图2-6
ICMP超时报文头格式如下图7所示:
图2-7
IGMP报文格式
图2-8
类型8位字段,定义了查询、成员关系报告、退出报告三种报文类型,类型值分别为0x11、0x16、0x17。
最大响应时间8位字段,定义了查询必须在多长时间内回答。
它的值以十分之一秒位单位。
在查询报文中这个值不是零,但在其他两种报文中则置为零。
检验和16位字段,检验和在8字节的报文上计算。
组地址在一般查询报文中这个字段的值为0,在特殊查询报文、成员关系报告报文以及退出报告报文中定义groupid(组多播地址)。
UDP用户数据报首部格式
图2-9
UDP数据报格式如上图9所示。
用户数据报有8个字节的固定首部。
源端口号16位字段,定义源主机上运行的进程所使用的端口号。
目的端口号16位字段,定义目的主机上运行的进程使用的端口号。
长度16位字段,定义了用户数据报的总长度,首部加上数据。
检验和16位字段,UDP的检验和包括三部分:
伪首部、UDP首部以及从应用层来的数据。
位首部是IP分组的首部的一部分,包括:
源IP地址、目的IP地址、8位协议和16位UDP总长度。
位首部可以保证在IP首部受到损伤时,用户数据报可以交付到正确的主机。
协议字段的加入,可以确保这个分组是属于UDP而不是属于TCP。
TCP报文段格式
图2-10
如上图10所示,TCP报文段的结构包括:
源端口地址这个16位字段定义发送报文段的应用程序端口号。
目的端口地址这个16位字段定义了接收该报文段的应用程序端口号。
序号这个32位字段定义了指派给本报文段第一个数据字节的一个号。
为了保证连通性,要发送的每一个字节都要编号。
序号告诉终点,这个序列中的哪一个字节是报文段中的第一个字节。
在连接建立时,每一方使用随机数产生器产生初始序号(ISN)。
确认号32位字段,定义了报文段接收端期望从对方接收的下一个序号。
如果报文段的接收端成功地发送了对方发来的序号x,它就把确认号定义为x+1。
首部长度(tcpoffset)4位字段,指出TCP首部共有多少个4字节字。
即TCP数据在IP数据中的偏移大小。
同IP首部长度,可以在5至15之间。
保留位该6位字段留待今后使用。
控制/标志位该字段定义了6种不同的控制位或标志,在同一时间可设置一位或多位标志。
表2-1控制字段各标志说明(从高位到低位)
紧急指针字段值有效
确认字段值有效
推送数据
连接必须复位
在连接建立时对序号进行同步
终止连接
窗口值该字段定义接收方必须维持的窗口值(以字节为单位)。
注意,该字段是16位长,因此窗口值的最大长度为65535字节。
这个值由接收端来确定,发送端必须服从接收端的决定。
检验和这个16位字段包含检验和,TCP使用检验和是强制性的。
紧急指针当紧急标志位置位时,这个16位字段才有效,这时的报文段中包括紧急数据。
紧急指针定义了一个数,把这个数加到序号上就得出报文段数据部分中最后一个紧急字节。
选项包括无操作(NOP)、最大报文段长度(MSS)、窗口扩大因子、时间戳等。
分层协议讲解
总的来说,TCP/IP协议的多路选择过程可以表示为下图2-11:
图2-11
ARP和RARP
地址解析协议ARP
在任何时候,当主机或路由器有数据报要发送给另一个主机或路由器时,它必须有接收端的逻辑(IP)地址。
但是IP数据报必须封装成帧才能通过物理网络。
这就表示,发送端必须有接收端的物理地址,因此需要有从逻辑地址到物理地址的映射。
地址解析协议(ARP)用来把IP地址与其物理地址联系起来。
任何时候当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它就发送ARP查询分组。
这个分组包括发送端的物理地址和IP地址,以及接收端的IP地址。
因为发送端不知道接收端的物理地址,查询就在网络上广播。
例如,数据包要发送给IP地址为的主机,过程如下:
源主机发出ARP请求,询问“IP地址是的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:
FF:
FF:
FF:
FF:
FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
ARP报文格式如前所述。
ARP软件包由5个构件组成:
高速缓存表:
每台主机都维护一个ARP高速缓存表,由于高速缓存表的空间非常有限,所以缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
队列:
队列用来在ARP试图解析硬件地址时保留IP分组。
输出模块把未解析的分组发送到相应的队列,输入模块从一个队列中拿走一个分组,并连同解析出的物理地址一同发送给数据链路层来传输。
输出模块:
输出模块从IP软件等待IP分组。
输出模块检查高速缓存表,寻找是否有某个项目对应于这个分组的目的IP地址。
这个IP分组的目的IP地址必须与这个项目的协议地址相匹配。
输入模块:
输入模块一直等待,直到有ARP分组到达。
检查高速缓存表,寻找对应这个ARP分组的项目。
输入模块设置这个项目的超时时间TIME-OUT。
若队列为空,则从相应队列中把分组一个接一个地取出,连同其硬件地址一起交给数据链路层来处理。
高速缓存控制模块:
负责维护高速缓存表,它周期性地逐项检查高速缓存表,判断有哪些项目到期,哪些队列需要撤销。
逆地址解析协议RARP
当一个主机知道自己的物理地址时,RARP可用来找出其逻辑地址。
每一个主机或路由器都被指派一个或多个逻辑地址,这些地址与机器的物理地址无关。
要创建IP数据报,主机或路由器要知道它自己的IP地址。
可以使用RARP协议从物理地址得到逻辑地址。
知道物理地址后,先创建RARP请求,并在本地网络上广播。
在本地网络上的另一个机器知道所有的IP地址,它就用RARP回答来响应。
请求的机器必须运行RARP客户程序;而响应的机器必须运行RARP服务器程序。
IP协议
IP数据报的格式如前所述。
IP是不可靠的无连接协议,负责源点到终点的交付。
在IP层的分组叫做数据报。
数据链路层有自己的帧格式,在这个格式中有一个字段是“数据字段最大长度”。
当数据报封装成帧时,数据报的总长度必须小于这个数据字段最大长度(MTU)。
对数据报进行分割,叫做分片。
源站通常不对IP分组进行分片。
运输层会进行分片工作,把数据划分成IP和在使用的数据链路层都可能接纳的大小。
数据报在到达终点之前可以经过多次分片,可以被源主机或在其路径上任何路由器进行分片。
然而数据报的重组却只能在目的主机上进行。
在IP分组中的检验和只在首部而不在数据部分心进行。
因为,首先所有将数据封装在IP数据报中的高层协议,都有覆盖整个分组的检验和;其次,每经过一个路由器,IP数据报的首部就要改变一次,但数据部分不变。
因此检验和只对发生变化的部分进行检验。
IP软件包包括8个构件:
首部添加模块、处理模块、转发模块、分片模块、重装模块、路由表、MTU表以及重装表,还有输入和输出队列。
首部添加模块,从高层协议接收数据(连同其IP地址),添加IP首部后,把数据封装成IP数据报。
处理模块,从一个接口或从首部添加模块接收数据报,首先检查数据报是否为回环地址,还是这个分组已到达最后终点。
输入队列把从数据链路层或从高层协议发来的数据存放起来。
输出队列把要发送到数据链路层或高层协议的数据报存放起来,处理模块从中取出数据报,分片和重装模块则把这个数据报加入输出队列中。
路由表是在转发模块中使用的,用来确定分组的下一跳地址。
分片模块从转发模块接收IP数据报。
转发模块给出IP数据报、下一站的IP地址。
以及发送这个数据报所必须通过的接口号。
分片模块使用MTU表以便找出对于特定接口的最大传送单元MTU。
若数据报的长度大于MTU,则分片模块对数据报进行分片,为每一个分片添加首部,并把它们发送到ARP软件包进行地址解析和交付。
重装模块从处理模块接收已到达最终目的地的数据报分片。
重装模块将未分片的数据报看成是属于仅有一个分片的数据报。
使用重装表找出一个分片是属于哪一个数据报,将属于同一个数据报的各分片进行排序,并在所有分片到达时把它们重新组装成一个数据报。
ICMP协议
IP协议没有差错报告或差错纠正机制和管理查询机制。
网际控制报文协议(ICMP)就是为了补偿这两个缺点而设计的。
它是配合IP协议使用的。
ICMP本身是网络层协议,但是它的报文不是如设想的那样直接传送给数据链路层,而是首先要封装成IP数据报,再传送给下一层。
在IP数据报中的协议字段值是1就表示其IP数据是ICMP报文。
ICMP报文类型如下表2-2所示:
表2-2ICMP报文类型
ICMP报文分为两大类:
差错报告报文和查询报文。
报文格式如前所述。
差错报告报文
差错报告报文报告当路由器或主机在处理IP数据报时可能遇到的一些问题。
ICMP不能纠错,只能报告差错,差错纠正留给高层协议去做。
ICMP总是使用源IP地址把差错报文发送给数据报的源点。
一共有5种差错可处理:
终点不可达、源点抑制、超时、参数问题以及改变路由。
●终点不可达报文
当路由器不能够给数据报找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后这个路由器或主机就向发出这个数据报的源主机发回终点不可达报文。
●源点抑制
ICMP的源点抑制报文就是为了给IP增加一种流量控制而设计的。
当路由器或主机因拥塞而丢弃数据报时,它就向数据报的发送端发送源点抑制报文。
目的有二:
第一,通知源点,数据报已被丢弃。
第二,它警告源点,在路径中的某处出现了拥塞,因而源点需放慢发送过程。
注意,必须为每一个丢弃的数据报向源点发送源点抑制报文。
●超时
超时有两种情况:
第一,当路由器接收到生存时间字段值为零的数据报时,就丢弃这个数据报,并向源点发送超时报文;第二,当最后的终点在规定时间内没有收到所有的分片时,就丢弃已收到的分片,并向源点发送超时报文。
●参数问题
如果路由器或主机在数据报的首部中发现任何二义性,或在数据报的某个字段中缺少了某个值,就丢弃这个数据报,并发送参数问题报文。
●改变路由
路由器的路由选择是动态的,而主机为了提高效率,通常使用静态路由选择。
当主机开始连网工作时,其路由表中的项目数很有限。
它通常只知道默认路由器这一个路由器的IP地址,因此主机有可能会把某个数据报发送给一个错误的路由器。
此时,收到这个数据报的路由器会把数据报转发给正确的路由器,并向主机发送改变路由报文,以更新主机中的路由表。
查询报文
查询报文都是成对出现的。
在这种类型的ICMP报文中,一个结点发送报文,然后由目的结点用特定的格式进行回答。
●回送请求和回答报文
为诊断目的而设计的。
主机或路由器可以发送回送请求报文给另一个主机或路由器。
收到回送请求报文的主机或路由器产生回送回答报文,并将其返回给原来的发送者。
回送请求和回答报文可用来确定是否在IP这级能够通信。
还可由主机使用,以检查另一个主机是否可达。
在用户级,调用分组因特网搜寻器(ping)命令可做到这点。
●时间戳请求和回答
两个机器可使用时间戳请求和回答来确定IP数据报在这两个机器之间来往所需的往返时间。
●地址掩码请求和回答
主机通过向局域网上的路由器发送地址掩码请求报文来获得自己的掩码。
若主机知道这个路由器的地址,则直接将请求发送给该路由器,若主机不知道,则广播这个请求报文。
路由器收到地址掩码请求报文,就以地址掩码回答报文进行响应,向主机提供所需的掩码。
●路由询问和通告
主机若想把数据发送给另一个网络上的主机,就需要知道连接到该网络上的路由器的地址。
此外,这个主机还需要知道这些路由器是否正常工作。
就可以通告路由询问和通告报文。
主机把路由器询问报文进行广播,收到询问的路由器就使用路由通告报文广播其路由选择信息。
路由器发送通告报文时,不仅通告自己的存在,而且通告了它所知道的所有在这个网络上的路由器。
在ICMP中,检验和的计算覆盖了整个报文(首部和数据)。
网际组管理协议(IGMP)
网际组管理协议(IGMP)是与多播有关的一个必要的但不是充分的协议。
IGMP并不是多播路由选择协议,而是个管理组成员关系的协议。
每当主机需要加入或离开某个特定的多播群组时,该协议允许该主机去通知邻近的路由器。
该协议只用在主机与路由器之间的网络上。
而且,协议只把计算机(不是应用进程)定义为群组成员。
如果在一个给定计算机上有多个进程要加入到一个多播群组,计算机必须要把接收到的每个数据报复制多个副本给每个进程。
只有当最后一个进程离开群组时,计算机才利用IGMP通知本地的路由器,表明它不再是群组的成员了。
IGMPv2有3种报文类型:
查询、成员关系报告和退出报告。
IGMP可分为两个阶段:
第一阶段:
当某个主机加入新的多播组时,该主机应向组播组的多播地址发送一个IGMP报文,声明自己要成为该组的成员。
本地的多播路由器收到IGMP报文后,将组成员关系转发给因特网上的其他多播路由器。
第二阶段:
因为组成员关系是动态的,因此本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还连续是组的成员。
只要对某个组有一个主机响应,那么多播路由器就认为这个组是活跃的。
但一个组在经过多次的探询后仍然没有一个主机响应,则多播路由器就认为本网络上的主机已经都离开这个组了因此就不再将该组的成员关系转发给其他的多播路由器。
IGMP报文格式如前所述。
IGMP协议的优点:
●主机和多播路由器的所有通信使用IP多播,只要有可能,携带IGMP报文的数据报都使用硬件多播来传送。
●多播路由器在探询组成员关系时,只需要对所有多播组只发一个查询,而不是对每一个组发送一个查询,默认125S一次。
用户数据报(UDP)
UDP数据报的格式如前所述。
UDP位于应用层和IP层之间,作为应用程序和网络操作的中介物。
IP是负责在计算机级的通信(主机到主机的通信),作为网络层协议,IP只能把报文交付给目的主机。
但是,这是一种不完整的交付。
这个报文还必须送交到正确的进程。
UDP就是负责把报文交付给适当的进程。
完成进程到进程的通信最常用的方法是通过客户-服务器范例。
在本地主机上叫做客户的进程主动发起请求,远程主机上叫做服务器的