TCP/IP协议族按照层次由上到下分成4层,分别是应用层(Application Layer)、传输层(Transport Layer)、网络层(Internet Layer,或称网际层)和网络接口层(Network Interface Layer,或称数据链路层)。其中,应用层包含所有的高层协议,比如Telnet(Telecommunications Network,远程登录协议)、FTP、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、DNS(Domain Name Service,域名服务)、NNTP(Net News Transfer Protocol,网络新闻传输协议)和HTTP等。Telnet允许一台机器上的用户登录远程机器进行工作,FTP提供将文件从一台机器上移到另一台机器上的有效方法,SMTP用于电子邮件的收发,DNS用于把主机名映射到网络地址,NNTP用于新闻的发布、检索和获取,HTTP用于在WWW上获取主页。
应用层的下面一层是传输层,著名的TCP和UDP(User Datagram Protocol,用户数据报协议)就在这一层。TCP是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性保证、流量控制、多路复用、优先权和安全性控制等功能。UDP是面向无连接的不可靠传输协议,主要用于不需要TCP的排序和流量控制等功能的应用程序。
传输层的下面一层是网络层,该层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把数据报(Packet,或称为分组)发往任何网络,并使分组独立地传向目标。这些分组经由不同的网络到达的顺序和发送的顺序可能不同。网络层使用的协议有IP。
网络层的下面是数据链路层,该层是整个体系结构的基础部分,负责接收IP层的IP数据报,通过网络向外发送,或接收从网络上来的物理帧,抽出IP数据报,向IP层发送。该层是主机与网络的实际连接层。数据链路层下面就是实体线路(比如以太网络、光纤网络等)。数据链路层有以太网、令牌环网等标准,负责网卡设备的驱动、帧同步(就是从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机可以在不同的数据链路层的网络之间(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间)转发数据帧,由于不同数据链路层的帧格式不同,交换机要将进来的数据报拆掉报头重新封装之后再转发。
不同的协议层对数据报有不同的称谓,在传输层叫作段(Segment),在网络层叫作数据报(Datagram),在数据链路层叫作帧(Frame)。数据封装成帧后发送到传输介质上,到达目的主机后,每层协议再剥掉相应的报头,最后将应用层数据交给应用程序处理。
不同层包含不同的协议,可以使用图1-1来表示各个协议及其所在的层。
图1-1
在主机发送端,从传输层开始会把上一层的数据加上一个报头形成本层的数据,这个过程称为数据封装。在主机接收端,从最下层开始,每一层数据会去掉报头信息,该过程称为数据解封。其过程如图1-2所示。
图1-2
我们来看一个例子。以浏览某个网页为例,看一下浏览网页的过程中TCP/IP各层做了哪些工作。
发送方:
1)打开浏览器,输入网址www.xxx.com,按回车键来访问网页,其实就是访问Web服务器上的网页,在应用层采用的协议是HTTP,浏览器将网址等信息组成HTTP数据,并将数据传送给下一层——传输层。
2)传输层在数据前面加上TCP报头,并标记端口为80(Web服务器的默认端口),将这个数据段给了下一层——网络层。
3)网络层在这个数据段前面加上自己机器的IP和目的IP,这时该段被称为IP数据报,然后将这个IP数据报给了下一层——数据链路层。
4)数据链路层先在IP数据报前面加上自己机器的MAC地址以及目的MAC地址,加上MAC地址的数据称为帧,然后通过物理网卡把这个帧以比特流的方式发送到网络上。
互联网上有路由器,它会读取比特流中的IP地址进行路由操作,到达正确的网段后,这个网段的交换机读取比特流中的MAC地址,从而找到要接收的对应机器。
接收方:
1)数据链路层用网卡接收到了比特流,读取比特流中的帧,将帧中的MAC地址去掉,就成了IP数据报,传递给上一层——网络层。
2)网络层接收下层传来的IP数据报,将IP从包的前面拿掉,取出带有TCP的数据(数据段)交给传输层。
3)传输层拿到了这个数据段,看到TCP标记的端口是80,说明应用层协议是HTTP,之后将TCP头去掉并将数据交给应用层,告诉应用层对方请求的是HTTP数据。
4)应用层得知发送方请求的是HTTP数据,因此调用Web服务器程序把www.xxx.com的首页文件发送回去。
如果两台计算机位于不同的网段中,那么数据从一台计算机到另一台计算机传输的过程中要经过一个或多个路由器,如图1-3所示。
图1-3
目的主机收到数据报后,如何经过各层协议栈最终到达应用程序呢?整个过程如图1-4所示。
图1-4
以太网驱动程序首先根据以太网报头中的“上层协议”字段确定该数据帧的有效载荷(Payload,指除去协议报头之外实际传输的数据)是IP、ARP或RARP的数据报,然后交给相应的协议处理。假如是IP数据报,IP再根据IP报头中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP或IGMP,然后交给相应的协议处理。假如是TCP段或UDP段,TCP或UDP再根据TCP报头或UDP报头的“端口号”字段确定应该将应用层数据交给哪个用户进程。IP地址是标识网络中不同主机的地址,而端口号是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程。
虽然IP、ARP和RARP数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP和RARP属于数据链路层,而IP属于网络层。虽然ICMP、IGMP、TCP、UDP的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,而TCP和UDP属于传输层。
上面可能讲得有点繁杂,再用一张简图来总结一下TCP/IP模型对数据的封装,如图1-5所示。
图1-5
每一层数据是由上一层数据+本层报头信息组成的,其中每一层的数据称为本层的协议数据单元(Protocol Data Unit,PDU)。
当目的主机收到一个以太网数据帧时,通过匹配帧中的MAC地址发现目的地是本机,数据就开始在协议栈中由底向上升,同时去掉各层协议加上的报头。每层协议盒都要去检查报头中的协议标识,以确定接收数据的上层协议。