TCP/IP协议族简介
一.OSI网络分层介绍
1.OSI网络分层结构
IOS/OSI7层结构:
-
物理层(Physical Layer) : 规定了物理线路和设备的触发、维护、关闭物理设备的机械特性、电气特性、功能特性和过程,为上层的传输提供了一个物理介质,本层是通信端点之间的硬件接口。本层中数据传输的单位为比特(b)。属于本层定义的规范有EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等,实际使用中的设备如网卡等属于本层。
-
数据链路层(Data Link Layer) : 数据链路层在物理介质基础之上提供可靠的数据传输,在这一层利用通信信道实现无差错传输,提供物理地址寻址、数据层帧、数据的检测重发、流量控制和链路控制等功能。在数据链路层中数据的单位为帧(frame)。属于本层定义的规范有SDLC、HDLC、PPP、STP、帧中继等,实际中的MAC属于本层。
-
网络层(NetWork Layer) : 网络层负责将各个子网之间的数据进行路由选择,将数据从一 个主机传送到另一 个主机,其功能包括网际互联、流量控制和拥塞控制等。在本层中数据的单位为数据包(packet)。属于本层定义的规范有IP、IPX、 RIP、OSPF等,实际中的路由器属于本层。
-
传输层(Transport Layer) : 传输层将上层的数据处理为分段的数据,提供可靠或者不可靠的传输,为上层掩盖下层细节,保证会话层的数据信息能够传送到另一方的会话层(但不一定传送到另一方的应用层)。在传输层中数据的单位为数据段(segment)。属于本层定义的规范有TCP、UDP、SPX等。
-
会话层(Session Layer) : 会话层管理主机之间的会话过程,包括会话的建立、终止和会话过程中的管理,来提供服务请求者和提供者之间的通信。属于本层定义的规范有TCP、UDP、SPX等。
-
表示层(Presentation Layer) : 表示层对网络传输的数据进行变换,使得多个主机之间传送的信息能够互相理解,包括数据的压缩、加密、格式的转换等,例如图片数据的发送前压缩和接收后的解压。属于本层定义的有ASCII、JPEG、MPEG等标准。
-
应用层(Application Layer) : 应用层为应用程序提供访问网络服务的接口,为用户提供常用的应用,例如经常使用的电子邮件应用程序、网络浏览器等都基于本层、在本层之上定义。属于本层定义的规范有Telnet、FTP、HTTP、SNMP、P2P等应用层协议。
-
OSI的7层结构的底三层(物理层、数据链路层和网络层)构成了通信子网层,为网络的上层提供通信服务。
-
OSI模型并不是网络结构,因为没有定义每个层所拥有的具体服务和协议,只是告诉每一层做什么工作。
- OIS为所有的层次提供了标准,每个标准都有自己的内部定义。
-
2.OSI参考模型中的数据传输
下图表示主机A上的应用程序,通过网络发送数据到主机B的应用程序,数据流通过在主机A由上而下依次通过网络协议栈,通过网络发送给主机B,在主机B上又自下而上地通过OSI的7层协议结构。
主机A过程是一个封装过程,数据从应用程序依次经过应用层、表示层、会话层、传输层、网络层、数据链路层和物理层发送给主机B:
-
当主机A的应用程序需要发送数据时,数据由应用程序调用应用层接口,进入协议栈的应用层。
-
在网络协议栈的应用层,应用程序将要发送的应用程序数据被协议栈加上应用层的报头,包装成形成应用层协议数据单元,然后将数据传递给协议栈中应用层的下一层:表示层。
-
在表示层,它不关心应用层传递过来的数据内容,把应用程序发送的数据和网络协议栈应用层头部作为一 个整体进行处理,加上表示层的报头。然后,递交到下层会话层。
-
与表示层类似,在会话层、传输层、网络层、数据链路层协议栈分别将其上层传一递的数据加上自己的包头,然后,传递给自己层的下 层。即数据分别又加上会话层的报头、传输层的报头、网络层的报头和数据链路层的报头。在数据链路层,与其他层不 一 致的地方是还要加上一 个数据链路层的尾部,打包成一 个数据帧,然后,传递给物理层。数据链路层的尾部通常是数据的校验和,一般采用 CRC16的校验方式。
-
在物理层,主机A的网络设备将数据链路层传递过来的数据发送到网络上。主机 B 的过程与主机 A 相反,是一 个解封的过程,数据依次经过物理层、数据链路层、网络层、传输层、会话层、表示层和网络层,将主机 B 发送的数据接收和解包,最后数据传递给应用程序。
-
主机B的物理层网络设备接收到数据到来的信号后,将接受到的数据保存下来,然后传递给它的上一层:数据链路层。
-
数据链路层把从物理层获得的数据去掉头部和尾部后,进行数据校验,发现没有出错,把数据传递给其上一层:网络层。
-
与数据链路层类似,网络层、传输层、会话层、表示层、应用层分别将从其下层获得的数据 一 层层剥去报头,传递给对应的上一 层。
-
最后,主机A发送的数据到达主机B上的应用程序中。
二.TCP/IP协议栈
由于ISO制定的OSI参考模型过于庞大、复杂,在实现时造成很多困难。在实际实现中,TCP/IP协议栈获得了广泛的应用目前主流操作系统网络协议栈基本上采用TCP/IP协议栈。
1.TCP/IP协议栈参考模型
- TCP/IP 参考模型从上至下分为 4 个层次:应用层、传输层、网络互联层和主机到网络层。
-
与 OSI模型不同的是在 TCP/IP 参考模型中,根据实际情况将 OSI参考模型的会话层和表示层合并到应用层中;
- 同时,将 OSI参考模型中的数据链路层和物理层合并为主机到网络层。
-
TCP/IP 参考模型与 OSI参考模型的对照如下:
-
主机到网络层:包括设备和数据链路层的主机到网络层,在 TCP/IP 参考模型中并没有描述这一层的具体实现,只是规定能给其上一 层的网络互联层提供访问接口,可以传输 IP 数据包,这一 层的具体实现随着网络类型的不同而不同。
-
网络互联层:网络互联层是整个 TCP/IP 协议栈的核心。它将数据包进行分组并发往目的主机或者网络,为了尽快地发送分组,一个数据包的分组可能要经过不同的路径进行传递。这造成了分组之间到达目的网络或者主机的顺序不是原来发送分组的顺序,需要在本层对分组进行排序。网络互联层定义了数据包的分组格式和协议**-IP 协议 (Internet Protocol)** , 因此网络互联层又经常称为 IP 层。网络互联层的功能有路由、网际互联和拥塞控制等。
-
传输层:TCP/IP参考模型中传输层的功能提供源主机和目标主机上的对等层之间可以进行会话的机制。在传输层中定义了两种协议,传输控制协议(transmission control protocol, TCP)和用户数据报协议(user datagram protocol, UDP)。TCP协议是一 个面向连接的、可靠的协议。它利用IP 层的机制在不可靠连接的基础上实现可靠的连接,通过发送窗口控制、超时重发、分包等方法将一 台主机发出的字节流发往互联网上的其他主机。UDP协议是一 个不可靠的、无连接协议,主要适用于不怕数据丢失、不需要对报文进行排序、流量控制的场景。
-
应用层: TCP/IP参考模型中把OSI参考模型中的会话层和表示层取消,其功能被合并到应用层。基于TCP和UDP实现了很多的应用层协议,如基于TCP协议的文件传输协议(File Transfer Protocol, FTP)、Telnet协议、超文本链接协议(Hyper Text Transfer Protocol, HTTP)等,基于UDP的协议有简化的FTP协议TFTP、网络管理协议SNMP、域名服务DNS、网络文件共享NFS和SAMBA等,以及两种方式均有实现的协议,例如目前应用十分广泛的多种P2P协议(BitTorrent、 eMule等)。
注:IP层包含网际控制报文协议(ICMP)和地址识别协议,实际上它们并不是IP层的一部分,但直接同IP层一起工作。ICMP用于报告网络上的某些出错情况,允许网际路由器传输差错信息或测试报文。ARP处于IP和数据链路层之间,是在32位IP地址和48位局域网地址之间执行翻译的协议。
2.主机到网络层协议
-
通常主机到网络层的协议对应于OSI的数据链路层,对于硬件及其驱动层TCP/IP协议没有进行规范。由TCP/IP的4层结构可以看出,本层主要为IP协议和ARP协议提供服务、发送和接收网络数据报。
-
本层中由于要实现跨网和跨设备的互通,有很多的实现方式,例如串行线路(Serial Line IP, SLIP)、点对点PPP等,本书中仅对以太网的实现方式进行简单地介绍。
- 目前TCP/IP 技术主要基于以太网此标准。它采用一种带冲突检测的载波侦听多路接入的方法进行传输,即CSMA/CD (Carrier Sense, Multiple Access with Collision Detection)。
-
以太网的封包格式如下图所示,在IP数据的基础上增加了14个字节。
-
以太网用**48bit (6字节)**来表示源地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的MAC地址。
-
地址后面是两个字节的表示类型的字段,例如0800表示此帧的数据为IP数据,0806表示此帧为ARP请求。
-
类型字段之后是数据,对于以太网,规定数据段的大小范围是46个字节到1500个字节,不足的数据要用空字符填满。例如ARP协议的数据格式为28个字节,为了符合规范,其后有18个字节的占位符用于满足最少46字节的要求。
-
注:数据段的长度有一个最大值,以太网为 1500, 这个特性称为MTU(最大传输单元),如果IP层有一 个要传送的数据长度比MTU 大,在IP 层数据要进行分片,使得每个片都小于MTU。
-
CRC字段用于对帧内数据进行校验,保证数据传输的正确性,通常由硬件实现,例如在网卡设备中实现网络数据的CRC校验。
-
注:以太网的头部长度为14的特点在某些平台的实现上会造成效率上的问题,例如4字节对齐的平台,在取得IP数据的时候通常会重新复制
3.IP协议
IP协议是 TCP/IP 协议中最重要的协议,它为TCP、UDP、ICMP 等协议提供传输的通路。IP 层的主要目的是提供子网的互联,形成较大的网络,使不同的子网之间能传输数据。 IP层主要有如下作用。
-
数据传送:将数据从 一 个主机传输到另一 个主机。
-
寻址:根据子网划分和IP地址,发现正确的目的主机地址。
-
路由选择:选择数据在互联网上的传送路径。
-
数据报文的分段:当传送的数据大于MTU时,将数据进行分段发送和接收并组装。
IP数据格式如下,不包含选项字段,其头部的长度为20个字节:
①.版本
IP 协议的版本号,长度为4 位,规定网络所实现的IP 版本,例如,如果主机为IPv4协议,此字段的值为4, 而IPv6 协议此字段的值为6。
②.首部长度
首部长度指的是IP字段除去数据的整个头部的数据长度,以 32 位的字为单元计算。 IP首部的长度以字为增量变化,最短的IP头是 20 字节(不包括数据和选项)。因此这个字段最小值是 5(20 字节为 160 位,160 位/32 位=5) , 也就是5个32 位字长。由于它是一个4位的字段,所以IP 的首部最长为60 个字节 ( 15 个字乘以4) 。
③.服务类型
IP的服务类型字段长度为8位。此字段包含3位的优先权(现在已经忽略),4位的T服务类型子字段和 1位的保留位 (必须置0) 。4 位的服务类型分别为最小延迟 ( D ) 、最大吞吐量(T)、最高可靠性®、最小费用(F)。这4个位中最多只用一个位置 1, 如果全为0, 表示为一 般服务。服务类型的具体含义如下:
-
优先权字段3位,因此可以有0~7的值(0为正常值,7为网络控制,但是此字段目前已经被忽略)。它允许传输站点的应用程序设定向1P层发送数据报文的优先权。该字段与D、T、R、F相结合,确定应采取哪种路由方式。
-
D位字段为1个b长度,当值为1时表示请求低时延。
-
T位字段为1个b长度,当值为1时表示请求高吞吐量。
-
R位字段为1个b长度,当值为1时表示请求高可靠性。
-
F位字段为1个b长度,当值为1时表示请求低费用。
例如,如果IP分组有两个以上的路由方式可进行选择,路由器读取这些字段的值,根据服务类型的设置情况来选择一个合适的路由。服务类型字段由应用程序进行设置,路由器仅在必要时进行读取,不进行设置。
④.总长度
总长度字段的长度是16位,表示以字节为单位的数据报文长度,长度包含IP的头部和数据部分。利用头部长度和总长度字段可以计算1P数据报文中数据内容的起始地址和长度,由于本字段的长度为16位,所以IP数据报文最大可达到65535个字节的长度。
⑤.标识和片偏移
IP每发一份数据报文都会填写一个标识用来表示此数据包,发送完后此值会加1。在IP进行分片的时候,将标识复制的IP的头部表示数据报文的来源,还要加上分片数据在原数据报文中的偏移地址,便于之后进行组装。利用字段总长度和片偏移可以重新组装IP的数据报文。总长度指出原始包的总长度,片偏移指出该包位于正在组装的IP报文的偏移量,偏移量从头部开始计算。
⑥.生存时间(TTU)
TTL (Time To Live)字段的值表示数据报文最多可以经过的路由器的数量。它指定数据报文的生存时间,源主机发送数据时设置TTL(一般为32或者64),经过一个路由器后TTL的值减1。当TTL为0的时候,路由器丢弃此包,并发送一个ICMP报文通知源主机。 TTL的出现是由于在包的传递过程中可能会出现错误情况,引起包在Internet的路由器之间不断循环。为防止此类事件发生,因而引入了TTL限制报文经过路由器的个数。
⑦.协议类型
该字段为8位长度,表示IP上承载的是什么高级协议。在封包和解包的过程中,TCP/IP协议栈知道将数据发给哪个层的协议做相关的处理,协议的值及含义参见如下。例如,协议类型为6时,网络协议栈知道IP上承载的是TCP协议,IP层处理完毕后会交给其上一层协议中UDP和TCP中的TCP协议进行处理。
⑧.校验和
校验和是一个16 位长度的数值,使用循环冗余校验生成,其作用是保证IP 帧的完整性。发送端发送数据的时候要计算CRC16校验值,填入此字段;接收端会计算IP的校验值与此字段进行匹配,如果不匹配,表示此帧发生错误,将丢弃此报文。在路由的过程中,由于每经过一 个路由器都要修改TTL 的值,所以需要重新计算 CRC16, 将结果填入此字段中。
⑨.IP选项
IP选项字段是一 个32b 的字段,该选项用来识别IP 的数据段是正常数据还是用做网络控制的数据。主要有如下定义:
- 安全和处理限制。
- 路径记录:记录所经历路由器的IP地址。
- 宽松源站路由:指定数据报文必须经历的IP地址,可以经过没有指定的IP地址。
- 严格的源站路由:指定数据报文必须经历的IP地址,不能经过没有指定的IP地址。
⑩.源地址和目的地址
源地址表示发送数据的主机或者设备的IP地址,目的地址为接收数据的主机IP地址。这两个字段均为32位长度。字段的目的用于识别Internet上的主机。
4.网际控制报文协议(ICMP)
ICMP协议用于传递差错信息、时间、回显、网络信息等报文控制数据。
1.ICMP协议格式
ICMP协议的数据位于IP字段的数据部分,它是在IP报文的内部被传输的,如下图表示ICMP报文在IP报文中的位置:
-
ICMP报文的数据格式如下图,ICMP报文的前4个字节的格式是相同的,表示类型、代码和校验和,而后面的字节互不相同。
-
类型字段为8个位,可以表示15个不同类型的ICMP报文。
-
代码段用于对类型字段ICMP报文的详细规定,最多可以表示16种类型。
-
校验和表示的范围覆盖整个ICMP的报文,包括头部和数据部分,校验和方法与IP一致(CRC16),ICMP协议的校验和是强制性的。
2.ICMP的报文类型
ICMP的报文类型由类型和代码决定报文方式,如下表,最后两列表示报文用于查询还是差错。
3.目的不可达的报文格式
-
ICMP报文中项目最多的是报文不可达的差错报文如下图所示。
-
类型字段的值为3,代码字段根据实际情况进行设置。第4~7个字节保留,必须设置为0。
-
余下的字段为不可达IP报文的头部(包含选项字段)和IP报文中数据部分的前8个字节。
-
例如,如果源IP头部没有选项字段的话,ICMP的报文长度为36个字节(1个字节的类型,1个字节的代码, 2 个字节的校验和,4 个字节的保留字段,20 个字节的IP 头部,8个字节的数据)。
例:一个端口不可到达的ICMP报文,可能的数据格式如下图所示,报文包含14个字节的以太网头部,20个字节的IP地址头部,加上ICMP的8个字节的头部,ICMP数据部分包含出错报文的IP头部和8个字节的UDP头部。
4.地址掩码的请求应答格式
-
无盘工作站在启动的时候使用RARP协议获得本机的IP地址,而子网掩码的获得使用ICMP协议获得或者BOOTP协议获得。
-
地址掩码请求的格式如下图所示,与上面中的ICMP报文相比,这个报文额外包含3个字段:标识符、序列号和子网掩码。
-
发送请求的时候标识符和序列号由请求的主机随意填充,应答时会返回这些值;
-
应答的主机填充子网掩码后发送给请求主机,请求主机对比发送和接收到的标识符和序列号是否一 致,由此来决定本机的请求是否有效。
地址掩码请求和发送的过程均对上述的字段进行处理,下面是一 个请求发送和接收的具体过程和相关的操作。
- 请求方类型值为17, 代码为 0, 填充标识符和序列号,计算校验和后将请求发送到网络上。
- 应答方类型值为18, 代码为0, 标识符和序列号为请求方的值,填充合适的子网掩码,计算校验和后返回给请求方。
5.时间戳的请求应答格式
一个主机可以使用 ICMP的时间戳请求向另一 个主机查询当前时间,其格式如下图所示。
-
标识符和序列号的含义与网络掩码的请求应答相同。
-
时间戳表示的是一个自子夜开始的毫秒数,发起时间戳为发起方发起请求时的时间,接收时间戳为接收方接收到请求的时间戳,传送时间戳为接收方发送响应的时间戳。
-
发起时间戳由请求主机填充,接收时间戳和传送时间戳由应答主机填充,通常后两个时间戳是一 致的。
-
利用时间戳请求应答可以计算网络上与目的主机的响应时间,如下图所示。其中的“请求”为请求方到应答方的网络传输时间 (还有协议栈的处理时间,但是很少),“应答”为应答方到请求方的网络传输时间。
-
“请求”过程时间为接收时间戳与请求时间戳的差值,“应答”过程时间为请求方接收到应答的时间与传送时间戳的差值。
5.传输控制协议(TCP)
传输控制协议(Transmission Control Protocol), 简称TCP协议,它在原有IP协议的基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一 种可靠的、面向连接的字节流服务。
1.TCP的特点
-
字节流的服务:使用TCP协议进行传输的应用程序之间传输的数据可视为无结构的字节流,基于字节流的服务没有字节序问题的困扰。
-
面向连接的服务:在数据进行传输之前,TCP协议需要先建立连接,之后的TCP报文在此连接的基础上传输。
-
可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发此报文。
-
缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一 定的数量才进行集中发送。
-
全双工传输:各主机TCP协议以全双工的方式进行数据流交换。
-
流量控制: TCP协议的滑动窗口机制,支持主机间的端到端的流量控制。
2.TCP的数据格式
TCP在IP协议的基础上进行传输数据,TCP数据在IP报文中的位置,如下图所示:
TCP数据包含头部和数据两部分,其数据格式如下图所示:
-
源端口号和目的端口号:这两个字段均为16位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的IP地址和端口号及接收端的IP地址和端口号可以确认一个在Internet上的TCP 连接。
-
序列号:序列号是一个32 位长度的字段,表示分配给TCP 包的编号。序列号用来标识应用程序从TCP的发送端到接收端发送的字节流。当TCP开始连接的时候,发送一 个序列号给接收端,连接成功后,这个序列号作为初始序列号ISN (Initial Sequence Number)。建立连接成功后发送的第一 个字节的序列号为ISN +1, 之后发送数据ISN将按照字节的大小进行递增。序列号是一 个32 位的无符号数,到达2的32次方减1之后从0开始。
-
确认号:发送方对发送的首字节进行了编号,当接收方成功接收后,发送回接收成功的序列号加1表示确认,发送方再次发送的时候从确认号开始。
-
头部长度:表示TCP头部的长度,由于TCP的数据有可选字段,头部长度用于表示头部的长度。此字段的长度为4位,表示的是32位字长的数据。因此TCP的头部最长为60个字节,如果没有可选字段通常为20字节。
-
保留位: 6位长度没有使用,必须设为0。
-
控制位: 6b, 用做控制位,可以多个位一 起设置,含义在下表中进行说明。
-
窗口尺寸:窗口尺寸也称接收窗口大小,表示本机上TCP协议可以接收的以字节为单位的数目,本字段为16b大小。
-
校验和:16b。用于校验TCP 传输数据的正误,包括TCP 头和所有数据,T CP 的数据必须强制校验。
-
紧急指针:16b。只有设置了URG 位才有效,它指出了紧接紧急数据的字节的顺序编号。
-
选项:经常使用的为最大分段长度MSS (Maximum Segment Size) 。TCP 连接通常在第一 个通信的报文中指明这个选项,它指明当前主机所能接收的最大报文长度。
3.建立连接的三次握手
主机A和主机B要使用TCP协议进行通信,需要先建立一条TCP连接,如下图所示,为了建立一条TCP的连接,主机A和主机B需要进行三次通信过程(称为"三次握手")。
-
主机A发送一个SYN段到主机B告诉B想要连接的主机端口,以及初始化的序列号(ISN,这里为1234567890)。
-
主机B应答,其中SYN段为主机B的初始化序列号(ISN,这里为987654321),ack段为主机A发送的ISN+1,即1234567891。
-
主机A将主机B发送的SYN段+1作为确认号返回给主机B作为应答。
4.释放连接的四次握手过程
建立一个TCP连接需要3次握手,而终止一个TCP连接需要4次,如下图所示:
-
主机A TCP协议栈发送FIN字段,序列号为1234567891的释放请求。
-
主机B先确认主机B的FIN请求,确认号为1234567892,在主机A序列号上加1。
-
主机B发送FIN请求。
-
主机A对主机B的FIN请求确认。
5.TCP的封装解封过程
-
下图所示为使用 TCP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给主机B, 数据封装在 TCP 的数据部分。
-
发送的过程是 一 个封包的过程。在主机 A 上,在传输层,用户发送的数据增加 TCP头部,用户数据封装在 TCP 的数据部分。
-
在 IP 层增加 IP 的头部数据,TCP 的数据和头部都封装在 IP 层的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。
-
接收数据的过程是 一 个解封包的过程。在主机 B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给IP 层。IP 层剥去IP头,进行校验,将数据发送给其上层 TCP 层。
-
TCP 则将 TCP 的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机 B 上的应用程序会得到干净的有效数据,然后进行处理。
6.用户数据报文协议(UDP)
UDP是一种基于IP协议的不可靠网络传输协议,在IP数据的位置如下图所示:
-
UDP协议是TCP/IP的传输层协议的一部分,与TCP的传输不一样,它提供了无连接的、不可靠的传输服务。UDP协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序。
-
接收方不向发送方发送接受的确认信息,如果出现丢包或者重包的现象,也不会向发送方发送反馈,因此不能保证使用UDP协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。
-
使用UDP协议传输数据的应用程序,必须自己构建发送数据的顺序和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,也就是,应用程序必须根据UDP的缺点提供解决方案。
-
UDP协议相比较TCP协议执行时的速度比TCP快得多,因为UDP协议简单得多,对系统造成的负载低。在高负载的系统(如服务器)或者系统资源受限的系统(例如嵌入式系统)上应用比较多,在不需要可靠传输的应用程序上有比较广泛的应用。例如流媒体的传输、域名服务器、嵌入式机顶盒系统等。
1.UDP的数据格式
UDP传输数据时的字段格式如下所示:
-
端口号和目的端口号分别是一个16位的字段,用来表示发送方和接收方的UDP端口。
-
UDP数据长度表示UDP头部和UDP数据段的长度,单位为字节。由于UDP头部为8个字节,因此发送UDP的长度字段最少为8字节。UDP的长度与IP协议的长度有关联性,IP的长度指的是数据的全长,UDP的长度等于IP的长度减去IP头部的长度。
-
UDP校验和表示整个UDP字段的CRC16校验和,它的计算方法与IP字段是 一 致的。UDP的校验和字段是可选的,即可以不进行CRC校验,此时校验和部分为全0。UDP校验和允许发送的数据为奇数长度,此时要加 一 个空字节,即全 0 的字节进行填充,这个字节仅仅为了方便计算校验和,不发送到目的地址。
2.UDP数据的传输过程
如下图所示为使用UDP协议的应用程序的数据传输过程,用户数据由主机A发送给主机B,数据封装在UDP的数据部分:
-
发送是一个封包的过程:主机A 上,在传输层,用户发送的数据增加UDP 头部,用户数据封装在UDP的数据部分。在IP层增加IP的头部数据,UDP的数据和头部都封装在IP层的数据部分。IP层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。
-
接收解是一个解包的过程:主机B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行CRC校验后,将正确的数据传递给IP层。IP层剥去IP头,进行校验,将数据发送给其上层UDP层。UDP则将UDP的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机B上的应用程序会得到干净的有效数据,然后进行处理。
7.地址解析协议(ARP)
-
在以太网为基础的局域网中,每个网络接口都有一个硬件地址,这是一个48b 的值,标识不同的以太网设备,在局域网中的必须知道网络设备的硬件地址才能向目的主机发送数据。
-
而在网际网中数据传输的目的地址是IP地址,数据要能够正确地传输,必须建立IP地址和硬件地址的对应关系,ARP协议就是起这种作用的。
-
ARP协议为IP地址到硬件地址提供动态的映射关系,如下图所示为进行IP地址和硬件地址映射的ARP映射关系图。
-
ARP的高速缓存维待这种映射关系,其中存放了最近IP地址到硬件地址的映射记录,高速缓存中的每项记录的生存时间为20分钟,开始时间从映射关系建立时算起。
1.ARP过程
下图表示为同一个局域网中的主机A和主机B,IP地址分别为192.168.1.150和192.168.1.151。下面是个ping过程实例,说明ARP协议的作用和在实际过程中的位置:
主机A用ping命令探测主机B,命令如下:
ping B
过程如下所示:
-
步骤 a: 应用程序 ping 会判断发送的是主机名还是 IP 地址,调用函数 **gethostby-name()**解析主机名B, 将主机名转换成 一个32 位的 IP 地址。这个过程叫做 DNS域名解析。
-
步骤 b: ping 程序向目的IP 地址发送一 个ICMP的ECHO 包。
-
步骤c: 由于主机 A 和主机 B 在同一 个局域网内,必须把目标主机的IP 地址转换为48位的硬件地址,即调用 ARP 协议,在局域网内发送 ARP 请求广播,查找主机B的硬件地址。
-
步骤 d: 主机 B 的ARP 协议层接收到主机 A 的ARP 请求后,将本机的硬件地址填充到合适的位置后,发送 ARP 应答到主机 A 。
-
步骤e: 发送 ICMP 数据包到主机 B。
-
步骤f: 主机 B 接收到主机 A 的ICM P 包,发送响应包。
-
步骤g: 主机 A 接收到主机 B 的ICMP 响应包。
在 ping 命令之后可以查看 ARP 的高速缓存,用 arp 命令加-v 选项进行检查,-v 选项是显示详细信息,下面是 一 个主机的ARP 高速缓存中的内容:
2.APR分组数据格式
以太网的地址解析协议ARP协议分组数据格式如下所示,ARP协议的实现方式是在以太网上做广播,查询目的IP地址,接收到ARP请求的主机响应请求方,将本机的MAC地址反馈给请求的主机:
-
目的硬件地址和源硬件地址,分别为以太网硬件的地址的发送方和接收方的硬件地址,例如M AC 地址。当目的硬件地址为全1(即0xFFFFFFFFFFFF) 的地址时为广播帧,在以太网上的 所有接口都要接收此帧数据。
-
帧类型为两个字节长度,表示后面数据的类型。对于ARP 请求应答,该字段为0x0806。
-
硬件类型表示硬件地址的类型,值为1表示以太网硬件地址。
-
协议类型表示要映射的协议地址类型,值为0x0800表示询问IP 地址。
-
硬件地址长度表示硬件地址以字节为单位的 长度,对于ARP 请求来说,硬件地址为以太网的 M AC 地址,值为6。
-
协议地址长度,表示协议地址以字节为单位的长度,对于ARP请求来说,协议地址为IP地址,为32位,值为4。
-
操作方式字段为本次操作的类型,可选方式如下图所示,ARP请求帧和ARP应答帧的区别可用此字段的值不同来确定。
-
余下的4个字段分别为发送方的硬件地址、发送方的IP地址、接收方的硬件地址、接收方的IP地址。
ARP请求应答的操作发生很简单,将接受到数据字段的发送方和接收方的值对调,将所有本机的硬件地址和IP地址的值填充到合适的发送位置。
在ARP操作中,有些数据的长度为28个字节;不足以太网定义的最小长度46字节长度,需要填充字节;填充字节最小长度为18字节。
三.IP地址分类与TCP/UDP端口
- 要想使网络设备或者主机能够连接到Internet, 必须为网络设备配置IP地址。由于IP地址是全世界唯一 的 ,IP 地址可以标识一个主机。
- 目前应用范围最广泛的 因特网地址使用的 是IPv4 (IP第4版本)的 IP 地址,长为32位,由4 组十进制数组成,每组数值的 范围为0~255, 中间用点号(“.”)隔开,称之为四组 ”点分二进制”。例如,IP地址172.16.12.204对应的 二进制表达方 式为:
10101100 00010000 00001100 11001100
1.因特网中IP地址的分类
IP地址由IP地址类型、网络ID和主机ID组成。网络类型标识本IP地址所属的类型,网络ID标识IP表示设备或主机所在的网络,主机ID标识网络上的工作站、服务器或路由选择器。每个网络设备对应的网络ID必须唯一,在不同网络中各网络设备的主机ID不能重复。IP地址的一般格式为:
类型+网络标识+主机标识
-
类型:用来区分IP地址的类型。
-
网络标识:表示主机所在的网络。
-
主机表示:表示主机在网络中的标识。
1.IP地址的类型
IP地址通常分为5类:
-
A类地址:如下图所示,网络标识占1个字节,最高位为0。A类网络地址有128个,允许支待127个网络,每个A类网络大约允许有1670万台主机存在。此类地址通常分配给拥有大量主机的网络,如一 些大公司(如IBM 公司等)和因特网主干网络,这些地址中大约1/3已经被分配,想得到这类地址是很困难的。
-
B类地址:如下图所示,B类地址的高两位用于标识这种IP地址的类型,即为10, 中间的14位用于标识网络,最后的两个字节(16位)用做主机标识。B类地址允许有16000个网络,每个网络大约允许有66000台主机。B类地址通常分配给结点比较多的网络,如区域网,此类IP地址大约已经分配了5000个。
-
C类地址: C类IP地址是最常见的地址,如下图所示。网络标识占3个字节, 3个高位用于地址类型识别,值为110。左边3个字中的其余21位用于表示网络寻址,C类地址支持大约209715个网络。最后一 个字节用来标识主机,允许有254台主机。C类地址通常分配给结点比较少的网络,例如,一些大的校园网可以拥有多个C类地址。
-
D类地址: D类地址是相当新的,前4位为1110, 此类地址用于组播,例如路由器修改、视频会议等应用系统都采用了组播技术实现,其格式如下图。
-
E类地址:此类地址为保留地址,目前没有使用,前4位为1111。这5类IP地址的开始字段如表5.6所示。
5类IP地址的开始字段如下表:
2.因特网规定一些特殊地址
-
主机ID全为0的IP地址,它不分配给任何主机,仅用于表示某个网络的网络地址,例:192.168.1.0,表示网络为192.168.1.0,其中的主机为192.168.1.1~ 192.168. 1.254。
-
主机ID全为1的IP地址,这个地址也不分配给任何主机,仅用做广播地址。目的地址为这个IP地址的分组数据发送给该网络中的所有结点,至于能否执行广播,则要依赖于其物理网络是否支持广播的功能。例如,192.168.1.255为网络192.168.1.0的广播值,向此IP地址发送的分组数据,全网络的主机都接受。
-
IP地址的32位全为1的地址,即255.255.255.255,为有限广播地址,这个地址通常由无盘工作站启动时使用,从网络IP地址服务器获得一个分配给工作站的IP地址
-
IP地址的32位全为0的地址(即0.0.0.0), 表示主机本身,发往此IP地址的数据分组由本机接收。
-
IP地址127.0.0.1是一个特殊的回环接口,它常用于在本地进行软件测试。例如在Linux操作系统下有一个配置文件/etc/hosts,其中一行代码定义了localhost的IP地址:127.0.0.1 localhot。
3.IP地址的申请
-
局域网中主机用户要想接入因特网,需要获得授权的IP地址,IP地址由IP地址授权机构分配,此授权机构通常称为网络信息中心(NIC)。
-
组网用户根据网络规模的大小,向较高层次的网络管理中心申请IP地址;
-
通常情况下,网络中心根据申请者的规模进行评估,分配若干连续地址的IP地址,形成一个网络ID,网络ID内部的IP地址由申请者的网络管理员进行管理,给子网内的各主机使用。
2.子网掩码(subnet mask address)
子网掩码指的一个 32位字段的数值,利用此字段来屏蔽原来网络地址的划分情况,从而获得一 个范围较小的、可以实际使用的网络。
1.子网掩码的含义
-
网络的子网掩码设置主要用来屏蔽原来网络的划分情况,使用子网掩码,网络设备可以分析得出一个IP 地址的网络地址和子网地址,以及主机地址。
-
网络的路由器根据目的地址的网络号和子网号可以做出路由寻址决策, IP 地址的主机ID 不参与路由器的路由寻址操作,它用于在某个网段中识别一个网络设备。
-
子网掩码使用与 IP 相同的点分四段式的编址格式,值为 0 的部分对应于 IP 地址的主机 ID 部分,值为1的部分对应于IP 地址的网络地址部分。
-
子网掩码与IP 地址进行与运算后,所得到的值为网络地址和子网地址,主机ID部分将不再存在。利用此特性可以计算两个 IP 地址的网络地址和子网地址判断是否处于同一 个子网中。
-
例如,某个网络 IP 分组数据的目的地址为 192.168.1.151, 如果其子网掩码为255.255.255.128, IP 地址与子网掩码与运算后的结果为 192.168.1.128, 则该 IP 地址的网络ID 和子网号的值为 192.168.1.128。
其实,如果网络系统中只有A、B、C这3种类型的 IP 地址,判断 IP 地址的第一个字节的数值范围就可以判断此 IP 地址属于 A 、B、C 中的哪一类网,从而得到该 IP 地址的网络部分和主机部分,不需要子网掩码的辅助。3类网的子网掩码如下:
-
A类地址网络的子网掩码地址为255.0.0.0。
-
B类地址网络的子网掩码地址为:255.255.0.0。
-
C类地址网络的子网掩码地址为255.255.255.0。
子网掩码主要用处:
-
便于网络设备的尽快寻址,区分本网段地址和非本网络的地址。
- 划分子网,进一步缩小子网的地址空间,充分利用目前紧缺的IP地址。
2.利用子网掩码确定网段
利用子网掩码可以确定两个 IP 地址是否属于同一 个网段。比较两台计算机的 IP 地址与子网掩码进行与运算后的值,如果结果相同,则说明两台计算机处于同一个子网络上。在以太网结构的网络中,同一子网内的两台计算机可以直接通信,而不用路由器对IP 分组进行转发。
例如:主机A的IP地址为192.168.1.151,子网掩码为255.255.255.128;主机B的IP地址为192.168.1.150,子网掩码为255.255.255.128,对两个主机的计算如下:
-
对两个主机的IP地址和子网掩码进行按位与运算,得到两个主机的网络地址均为11000000.10101000.00000001.10000000,即192.168.1.128,可知两个主机在同一个网络上。
-
对计算的过程进行分析可知,子网掩码255.255.255.128的网络上,所有最后一个字节的值为128-255的IP地址与子网掩码进行运算的时候,其结果都相同。
-
可以确定对于子网掩码为255.255.255.128的子网上,IP地址从192.168.1.128~192.168.1.255都在同一个子网192.168.1.128上。
-
由于192.168.1.128地址用于表示网络,192.168.1.255用于广播,所以实际可用的IP地址数量为128-2=126个。
3.用子网掩码进行网络划分
- 使用A、B、C类进行IP地址划分的方法对目前有限的IP地址来说有点浪费,所以出现了使用子网掩码进行网络划分的方法。使用子网掩码进行网络划分的基本原理是子网掩码与IP地址与运算结果相同的IP地址在同一个网络上。
- 例如,有50个主机,需要为其划定网络,而目前IP地址段空闲的为192.168.1.0。如果全部使用上述的地址段,50个主机占用254个有用地址显然太浪费了,可以对网络地址192.168.1.0进行重新划分,建立一个能够容纳50个主机的网络。
过程:
-
首先计算需要的IP地址,50个主机占用50个IP地址,加上1个网络地址和1个广播地址,建立网络需要IP地址52个。
-
子网掩码的数值通常以2的n次方进行取值,所以取掩码值为64。
-
子网掩码为255.255.255.64,IP地址的范围是192.168.1.0~192.168.1.64,最多可以容纳64个主机,可以满足50个主机的需要。
3.IP地址的配置
Linux下,进行网络配置的命令时ifconfig,用于显示、设置网络设备的IP地址和子网掩码。ifconfig命令格式如下:
ifconfig 网络编号 IP地址 netmask 子网掩码
例:将主机的网络设置eth0配置成IP地址为192.168.1.151,子网为255.255.255.128。命令如下:
ifconfig eth0 192.168.1.151 netmask 255.255.255.128
配置后可以使用ifconfig命令查看,不带参数时,会显示所有激活的网络接口的当前配置信息。
4.端口
TCP和UDP协议是以IP协议为基础的传输,为了方便多种应用程序,区分不同应用程序的数据和状态,引入了端口的概念。
-
端口是一个16 位的整数类型值,通常称这个值为端口号。
-
服务程序,则需要对某个端口进行绑定,这样某个客户端可以访问本主机上的此端口来与应用程序进行通信。
-
由于IP地址只能对主机进行区分,而加上端口号就可以区分此主机上的应用程序。实际上, IP地址和端口号的组合,可以确定在网络上的一个程序通路,端口号实际上是操作系统标识应用程序的一 种方法。
-
端口号的值可由用户自定义或者由系统分配,采用动态系统分配和静态用户自定义相结合的办法。
-
常用的服务程序使用固定的静态端口号,例如,Web 服务器的端口号为80, 电子邮件SMTP的端口号为25, 文件传输FTP的端口号为20和21等。
-
对于其他的应用服务,特别是用户自行开发的客户端应用程序,端口号采用动态分配方法,其端口号由操作系统自动分配。
-
通常情况下,对端口的使用有如下约定,小于1024的端口为保留端口,由系统的标准服务程序使用; 1024以上的端口号,用户应用程序可以使用。
如下图所示为Linux下常用的端口及绑定的服务:
在Linux系统的文件**/etc/services**中列出了系统提供的服务,以及各服务的端口号等信息。
四.主机字节序和网络字节序
-
使用网络进行程序设计中会碰到有关字节序的问题,而在基于单机或者同类型机器进行开发的过程中很少遇到。
- 由于网络的特点是将Internet上不同的网络设备和主机进行连接和通信,这决定了使用网络进行开发的程序的特点就是要兼容各种类型的设备,其中的数据在不同的设备上要有唯一 的含义。字节序的问题是上述清况下的典型问题。
1.字节序的含义
字节序的问题是由于CPU对整数在内存中的存放方式造成的。多于一个字节的数据类型在内存中的存放顺序叫主机字节序。最常见的字节序有两种,小端字节序和大端字节序。
-
小端字节序:即Little Endian, 简称LE, 将数据的最低字节放在内存的起始位置。小端字节序的特点是内存地址较低的位存放据的高位,与思维习惯一 致。采用低字节序的CPU 有x86 架构的Intel系列产品。数据的低位,内存地址高的位存放数
-
大端字节序:即Big Endian, 简称BE, 将数据的高字节放在内存的起始位置。大端字节序的特点是内存中低字节位置存放数据的高位字节,内存中的高位字节存放数据的较低字节数据,与思维习惯不一 致。但是与实际数据的表达方式是一 致的。如果将内存中的数据直接存放在文件中,打开文件查看会发现和原来的数据的高低位一致。采用大端字节序的典型的代表有PowerPC的UNIX系统。
例:对于一个8位字节的数据0x12345678,假设在内存中存放的开始地址为0x1000,则在小端字节序系统和大端字节序系统中的方式如下:
而如果将0x12345678写入内存地址0xl000开始的地方,在内存中的值为如下表所示的形式:
系统对多字节数据的不同存放方法造成了使用方法的问题,例如,在x86系统主机A上的一 个值为0x12345678, 数据通过网络传送到PowerPC上的一 个运行UNIX 的主机B上,在B上此值解释为0x78563412, 与原来的数据迥异,这样就造成了传输上兼容性方面的困难。
2.网络字节序的转换
网络的字节序标准规定为大端字节序,不同平台上会对主机字节序进行转化后再进行传送,到主机后再转化为主机字节序,数据的传输就不会产生传输造成的问题了。同一个数据在不同的平台上可以使用网络字节序的转换函数来实现。
如下图所示为主机A中的应用程序将变量a中的值0x12345678, 通过网络传递给主机B中的应用程序中的变量b, 如果不进行网络字节序转换,b的值为0x78563412。
如下图所示,如果进行网络字节序转换,a的值与b的值均为0x12345678。进行网络字节序转换的函数有htons()、ntohs()、htonl()、ntohl()等,其中s是short数据类型的意思,l是long数据类型的意思,而h是host, 即主机的意思,n是network, 即网络的意思,以上4个函数分别如下:
-
htons(): 表示对于short类型的变量,从主机字节序转换为网络字节序。
-
ntohs(): 表示对于short类型的变量,从网络字节序转换为主机字节序。
-
htonl(): 表示对于long类型的变量,从主机字节序转换为网络字节序。
-
ntohl(): 表示对于long类型的变量,从网络字节序转换为主机字节序。
字节序的转换函数并没有转换符号类型变量,是否为符号类型是由应用程式来确定的·,与字节序无关。字节序转换函数在不同平台上的实现是不同的,如对于long类型的转换,小端主机字节序的平台要进行转换,而在大端主机字节的平台上是不需要进行转换的。例:下面的实现方式可以兼容不同的平台:
#if ISLE
/*小端字节序平台调用此部分代码*/
long htonl(long value)
{
/*进行转换,即位置0x12345678转换位置->0x78563412*/
return ((value << 24)|((value << *)&0x00FF0000)|((value >> 8)&0x0000FF00)|(value >> 24));
}
#else if ISBE
/*大端字节序平台调用此部分代码*/
long htonl(long value)
{
/*由于大端字节序平台与网络字节序一致,不需要进行转换*/
return value;
}
#endif
不同的平台的实现代码是不同的部分。其他函数的实现与此类似,注意htons()和ntohs()函数及htonl()和ntohl()函数是对应的转换,两个函数完全可以使用同一套代码,例:
#define ntohl htonl