Linux C/C++服务器开发实践
上QQ阅读APP看书,第一时间看更新

1.1 TCP/IP协议的分层结构

TCP/IP协议族按照层次由上到下,可以分成4层,分别是应用层(Application Layer)、传输层(Transport Layer)、网络层(Internet Layer,也称Internet层或网络层)和网络接口层(Network Interface Layer)或称数据链路层。其中,应用层包含所有的高层协议,比如虚拟终端协议(Telecommunications Network,TELNET)、文件传输协议(File Transfer Protocol,FTP)、电子邮件传输协议(Simple Mail Transfer Protocol,SMTP)、域名系统(Domain Name System,DNS)、网上新闻传输协议(Net News Transfer Protocol,NNTP)和超文本传送协议(Hyper Text Transfer Protocol,HTTP)等。TELNET允许一台机器上的用户登录到远程机器上,并进行工作;FTP提供有效地将文件从一台机器上转移到另一台机器上的方法;SMTP用于电子邮件的收发;DNS用于把主机名映射到网络地址;NNTP用于新闻的发布、检索和获取;HTTP用于在WWW上获取主页。

应用层的下面一层是传输层,著名的TCP协议和UDP协议就在这一层。TCP协议是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性保证、流量控制、多路复用、优先权和安全性控制等功能。UDP协议(User Datagram Protocol,用户数据报协议)是面向无连接的不可靠传输的协议,主要用于不需要TCP的排序和流量控制等功能的应用程序。

传输层下面一层是网络层,该层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标。这些分组可能经由不同的网络,到达的顺序和发送的顺序也可能不同。互联网层使用协议有IP协议。

网络层下面是网络接口层,该层是整个体系结构的基础部分,负责接收IP层的IP数据报,通过网络向外发送;或接收处理从网络上来的物理帧,抽出IP数据报,向IP层发送。该层是主机与网络的实际连接层。链路层下面就是实体线路了(比如以太网络、光纤网络等)。链路层有以太网、令牌环网等标准,链路层负责网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机是工作在链路层的网络设备,可以在不同的链路层网络之间转发数据帧(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间),由于不同链路层的帧格式不同,交换机要将进来的数据报拆掉链路层首部重新封装之后再转发。

不同的协议层对数据报有不同的称呼,在传输层叫作段(Segment),在网络层叫作数据报(Datagram),在链路层叫作帧(Frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

不同层包含不同的协议,如图1-1所示为各个协议及其所在的层。

图1-1

在主机发送端,从传输层开始,会把上一层的数据加上一个报头形成本层的数据,这个过程叫数据封装。在主机接收端,从最下层开始,每一层数据会去掉首部信息,该过程叫作数据解封,如图1-2所示。

图1-2

下面以浏览某个网页为例,了解浏览网页的过程中TCP/IP各层所做的工作。

发送方:

(1)打开浏览器,输入网址:www.xxx.com,按Enter键,访问网页,其实就是访问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属于传输层。

如图1-5所示,总结TCP/IP协议模型对数据的封装。

图1-5