Linux 高性能服务器编程-TCP/IP 协议族

TCP/IP 协议详解

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

file

1.1.1 数据链路层

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

数据链路层两个常用的协议:

  • 地址解析协议:ARP (Address Resolve Protocol )
  • 逆地址解析协议: RARP (Reverse Address Resolve Protocol)

他们实现了 IP 地址和机器物理地址(通常是 MAC 地址,以太网、令牌环和802.11无限网络都使用 MAC地址)之间的相互转换。

网络层使用 IP 地址寻址一台机器,而数据链路层使用物理地址寻址一台机器。

ARP 协议用途:
网络层必须先将目标机器的 IP 地址转化成期物理地址,才能使用数据链路层提供的服务,这就是 APR 协议的用途。
RARP 协议用途:
RARP 协议仅用于网络上的某些无盘工作站,因为缺乏存储设备,无盘工作站无法记住自己的 IP 地址,但他们可以利用网卡上的物理地址来向网络管理者(服务器或网络管理软件)查询自身 IP 地址,运行 RARP 服务的网路管理者通常存有该网络上所有机器的物理地址到 IP 地址的映射。

1.1.2 网络层

网路层实现数据包的选路和转发
  • 广域网 :WAN (Wide Area Network)通常使用众多分级的路由器来连接分散的主机或 LAN
  • 局域网:LAN(Local Area Netword)

    通信的两台主机一般不是之间相连的,而是通过多个中间节点(路由器)连接的,网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。同时,网络层对上层协议隐藏了网络拓扑连接的细节,是的在传输层和网络应用程序看来,通信的双方是直接相连的。
    核心协议:因特网协议 IP(Internet Protocol):

    IP 协议根据数据包的目的 IP 地址来决定如何投递它,如果数据包不能直接发送给目标主机,那么IP 协议就为它寻找一个合适的(next hop)路由器,并将数据包交付给该路由器来转发。最终到达目标主机或因发送失败而被丢弃。可见 hop by hop 的方式确定通信协议。

    因特网控制报文协议 ICMP(Internet Control Message Protocol)

    它是 IP协议的重要补充,主要用于检测网络连接,报文格式如下:

    file

    8位类型字段主要用于区分报文类型。它将 ICMP报文分为两大类:

    • 一类是差错报文,这类报文主要用来回应网络错误,比如目标不可到达(类型为3)和重定向(类型为5)
    • 另一类是查询报文,这类报文主要用来查询网络信息。比如 ping 程序就是使用 ICMP报文查看目标是否可达(类型为8)。有的 ICMP报文还是用8位代码字段来进一步细分不同的条件。比如重定向报文使用代码值0表示对网络重定向,代码值1表示对主机重定向。

    ICMP报文使用 16 位校验和字段对整个报文(包括头部和内容部分)进行循环冗余校验(Cyclic Redundancy Check, CRC),以检验报文在传输过程中是否损坏。ICMP 协议并非严格意义上的网络层协议,因为它使用处于同一层的 IP 协议提供的服务(上层协议使用下层协议提供的服务)

    1.1.3 传输层

    传输层为两台主机上的应用程序提供端到端(end to end)的通信。

传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。
file
数据链路层(驱动程序)封装了物理网络的细节。网络层封装了网络连接的细节。传输层则为应用层封装了一条端到端的逻辑通信链路,它负责数据的收发、链路的超时重连等。

传输层协议:
  • 传输控制协议:TCP协议 (Transmission Control Protoclo)
    为应用层提供可靠的、面向连接的和基于流的服务。TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,因此 TCP 服务是可靠的。使用 TCP 协议通信的双方必须先建立 TCP 连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。当通信结束时,双方必须关闭连接,释放内核数据。TCP 数据基于流,没有长度限制。
  • 用户数据报协议 UDP协议(User Datagram Protocol)
    它为应用层提供不可靠、无连接和基于数据报的服务,无法保证数据从正确的传送到目的端。且舞连接,通信双方不能保持一个长久的连接,且 UDP数据报都有一个长度。接收端必须以该长度为最小单位一次性读出,否则数据会被截断。
  • 流控制传输协议 SCTP协议 (Stream Control Trasmission Protocol)
    为因特网上传输电话信号而设计

    1.1.4 应用层

    应用层负责处理应用程序的逻辑。

数据链路层、网络层、和传输层负责网络通信细节,所以在内核空间实现,应用层多在用户空间实现。

应用层协议:
  • ping 是应用程序,利用 ICMP报文检测网络连接。
  • telnet 是远程登录协议
  • 开放最短路径优先: OSPF(Open Shortest Path First): 动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息
  • DNS(Domain Name Service 域名服务)协议提供机器域名到 IP地址的转

    应用层协议可能跳过传输层,之间调用网络层的服务,比如 ping 和 OSPF 协议。 可通过查看 /etc/services 查看所有知名的应用层协议。

1.2 封装

上层协议通过封装(encapsulation)使用下层协议提供的服务。

file

应用程序在发送到物理网络上之前,沿着协议栈从上向下传递,每层协议都在上层协议的基础上加上自己的头部信息(有时包括尾部信息)

经过TCP 封装后的数据称为 TCP报文段 (TCP message segment),或简称 TCP 段。 TCP头部信息 和 TCP内核缓冲区(发送缓冲区或接受缓冲区)一起构成了TCP报文段。
file

