TCP/IP协议族是一组不用的协议组合在一起构成的协议族,尽管通常称该协议族为TCP/IP,但是TCP,IP只是其中的两种协议而已。我们先来看看TCP/IP协议族的四个层次:
下面我们再来看看数据进入协议栈时的封装过程:
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层知道被当作一串比特流送入网络。其中每一层都要增加一些首部信息(有时候还要增加尾部信息)。在这里需要注意的是:TCP传给IP的数据单元称为TCP报文段或简称为TCP段(TCP segment);UDP传给IP的信息单元称作UDP数据报(UDP datagram)。IP传给网络接口层的数据单元称为IP数据报(IP datagram)。通过以太网传输的比特称为帧(Frame)。
再来回顾一下端口号: 任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号,比如说FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23。客户端通常不关心它所使用的端口号,只需要保证该端口号在本机上是唯一的就可以了。所以客户端口号又称为临时端口号(即存在时间很短暂)。大多数TCP/IP实现给临时端口分配1024~5000之间的端口号。
在数据封装图中我们可以看到,在TCP/IP协议族中,链路层主要有三个目的:1.为IP模块发送和接收IP数据报;2.为ARP模块发送ARP请求和接收ARP应答;3.为RARP发送RARP请求和接收RARP应答。其实TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网,令牌环网,FDDI(光纤分布式数据接口)及RS-232(SLIP)串行线路等。但是我们主流的是使用以太网作为链路层协议。
以太网和IEEE 802封装
以太网这个术语一般是指数字设备公司(Digital Equipment Crop.), Inter Crop 和Xerox公司在1982年联合公布的一个标准,它采用了一种称为CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense,Multiple Access with Collision Detection)。 几年后,IEEE(电子电气工程师协会)802委员会公布了一个稍有不同的标准集,这个标准集定义了一个与以太网不同的帧格式。具体细节等用到再具体描述。
下面来看看以太网的具体格式: 前导码:Ethernet 是由8个8‘b10101010构成 目的地址:目的设备的MAC物理地址。 源地址 :发送设备的MAC物理地址。 类型(Ethernet II):以太网首部 后面所跟数据包的类型,例如Type为0x8000时为IP协议包,Type为8060时,后面为ARP协议包。 数据:数据长度最小为46字节,不足46字节时,填充至46字节。因为最小帧长度是64字节,所以,46+6+6+2+4=64(不算前导码) FCS: 就是CRC校验值
SLIP:串行链路IP SLIP的全称是Serial Line IP。它是一种在串行线路上对IP数据报进行封装的简单形式,注意,是对IP数据报进行封装,而且是在串行线路上,应该与以太网区分开来。SLIP适用于家庭中每台计算机几乎都有的RS-232串行接口和高速调制解调接入Internet。
下面的规则描述了SLIP协议定义的帧格式: 1.在每一个IP数据报的首尾各加上一个特殊的标志字节(其编码为:0XC0,即十六进制数C0),封装成为SLIP帧; 2.如果在待发的IP数据报中出现与标志字节0XC0相同的数据字节,那么就用0XDB、0xDC序列取代这个字节。接收者将0xDB,0xDC序列还原为0XC0; 3.如果在待发的IP数据报中出现0xDB,那么就用0xDB,0xDD序列取代0xDB。同样,由接收者将0xDB,0xDD序列还原为0XDB
SLIP协议的主要特点; 1.协议简单; 2.在SLIP链路仅支持IP协议,不支持其他的协议; 3.SLIP没有差错检测的功能。差错处理只能靠高层完成,因为其数据帧中没有加上检验和(类似于以太网上的CRC字段); 4.通信的每一方必须事先知道对方的IP地址; 5.SLIP并未成为Intermet的标准协议。因此目前存在着多种互不兼容的版本,影响了不同网络的互连
PPP:点对点协议 PPP,点对点协议修改了SLIP协议中的所有缺陷,下图为PPP数据帧的格式:
每一帧都以标志字符0x7E开始和结束。紧接着是一个地址字节0xFF,然后是一个值为0x03的控制字节。 接下来是协议字段,类似于以太网中类型字段的功能。当它的值为0x0021时,表示信息字段是一个IP数据报;为0xc021时,表示信息字段是链路控制数据;值为0x8021时,表示信息字段是网络控制数据。
CRC字段(或FCS,帧检验序列)是一个循环冗余检验码,以检测数据帧中的错误。由于标志字符的值是0x7e,因此当该字符出现在信息字段中时, PPP需要对它进行转义。 在同步链路中,该过程是通过一种称作比特填充(bit stuffing )的硬件技术来完成的;在异步链路中,特殊字符0x7d用作转义字符。当它出现在PPP数据帧中时,那么紧接着的字符的第6个比特要取其补码,具体实现过程如下: 1.当遇到字符0x7e时,需连续传送两个字符: 0x7d和0x5e,以实现标志字符的转义。 2.当遇到转义字符0x7d时,需连续传送两个字符: 0x7d和0x5d,以实现转义字符的转义。 3. 默认情况下,如果字符的值小于0x20(比如,一个ASCII控制字符),一般都要进行转义。例如,遇到字符0x01时需连续传送0x7d和0x21两个字符(这时,第6个比特取补码后变为1,而前面两种情况均把它变为0)。 这样做的原因是防止它们出现在双方主机的串行接口驱动程序或调制解调器中,因为有时它们会把这些控制字符解释成特殊的含义。另一种可能是用链路控制协议来指定是否需要对这32个字符中的某一些值进行转义。默认情况下是对所有的32个字符都进行转义。
最大传输单元MTU 在TCP/IP中,以太网和IEEE 802.3对数据帧(注意:是数据帧,而不是以太网帧)的长度都有一个限制,其最大值分别是1500和1492字节,点对点数据帧的最大值是296字节。链路层的这个特性称为称作MTU,最大传输单元。但是不同类型的网络大多数都有一个上限。 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还要大,那么IP层就要进行分片。把数据报分成若干片,这样每一片都小于MTU。 这里还要指出的是,点对点的链路层(如SLIP和PPP)的MTU并非指的是这个网络配置的物理特性,而是指一种逻辑上的限制,目的是为了交互使用提供足够快的响应时间,不至于让用户等待太久。
