TCP/IP协议族——Linux高性能服务器

目前,TCP/IP协议族是Internet使用的主流协议族,它是一个分层、多协议的通信体系

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

TCP/IP协议族是一个四层协议系统。每一层完成不同功能,通过若干协议实现、上层协议使用下层协议提供的服务。如图:

数据链路层

作用:实现网卡接口的网络驱动程序,以处理数据在物理媒介(eg:以太网、令牌环)上的传输。不同的物理网络有不同的电气特性,网络驱动程序隐藏了这些细节为上层协议提供统一的接口。
常用协议==ARP协议(地址解析协议)、RARP协议(逆地址解析协议)==它们实现了IP地址和机器地址物理地址(通常为MAC地址 eg:以太网、令牌环和802.11无线网络都使用MAC地址)

  • ARP协议用途:网络层使用IP地址寻找一台机器,数据链路层使用物理地址寻址一台机器,因此网络层必须先把目标机器的IP地址转换成物理地址才能在数据链路层使用。
  • RARP协议用途:网络上某些无盘工作站。由于缺乏存储设备,无盘工作站无法记住自己的IP地址,但可以利用网卡上的物理地址向网络管理者(服务器或网络管理软件)查询自己的IP地址。运行RARP服务的网络管理者通常存有该网络上所有机器的物理地址到IP地址的映射。
网络层

作用:实现数据包的选路和转发。WAN(广域网)通常使用众多分级的路由器来连接分散的主机或LAN(局域网),因此众多的主机一般不是直接相连的,而是通过中间节点(路由器)连接。
网络层的任务就是选择这些中间节点,从而确定主机间的通信方式。网络层向上级隐藏了网络拓扑结构的连接细节,使在传输层、应用层程序看来通信双方是相连的。
协议

  • 核心协议IP协议(因特网协议):根据数据包的目的IP来决定如何投递它,如果数据包不能直接发送给目标主机,那么IP协议就为它寻找一个合适的下一跳【next hop】路由器,并把数据包交给这个路由器来转发。多次重复以上步骤,数据包最终到达主机或因发送失败而被丢弃。--------->IP协议使用逐跳的方式确定通信路径
  • ICMP协议(因特网控制报文协议):IP协议的重要补充,主要用于检测网络连接报文格式:
    8位类型字段用于区分报文类型:差错报文:主要用于回应网络错误;查询报文:用于查询网络信息。
    有ICMP报文使用8位代码字段来进一步细分不同的条件(eg:重定向报文用代码值0表示网络重定向、代码值1表示对主机重定向)
    用16位效验码和字段对整个报文(头部和内容)进行循环冗余校验(CRC)以检验报文在传输过程中是否损坏。

注意:ICMP并非严格意义上的网络层协议,因为一般来说上层协议使用下层提供的服务,而它使用了处于同一层的IP协议提供的服务。

传输层

作用:传输层为两主机上的应用程序提供端到端的通信方式。传输层只关心通信的起始及目的端,并不在乎数据包的中转过程。区别:

垂直线表示TCP/IP协议族各层间的实体通信(数据包),水平线表示逻辑通信线路。驱动程序(数据链路层)封装了物理网络的电气细节、网络层封装了网络连接的细节、传输层为应用程序封装了端到端的逻辑通信细节,负责数据的收发、链路的超时重连
协议TCP协议、UDP协议、SCTP协议

  • TCP协议(传输控制协议);为应用层提供可靠的、面向连接的、基于流的服务。使用超时重传、数据确认等方式来确保数据包被正确的发送到目的端,因此TCP协议是可靠的。使用TCP协议通信双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区、定时器等。通信结束时双方关闭连接以释放内核资源。基于流的数据没有边界【长度】限制,可以源源不断地从通信的一端流向另一端。发送端可以逐个字节向数据流写入数据,接收端也可逐个字节读出。
  • UDP协议(用户数据报协议):为应用层提供不可靠的、无连接的、基于数据报的服务不可靠:UDP协议无法确保数据从发送端正确的传送到目的端,【数据中途丢失/目的端通过数据校验发现数据错误并丢弃,UDP协议仅通知应用程序发送失败】使用UDP协议的应用程序应该自己处理数据确认、超时重连等逻辑;无连接:通信双方不会保持长久联系,应用程序每次发送数据都要明确指定接收端的地址;基于数据报:每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将数据一次读出,否则数据被截断。
  • SCTP协议(流控制传输协议):是一种较新的传输层协议,为了在因特网上传输电话信号而设计。
