《Linux高性能服务器编程》一书阅读笔记(一)

第一章TCP/IP协议族

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

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

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

TCP/IP协议体系结构

1.1.1 数据链路层

数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。

数据链路层常用的两个协议是ARP(Address Resolve Protocol, 地址解析协议)协议和RARP(Reverse Address Resolve Protocol,逆地址解析协议)协议。它们实现了IP地址和机器的物理地址(通常是MAC地址,以太网…)之间的转换。

网络层使用IP地址寻找一台机器,而链路层使用物理地址来寻找一台机器,因此网络层必须先将IP地址转化为物理地址才能使用数据链路层提供的服务,这就是ARP协议的作用。

1.1.2 网络层

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

网络层最核心的协议是IP(Internet Protocol,因特网协议)协议。IP协议通过数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目标主机,那么IP协议就为它寻找合适的下一跳路由器,并将数据包交付给该路由器来转发,多次重复这一过程,直到数据包到达指定主句,或者失败被丢弃。可见,IP协议通过逐跳的方式确定通信路径。

1.1.3 传输层

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

数据传输层

传输层协议主要有三个:TCP协议、UDP协议和SCTP协议。

TCP(Transmission Control Protocol,控制传输协议)协议为应用层提供可靠的、面向连接的和基于流(stream)的服务。TCP协议使用超时重传、确认数据等方式确保数据包被正确传送到目的端,因此TCP传输是可靠的。使用TCP协议通信的双方必须先建立起TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接状态、读写缓冲区、以及诸多定时器等。当通信结束的时候,双方必须关闭连接以释放内核中存储的数据。TCP服务是基于流的。基于流(stream)的数据是没有边界的限制,就是没有长度的限制,它源源不断的从通信的这一端流入另一端,发送端可以逐个向数据流中写入数据,接收端也可以逐个从数据流中读取数据。

UDP(User Datagram Protocol,用户数据报协议)协议则与TCP协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务。“不可靠”意味着UDP协议无法保证数据正确的从传送端发送到目的端。如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,UDP协议只是简单的通知应用程序发送失败。因此,使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。UDP协议是无连接的,即通信双方不保持一个长久连接,因此应用程序每次发送数据都要明确指定接收端地址(IP地址等信息)。基于数据报服务,是相对于基于流服务而言的。每个UDP数据报都有一个长度,接收端必须以该长度为最小单位一次性将所有内容一次性全部读出,否则数据将被截断。

SCTP协议(Stream Control Transmission Protocol,流控制传输协议)是一种较新的传输层协议,是为了因特网上传输电话信号而设计的。

1.1.4 应用层

应用层负责处理应用程序的逻辑。数据链路层、应用层、传输层负责处理网络通信细节,这部分必须即稳定又高效,因此他们都是在内核空间中实现。而应用层则在用户空间实现,因为它处理众多逻辑,比如文件传输、名称查询和网络管理等。如果应用层也在内核空间中实现,会使内核变得异常庞大。

应用层的协议有很多,比如:

ping是应用程序,而不是协议。利用ICMP报文检测网络连接,是调试网络环境的必备工具。

telent是一种远程登录协议,它使我们能在本地完成远程任务。

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

DNS(Domain Name Server, 域名服务)协议提供机器域名到IP地址的转换。

应用层协议(或者程序)可能会直接跳过传输层直接使用网络层协议,比如ping程序和OSPF协议。应用层协议通常既可以使用TCP服务,又可以使用UDP服务,比如DNS协议。

1.2封装

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

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

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

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

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

经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧的类型也不同。比如,以太网上传输的是以太网帧,而令牌环网络上传输的帧则是令牌帧。比如以太网帧,其封装格式如下:

以太网帧使用6字节的目的物理地址和6字节的源物理地址来表示通信的双方。

帧的最大传输单元(Max Transmit Unit, MTU),即帧最多能携带上多少上层协议数据(比如IP数据报),通常收到网络类型的限制,比如上图中以太网的MTU是1500字节,所以过长的IP数据报可能需要被分片传输。

1.3 分用

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

因为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文件中找到。

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

1.4 测试网络

1.5 ARP协议工作原理

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

1.5.1 以太网ARP请求/应答报文详解

以太网ARP请求/应答报文的格式如下:

  1. 硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。
  2. 协议类型字段表示要映射的协议地址的类型,它的值为0x800,表示IP地址。
  3. 硬件地址长度字段和协议地址长度字段,其单位是字节,对MAC地址来说,其长度为6,对IP(v4)地址来说,长度为4 。
  4. 操作字段指出四种操作类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。
  5. 最后4个字段指定通信双方的以太网地址和IP地址。

1.6 DNS工作原理

1.6.1 DNS查询和应答报文详解

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

16位标识字段是用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。

16位标识符字段用于协商具体的通信方式和反馈通信状态。DNS报文头部的16位标志字段的细节如下:

含义分别为:

  • QR,查询/应答标志,0表示是查询报文,1表示是应答报文。
  • opcode,定义查询和应答的类型。0是标准查询,1表示反向查询(由IP地址获取主机域名),2表示请求服务器状态。
  • AA,授权应答标志。仅由应答报文使用。1表示域名服务器是授权服务器。
  • TC,截断标志,仅当DNS报文使用UDP服务时使用,因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断。
  • RD,递归查询标志。
  • RA,允许递归标志。
  • ZERO,这3位未用,必须设置为0.
  • rcode,4位返回码,表示应答状态。常用值有0(无错误)和3(域名不存在)。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