当发送端应用程序使用 send (或 write)向一个 TCP 连接写入数据时,内核中的 TCP模块首先把这些数据复制到与该 TCP连接对应的 TCP 内核发送缓冲区中,然后TCP 模块调用 IP 模块提供的服务,传递的参数包括 TCP 头部信息和 TCP 发送缓冲区中的数据。
经过 UDP封装后的数据称为 UDP数据报(UDP datagram)。UDP无需为应用层数据保存副本,因为其本身是不可靠的,当一个 UDP 数据报 被发送以后, UDP 内核缓冲区中的该 数据报就被废弃了,如果重发,则应用程序需从用户空间将该数据报拷贝到 UDP 内核发送缓冲区中。
经过 IP 封装后的数据称为 IP 数据报,IP 数据报包括头部信息和数据部分(TCP报文段、UDP数据报或 ICMP报文)。
经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧的种类也不同,如以太网传输以太帧,令牌环网络上传输令牌环帧。
以太网帧使用6最的目的物理地址,6字节的源物理地址来表示通信双方,CRC对帧的其他部分提供循环冗余校验。
file
帧的最大传输单元(Max Transmit Unit,MTU),即帧最多能携带多上上层协议数据(如IP数据报),通常受到网络类型限制。 如图 以太网帧的 MTU 为 1500 字节。所以过长的 IP 数据报可能需要被分片(fragment)传输。

帧才是最终在物理网络上传送的字节序列。

1.3 分用

当帧到达目的主机时,将沿着协议栈自底向上以此传递。
各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并将处理后的帧交给目标应用程序。
(dumultiplexing)

file
因为 IP 协议、ARP 协议、RARP 协议都使用帧传输数据,帧头部提供字段区分(具体取决于帧类型)。以太帧使用2字节的类型字段来标识上层协议。

1.4 测试网络

为了分析 ARP协议 IP 协议 ICMP 协议 TCP 协议 DNS 协议,来准备测试网络,包括 A B 主机。

file
对于路由器,不涉及 ISP (Internet Service Provider 因特网服务提供商),因为用不到。

1.5 ARP协议工作原理

ARP协议能实现任意网络层地址到任意物理地址的转换。

主机向自己所在的网络广播一个 ARP 请求,该请求包含目标机器的网络地址,此网络上其他机器都收到此请求,但只有被请求的目标机器会回应一个 ARP 应答,其中包括自己的物理地址。。

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

file

  • 硬件类型:定义物理地址的类型, 1 表示 MAC 地址
  • 协议类型: 要映射的协议地址类型,如 0x800 表示 IP 地址
  • 硬件地址长度 + 协议地址长度 :单位 字节, MAC 为 6, IP (v4)为 4
  • 操作: ARP 请求为 1 ,ARP 应答为 2 ,RARP 请求 为 3 ,RARP 应答为 4
  • 最后 4 个指定通信双方的以太网地址和IP地址。发送端填充除 目的端以太网地址 外其他3字段,构建ARP请求并发送,接收端 把自己以太网地址填进去,然后交换目的端地址和发送端地址,然后构建ARP 应答。

1.5.2 ARP 高速缓存的查看和修改

ARP 维护一个高速缓存,包括经常访问(如网关地址)或最近访问的机器的 IP地址到物理地址的映射。
避免重复请求,提高发送数据包速度。

可使用 arp 命令来查看和修改 ARP 高速缓存,如使用 arp-a (ARP 高速缓存是动态变化)

  • 删除 ARP 缓存: arp -d 192.168.1.109
  • 添加 ARR 缓存: arp -s 192.168.1.109 08:00:27:53:10:67

1.5.3 使用 tcpdump 观察ARP通信过程

1.6 DNS 工作原理

1.6.1 DNS查询和应答报文详解

DNS  是一套分布式的域名服务系统。

每个DNS 服务器上都存放大量的机器名和IP 地址的映射,并且是动态更新的,众多网络客户端都使用DNS 协议来向 DNS 服务器查询目标主机的 IP 。
DNS 查询、应答报文:
file
16 位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
16 位标志字段用于协商具体的通信方式和返回通信状态。
file

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

接下来 4 个字段分别指出 DNS 报文的最后 4 个字段的资源记录数目。对于查询报文 它包含一个查询问题。 对于 应答资源记录数、授权资源记录数、额外资源记录数 为 0. 应答报文的 应答资源记录数至少为 1,而授权资源记录数和额外资源记录数可为0 或 非 0
查询问题的格式如图:
file
查询名以一定的格式封装了要查询的主机域名。16 位查询类型表示如何执行查询操作,常见类型如下:

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

应答字段、授权字段、额外信息字段都使用资源记录(Resource Record,RR)格式:
file

  • 32 位域名 是该记录中与资源对应的名字,其格和查询问题中的查询名字段相同。
  • 16位类型和16位类 字段的含义也与 DNS 查询问题的对应字段相同
  • 32位生存时间表示 该查询记录结果可被本地客户端缓存多少秒
  • 16位资源数据长度和资源数据的长度取决于类型字段。对于类型 A 资源数据是 32 位 IPv4 地址,而资源长度则为 4 个字节

1.6.2 访问 DNS 服务

/etc/resolv.conf 存放 DNS 服务器的 IP 地址
向首选 DNS服务器 查询 IP 地址
host -t A www.baidu.com

1.6.3 使用 tcpdump 观察 DNS 通信过程

sudo tcpdumpt -i eth0 -nt -s 500 port domain
host -t A www.baidu.com

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

操作系统需要实现一组系统调用,使得应用程序能够访问 数据链路层、网络层、传输层提供的服务。

实现这组系统调用的 API主要有两套:socket 和 XTI(基本不使用)。
socket 定义的API 提供两点功能:

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

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!