Linux高性能服务器编程(1)
TCP/IP协议族体系结构以及主要协议
1.数据链路层
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网,令牌环等)上传输。
数据链路层两个常用的协议是ARP协议和RARP协议。它们实现了IP地址和机器物理地址(通常是MAC地址,以太网、令牌环和802.11无线网络都使用MAC地址)之间的转换。ARP协议用途,网络层先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务。
2.网络层
网络层实现数据包的选路和转发。WAN(广域网)通常使用众多分级的路由器来连接分散的主机或LAN。通信的主机一般不直接相连,二十通过多个中间节点(路由器)连接。网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。
网络层的核心协议是IP协议。IP协议根据数据包的目的IP地址来决定如何投递它。ICMP(因特网控制报文协议),它是IP协议的重要补充,主要用于检测网络连接。8位类型字段用于区分报文类型。它将ICMP报文分为两大类:一类是差错报文,这类报文主要用来回应网络错误,比如目标不可到达(3)和重定向(5);另一类是查询报文,这些报文用来查询网络信息,比如ping程序用ICMP报文查询目标是否可到达(8)的。ICMP使用处于同一层的IP协议提供的服务,不算严格意义上的网络层协议(一般来说,上层协议使用下层协议提供的服务)。
3.传输层
传输层为两台主机上的应用程序提供端到端的通信。传输层只关心起始端和目的端,不在乎数据包的中转过程。
传输层三大协议:TCP、UDP、SCTP
TCP | UDP | |
---|---|---|
是否连接 | 有连接 | 无连接 |
是否可靠 | 可靠,使用流量控制和拥塞控制 | 不可靠,不使用流量控制和拥塞控制 |
连接对象个数 | 一对一 | 一对一,一对多,多对一,多对多 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
适用场景 | 适用可靠传输 | 实时传输 |
TCP协议使用超时重传、数据确认、等方式来确保数据包真确地发送至目的端,因此TCP服务是可靠的。TCP服务基于流,没有边界限制,它源源不断地从通信一端流入另一端。
4.应用层
应用层负责处理应用程序地逻辑。
ping是应用程序,利用ICMP报文检测网络连接,是调试网络环境地必备工具。
telent协议是一种远程登录协议,它使我们能在本地完成远程任务。
OSPF(开放最短路径优先)是一种动态路由更新协议,用于路由器之间通信,以告知对方各自的路由信息。
DNS(域名解析协议)提供机器域名到IP地址的转换。
封装
**TCP/IP协议族的上层协议是通过封装来使用下层服务的。**应用程序数据在发送到物理网络之前,将沿着协议族从上往下依次封装。每层协议都将在上层协议的基础上加上自己的头部信息(以太网还包括尾部信息),以实现改成的功能,这个过程就是封装。
**经过TCP封装后的数据成为TCP报文段,或简称TCP段。**TCP协议为通信双方维护一个连接,并且在内核中存储相关数据。这部分数据中的TCP头部信息和TCP内核缓冲区(发送缓冲区或是接收缓冲区)数据一起构成了TCP报文段。
当发送端应用程序使用sendto(或write)函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。
**经过UDP封装后的数据称为UDP数据报 。**UDP对应用程序的封装与TCP类似。不同的是,UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的。当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了(因此UDP没有真正意义上的发送缓冲区,sendto的数据直接交给内核,由内核进行交给网络层)。如果应用程序检测到该数据报未能被接受端正确接收,并打算重新发送这个数据报,则应用程序需要重新从用户空间将该数据拷贝到UDP内核中。
**经过IP封装后的数据称为IP数据报 。**IP数据报包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报或者ICMP报文。
**经过数据链路层封装的数据称为帧(frame) 。**传输媒介不同,帧的类型也不同。比如以太网上传输的是以太网帧,而令牌环网上传输的则是令牌环帧。
分用
当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终依靠头部信息中的类型字段实现的。
因为IP协议、ARP协议和RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段来区分它们。以太网帧就是使用2个字节的类型字段来区分上层协议。
以以太网帧为例,若主机收到的以太网帧类型字段为0x800,则帧的数据部分为IP数据报,以太网驱动程序就将帧交付给IP模块;若以太网类型字段为0x806,则帧的数据部分为ARP请求或应答报文,以太网驱动程序将帧交付给ARP模块。若以太网类型字段为0x835,则帧的数据部分为RARP请求或应答报文,以太网驱动程序将帧交付给RARP模块。
TCP报文段/UDP数据报通过头部中16位的端口号字段来区分上层应用程序。如DNS协议对应的端口号是53,HTTP协议的端口号是80.
/UDP数据报通过头部中16位的端口号字段来区分上层应用程序。如DNS协议对应的端口号是53,HTTP协议的端口号是80.
帧通过分用步骤后,最终将封装前的原始数据送至目标服务(如上图)