应用层

作用:处理应用程序的逻辑。数据链路层、网络层、传输层负责处理网络通信细节,必须稳定、高效,因此在内核空间实现
应用层处理众多逻辑(eg:文件传输、名称查询、网络管理…),如果在内核中实现会让内核非常庞大,所以多在应用层实现,也有少数服务器程序在内核中实现应用层,使得代码无需在用户空间、内核空间之间切换,减少数据的复制,极大提高工作效率。但这种代码实现复杂、不灵活、不便于移植。

  • ping是应用程序,并非协议,它利用ICMP报文检测网络连接,是调试网络环境的必备软件

协议(仅列举其中几个)

  • telnet协议是一种远程登录协议,它使我们能在本地完成远程任务。
  • OSPF (开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息。
  • DNS (域名服务)协议提供机器域名到IP地址的转换。

应用层协议(程序)可能跳过传输层直接使用网络层提供的服务,比如ping程序和DNS协议。我们可以通过/etc/services文件查看所有知名的应用层协议,以及它们都能使用哪些传输层服务

封装

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

经过TCP封装后的数据称为TCP报文段(简称TCP段),知道TCP协议为通信双方维持一个连接,并且在内核中存储相关数据。这部分数据中的TCP头部信息和TCP内核缓冲区(发送缓冲区或接收缓冲区)数据一起构成了TCP报文段,如(封装过程)图:

当发送端应用程序使用send/write函数向一个TCP连接写人数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。
经过UDP封装后的数据称为UDP数据报。UDP对应用程序数据的封装与TCP类似。不同的是,UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的。当一个UDP数据报被成功发送之后,UDP 内核缓冲区中的该数据报就被丢弃了。如果应用程序检测到该数据报未能被接收端正确接收,并打算重发这个数据报,则应用程序需要重新从用户空间将该数据报拷贝到UDP内核发送缓冲区中
经过IP封装后的数据称为IP数据报。IP 数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报或者ICMP报文。
经过数据链路层封装的数据称为。 传输媒介不同,帧的类型也不同。比如,以太网上传输的是以太网帧,而令牌环网络上传输的则是令牌环帧。以以太网帧为例,其封装格式如图:

以太网帧使用6字节的目的物理地址和6字节的源物理地址来表示通信的双方。关于类型(type)字段,之后加上。4字节CRC字段对帧的其他部分提供循环冗余校验。2字节类型字段标识上层协议。
帧的最大传输单元( MTU),即帧最多能携带多少上层协议数据(比如IP数据报),通常受到网络类型的限制。图中以太网帧的MTU是1500字节。正因为如此,过长的IP数据报可能需要被分片传输。
帧才是最终在物理网络上传送的字节序列

分用

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

因为IP协议、ARP协议和RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段来区分它们。

以太网帧中2字节的类型字段标识上层协议。
如果主机接收到的以太网帧类型字段的值为0x800,则帧的数据部分为IP数据报,以太网驱动程序就将帧交付给IP模块:
若类型字段的值为0x806,则帧的数据部分为ARP请求或应答报文,以太网驱动程序就将帧交付给ARP模块;
若类型字段的值为0x835,则帧的数据部分为RARP请求或应答报文,以太网驱动程序就将帧交付给RARP模块。

同样,因为ICMP协议、TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用16位的协议字段来区分它们。TCP报文段和UDP数据报则通过其头部中的16位的端口号字段来区分上层应用程序

比如DNS协议对应的端口号是53, HTTP 协议(超文本传送协议)对应的端口号是80.所有知名应用层协议使用的端口号都可在/etc/services文件中找到。

帧通过上述分用步骤后,最终将封装前的原始数据送至目标服务(图中的ARP服务、RARP服务、ICMP 服务或者应用程序)。这样,在顶层目标服务看来,封装和分用似乎没有发生过。

测试网络

如图测试网络,包括2主机:A、B,一个连接到因特网的路由器。
主要用来分析ARP协议、IP协议、TCP协议和DNS协议。通过抓取该网络上的以太网帧,查看以太网帧头部、IP数据报头部、TCP报文段头部信息,从而获取网络通信细节。

ARP协议工作原理

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

以太网ARP请求/应答报文

格式:

各字段:

  • 硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。
  • 协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。
  • 硬件地址长度字段和协议地址长度字段,顾名思义,其单位是字节。对MAC地址来说,其长度为6、对IP (v4) 地址来说,其长度为4。
  • 操作字段指出4种操作类型: ARP 请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。
  • 最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的其他3个字段,以构建ARP请求并发送。接收端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回(操作字段需要设置为2).

ARP请求/应答报文的长度为28字节。如果再加上以太网帧头部和尾部的18字节,则一个携带ARP请求/应答报文的以太网帧长度为46字节。不过有的实现要求以太网帧数据部分长度至少为46字节,此时ARP请求/应答报文将增加一些填充字节, 以满足这个要求。在这种情况下,一个携带ARP请求/应答报文的以太网帧长度为64字节。

ARP高速缓存的查看&修改

通常,ARP维护一个高速缓存,其中包含经常访问(比如网关地址)或最近访问的机器的IP地址到物理地址的映射。这样就避免了重复的ARP请求,提高了发送数据包的速度
Linux下可以使用arp命令来查看和修改ARP高速缓存。比如,enest-laptop在某一时刻(注意,ARP高速缓存是动态变化的)的ARP缓存内容如下
arp -a:

第一项描述另一台测试机器Kongming20,第二项描述路由器。

sudo arp -d 192.168.1.109  #删除测试机器对应的ARP缓存项
sudo arp -s 192.168.1.109 08:00:27:53:10:67  #添加Kongming20对应的ARP缓存项
使用tcpdump观察ARP通信过程

为清楚了解ARP运行过程,从ernest-laptop上执行telnet命令登录测试机器的echo服务,用tcpdump抓取过程中两个机器之间交换的以太网帧。操作:

sudo aro -d 192.168.1.109   #清除ARP缓存中kongming20对应项
#在执行telnet命令前必须清除,否则ARP通信不被执行无法抓取期望的以太网帧
sudo tcpdump -i eth0 -ent '(dst 192.168.1.109 and src 192.168.1.108)or(dst 192.168.1.108 and src 192.168.1.109)'     #没有特殊声明,抓包都在ernest-laptop上执行
telnet 192.168.1.109        #开启另一个终端执行telnet命令
Trying 192.168.1.109...
# 在两台主机间建立联系
Connected to 192.168.1.109.
Escape character is 'J'     #ctrl+j回车以调出telnet程序的命令提示符

telnet> quit(回车)          #在telnet命令符后输入quit退出客户端程序,因为ARP通信在TCP连接前完成,不关心之后的内容
Connection closed.
#在抓取到的数据包中只有最前面2个与ARP相关


由tepdump抓取的数据包本质上是以太网帧,我们通过该命令的众多选项来控制帧的过滤/显示。

用dst和sre指定通信的目的端IP地址和源端IP地址
用-e选项开启以太网帧头部信息的显示。

ARP通信过程
第一,我们将两次传输的以太网帧按照以太网帧封装格式绘制在图的下半部分
第二,ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧(比如携带IP数据报的以太网帧)的区别。
第三,路由器也将接收到以太网帧1,因为该帧是一个广播帧。不过路由器并没有回应其中的ARP请求,目的端的物理地址是以太网广播地址,表示整个LAN,只有该LAN上所有机器能收到并处理这样的帧。

DNS工作原理

我们通常使用机器的城名来访问这台机器,而不直接使用其IP地址.。那么如何将机器的域名转换成IP地址呢?这就需要使用域名查询服务。城名查询服务有很多种实现方式,比如NIS (网络信息服务)、 DNS和本地静态文件等。

DNS查询&应答报文

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

16位标识字段用于标记一对DNS查询&应答,以此确认DNS回应是对哪个DNS查询的回应。
16位标志字段用于协商具体的通信方式和反馈通信状态
标志字段图:

含义:

  • QR,查询/应答标志。0表示这是-一个查询报文,1 表示这是一个应答报文。
  • opcode,定义查询和应答的类型。0表示标准查询,1 表示反向查询(由IP地址获得主机域名),2表示请求服务器状态。
  • AA,授权应答标志,仅由应答报文使用。1表示域名服务器是授权服务器。
  • TC,截断标志,仅当DNS报文使用UDP服务时使用。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1 表示DNS报文超过512字节,并被截断。
  • RD,递归查询标志。1表示执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直到获得结果并把该结果返回给客户端。0表示执行迭代查询,即如果目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供客户端参考。
  • RA,允许递归标志。仅由应答报文使用,1 表示DNS服务器支持递归查询。
  • zero,这3位未用,必须都设置为0.
  • rcode, 4位返回码,表示应答的状态。常用值:0 (无错误)和3 (域名不存在)。

查询问题
对于查询报文一般含一个查询问题。

查询名以一定格式封装要查询的主机域名
16位查询类型表示如何执行查询操作,常见操作:

  • 类型A,值为1,表示获取目标主机的IP地址
  • 类型CNAME,值是5,表示获得目标主机的别名。
  • 类型PTR,值是12,表示反向查询。

16位查询类常为1,表示获取因特网地址(IP地址)

应答字段、授权字段、额外信息字段都使用资源记录格式,如图:


32位域名是该纪录中与资源对应的名字,格式同查询问题中查询名字段。
16位类型、16位类字段含义与DNS查询问题中对应字段相同
32位生存时间表示该查询记录的结果可以被本地客户端程序访问多久
16位资源数据长度字段和资源数据字段的内容取决于类型字段。【eg:对类型A而言,资源数据是32位的IPv4地址,而资源数据长度则为4 (以字节为单位)】

Linux下访问DNS服务

访问DNS服务,要先知道DNS服务器的IP地址.Linux下用/etc/resolv.conf文件存放DNS服务器的IP地址。书中ernest-laptop机器文件内容:

两IP地址分别是首选DNS服务器地址和备选DNS服务器地址。【由网络管理程序写入】
常用访问DNS服务器的客户端程序:host
host命令使用DNS协议&DNS服务器通信,-t看DNS协议使用了哪种查询类型

host -t A www.baidu.com  #向首选DNS服务器查询机器的IP地址
用tcpdump观察DNS通信过程

操作:

sudo tcpdump -i eth0 -nt -s 500 port domain 
#使用port domain过滤数据包,表只抓取使用domain域名服务的数据包,即DNS查询&应答报文
host -t A www.baidu.com

tcpdump以“IP地址.端口号”形式描述通信的某一端,“>”表示数据传输的方式,“>”前面是源端、后面是目的端。输出数据包:第一个是机器向首选DNS服务器发送的DNS查询报文;第二个是服务器反馈的DNS应答报文。
注:tcpdump -x选项可看到DNS报文的每一字节。

socket和TCP/IP协议族的关系

数据链路层、网络层、传输层协议是在内核中实现的,所以操作系统需要实现一组系统调用,让应用程序能访问协议提供的服务。socket就是实现这组调用的API(应用程序接口)。
由socket定义的这一组API提供两点功能:

  • 将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据(比如图1-5 所示的send函数),或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据:
  • 应用程序可以通过它们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信的行为,如修改setsockopt函数设置IP数据包在网络上存活时间

socket是一套通用网络编程接口,不仅能访问内核中TCP/IP协议栈,还能访问其他网络协议栈

发布了48 篇原创文章 · 获赞 4 · 访问量 4120

猜你喜欢

转载自blog.csdn.net/qq_41403559/article/details/104411318