1.1 TCP/IP协议族体系结构以及主要协议

TCP/IP协议族是一个四层协议系统,自底向上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。如图1-1所示。

TCP/IP协议族笔记1-LMLPHP

                                 图1-1 TCP/IP协议族体系结构及主要协议

1.1.1数据链路层

数据链路层实现了网卡接口的网络驱动程序,以及处理数据在物理媒介(比如以太网、令牌环等)的传输。不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。

数据链路层两个常用协议是ARP(地址解析协议)和RARP(逆地址解析协议)他们实现了IP地址和机器物理地址(通常是MAC地址)之间的相互转换

网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须先将目标机器的IP地址转换成其物理地址,才能使用数据链路层提供的服务,这就是ARP的用途。运行RARP服务的网络管理者通常存有该网络上所有机器的物理地址到IP地址的映射。

1.1.2网络层

网络层实现数据包的选路和转发。WAN(Wide Area Network,广域网)通常使用众多分级的路由器来连接分散的主机或LAN(Local Area Network,局域网),因此,通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的。网络层的任务就是选择这些节点,以确定两台主机之间的通信路径。

网络层最核心的协议是IP协议。IP协议根据数据包的目的IP地址来决定如何投递它。IP协议选择逐跳的方式确定通信路径。

另外一个协议是ICMP协议(Internet Control Message Protocol,因特网控制报文协议)。它是IP协议的补充,主要用于检测网络连接。8位类型字段用于区分报文类型。它将ICMP报文分为两大类:一类是差错报文,这类报文主要用来回应网络错误,比如目标不可达(类型值为3)和重定向(5);另一类是查询报文,这类报文用来查询网络信息,比如ping程序就是用ICMP报文查看目标是否可到达(类型值为8)。

1.1.3传输层

传输层为两台主机上的应用程序提供端到端(end to end )的通信。与网路层使用的逐跳通信方式不同,传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。

数据链路层(驱动程序)封装了物理网络的电气细节;网路层封装了网络连接的细节;传输层则为应用程序 封装了一条端到端的逻辑通信链路,它负责数据的收发、链路的超时重传等。

TCP协议为应用层提供可靠的、面向连接的和基于流的服务。使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,因此TCP服务是可靠的。使用TCP协议通信的双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。

UDP协议为应用层提供不可靠、无连接和基于数据报的服务。UDP协议只是简单地通知应用程序发送失败。因此使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。

1.1.4应用层

应用层负责处理应用程序的逻辑。数据链路层、网络层和传输层负责处理网络通信细节,这部分既稳定又高效,因此他们在内核空间中实现,应用层在用户空间实现,因此它负责处理众多逻辑,比如文件传输、名称查询和网络管理等。

ping是应用程序,利用ICMP报文检测网络连接

telnet协议是一种远程登录协议,他使我们能在本都完成远程任务。

OSPF(开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间的通信,以告知对方各种的路由信息。

DNS(Domain Name Service,域名服务)协议提供机器域名到IP地址的转换。应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务,比如ping程序和OSPF协议。应用层协议(或程序)通常既可以使用TCP服务,又可以使用UDP服务,比如DNS协议。可以通过/etc/serverces文件查看所有知名的应用层协议。

1.2封装

上层协议是如何使用下层协议提供的服务呢?其实是通过封装实现的。应用程序在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程就称为封装。如图1-2

TCP/IP协议族笔记1-LMLPHP

                        图1-2 封装

经过TCP封装后的数据称为TCP报文段,TCP为通信双方维持一个连接,并且在内核中存储相关数据。这部分数据中的TCP头部信息和TCP内核缓冲区数据一起构成了TCP报文。

当发送端应用程序使用send(或者write)函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。

经UDP封装后称为UDP数据报。UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的。当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了。如果应用程序检测到该数据报未能被接收端正确接受,并打算重发这个数据报,则应用程序需要重新从用户空间将该数据报拷贝到UDP内核发送缓冲区。

经过IP封装后的数据称为IP数据报。IP数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报候或者ICMP报文。

经过数据链路层封装的数据称为帧。以太网帧使用6字节的目的物理地址和6字节的源物理地址来表述通信的双方。帧的最大传输单元Max Transmit Unit即帧最多能携带多少层上层协议数据,通常受到网络的限制。以太网的MTU是1500字节。过长的IP数据报可能需要被分片。帧才是最终在物理网络上传送的字节序列。

1.3分用

当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并将最终处理后的帧交给目标应用程序。这个过程称为分用。分用是依靠头部信息中的类型字段实现的。

因为ICMP协议、TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用16位的协议字段来控制他们。TCP报文段和UDP报文段则通过头部中的16位的端口号字段来区分上层应用程序。DNS协议端口号53,HTTP对应端口80.

帧通过上述分用步骤后,最终将封装前的原始数据送至目标服务

1.4 ARP协议工作原理

ARP协议能实现任意网络层地址到任意物理地址的转换。工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的机器会回应一个ARP应答,其中包含自己的物理地址。

1.5 DNS工作原理

DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。

使用tcpdump查看DNS通信过程

1.6 socket和TCP/IP协议族的关系

 数据链路层、网络层、传输层协议是在内核中实现的。因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务。实现这组系统调用的API主要有两套:socket和XTI。

由socket定义的这一组API提供如下两点功能:一是将应用程序从用户缓冲区中复制到TCP/IP内核发送缓冲区,以交付内核来发送数据(例如send函数),或者是从内核TCP/IP接收缓冲区中复制数据到用户缓冲区,以读取数据;二是应用程序可以通过他们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信的行为。比如通过setsocket函数来设置IP数据报在网络上的存活时间。

socket是一套通用网络编程接口,它不但可以访问内核中TCP/IP协议栈,而且可以访问其他网络协议栈(比如X.25协议栈、Unix本地域协议栈等)。

 

10-03 17:10