Linux 网络基础知识

基本概念

Internet(1980 年代)由 ARPANET(1970 年代)发展而来。

网络硬件

组成计算机网络的组件大致有下面这些:

  • 节点(Node):节点是具有网络地址(IP)设备的统称。
  • 服务器(Server):提供数据给用户的主机就能被称为一台服务器。
  • 工作站(Workstation):任何可以在网络输入的设备都可以是工作站。
  • 客户端(Client):主动发起连接去请求数据的,就可以称为客户端。
  • 网卡(NIC,Network Interface Card):用于提供网络连接的设备。
  • 网络接口:利用软件设计出来的网络接口,主要提供网络地址(IP)。
  • 网络拓扑(Topology):各个节点在网络上面的链接方式,通常指物理连接方式。
  • 网关(Gateway):具有两个以上的网络接口,可以连接两个以上不同网段的设备叫网关设备。

网络范围

依据网络的大小范围分为两类:局域网(LAN,Local Area Network)和广域网(WAN,Wide Area Network)。

OSI 七层协议

OSI(Open System Interconnection)七层协议是将整个网络连接过程分为数个层次(Layer),每个层次都有特定的独立功能。这样可以针对不同层次来编写程序,每个层次之间的功能互不干扰。

越接近硬件的层次为底层,越接近应用的层次为高层。无论是接收端还是发送端,每一层都只认识对方同一层次的数据。数据通过层层包装后发送,再由接收方层层解包。总体情况如下图所示:

OSI七层模型

上层包裹会放入下层数据中,而数据前面则是这个数据的报头。第二层比较特殊,它分为两个子层来处理数据。

每一层负责的任务如下:

  • Layer 1 物理层(Physical Layer)

    由于网络传输介质只能传送 0 和 1,因此物理层必须定义所使用的传输设备的电压与信号等。同时还必须了解数据帧转成比特流的编码方式,最后连接实际传输介质并发送/接收比特信号。代表设备有中继器(Repeater)和集线器。

  • Layer 2 数据链路层(Data-Link Layer)

    这一层比较特殊,分两个子层进行数据的转换操作。下层是实体定义,上层是软件封装定义。代表设备是网桥(Bridge):

    • 面向硬件主要负责的是 MAC(Media Access Control),也称这个数据包裹为 MAC 数据帧(Frame)。MAC 是网络接口设备所能处理的主要数据包,也是被物理层编码成比特流的数据。MAC 必须要经过通信协议来取得网络介质的使用权,目前最常用的是 IEEE 802.3 的以太网络协议。

    • 面向软件部分则是由逻辑链接层(LLC, Logical Link Control)所控制,主要处理来自上层的数据包(Packet)并转成 MAC 的格式,负责的工作包括信息交换、流量控制、错误问题的处理等。

  • Layer 3 网络层(Network Layer)

    网络地址(IP, Internet Protocol)就是在这一层定义。同时也定义出计算机之间的连接建立,终止与保持,数据包的传输路径选择等。因此这层除了 IP 外,就是数据包能否到达目的地的路由概念了。代表设备是路由器(Router)。

  • Layer 4 传输层 (Transport Layer)

    这一层定义了发送端与接收端的连接技术,如 TCP / UDP 技术。同时包括该技术的数据包格式,数据包的发送,流程控制,传输过程的检查与重新发送等,以确保各个资料数据包可以正确无误地到达目的端。

  • Layer 5 会话层 (Session Layer)

    定义了两个地址之间连接信道的连接与中断。此外,也可建立应用程序之间的会话,提供其他加强型服务,如网络管理,建立与断开,会话控制等。会话层用来确定网络服务建立的连接。

  • Layer 6 表示层 (Presentation Layer)

    将来自本地应用程序的数据格式转换或重新编码成网络的标准格式,然后再交给下面的传输层等来处理。所以,这一层主要定义的是网络服务之间的数据格式转换,包括数据的加密解密。

  • Layer 7 应用层 (Application Layer)

    应用层本身并不属于应用程序所有,而是定义了应用程序如何进入该层的沟通接口,以将数据接收或发送给应用程序,并最终展示给用户。

TCP/IP

TCP 协议是可靠的,面向连接的传输层协议,它能保证数据按顺序抵达目的地。该协议会把数据分割成数据包,也叫分段(Segment)。如果接收端没有向发送方返回分段确认,发送方将使用重传方案(Retransmission Scheme)来重发该分段。

IP 是把数据通过 Internet 发送实际所使用的方法或协议。与 TCP 不同的是,IP 是一个无连接的协议,这意味着在进行通信的两个端点之间没有连续的连接,数据的组合由 TCP 来完成。

其实 TCP/IP 也是使用 OSI 七层协议的观念,只是简化为四层:

  • OSI 七层协议中的数据链路层和物理层,在 TCP/IP 中统一为网络接口层。
  • 网络层没变,主要应用是 IP/ICMP。
  • 传输层也没变,主要应用是 TCP/UDP。
  • 而应用层,表示层和会话层合并称为应用层。相关应用有 HTTP,FTP,SSH,SMTP 等。

用网页浏览器举例,一个网站浏览的过程像这样:

  1. 应用程序:打开浏览器输入网址按下回车后,网址和相关数据会被浏览器包成数据包,向下开始传输。
  2. 应用层:由应用层提供的 HTTP 通信协议,将浏览器的数据封装起来,并给予一个应用层报头,丢给传输层。
  3. 传输层:由于 HTTP 为可靠连接,因此将数据丢入 TCP 封装内,并给予一个 TCP 封装的报头,然后传给网络层。
  4. 网络层:将 TCP 数据封装到 IP 数据包内,再给予一个 IP 包头(来源与目标 IP),传给网络接口层。
  5. 网络接口层:如果使用以太网络时,IP 会根据 CSMA/CD 标准,封装到 MAC 数据帧中,并给予 MAC 帧头,再转成比特流后,利用传输介质开始传送。
  6. 服务器接收到数据包后,以反方向解开,交给对应的层次进行分析。最后 WWW 服务软件获知请求的数据内容,将数据依循上面流程一层层封装,传送到用户手上。

TCP/IP 网络接口层相关协议

TCP/IP 最底层的网络接口层主要与硬件关系密切,下面分段解析相关硬件和协议。

广域网设备

广域网上使用的设备较多,最常见的有以下一些:

  • 传统电话拨号连接 PPP 协议(Point-to-Point Protocol)

    早期网络通过调制解调器加上电话线以及电脑的九针串行端口,通过 PPP 协议拨号获得网络 IP 参数来上网。速度很慢且会占用电话线路。PPP 支持 TCP/IP、NetBEUI、IPX/SPX 等通信协议。

  • 整合服务数字网络(ISDN,Integrated Services Digital Network)

    利用电话线路来联网,只是连接两端都需要有 ISDN 的调制解调器来提供连接功能。ISDN 的传输有多种信道可以使用,并能将多个信道整合应用,因此速度可以翻倍提升。例如美国规格使用 23 个以上信道来连接,每个 B 信道速度约 64Kbps,总速度可达 1.5Mbps 左右。

  • 非对称数字用户环路(ADSL,Asymmetric Digital Subscriber Line)的 PPPoE 协议(PPP over Ethernet)

    也是通过电话线来拨号取得 IP,不过使用的是电话的高频部分,与一般语音电话的频率不同,因此不影响电话使用。由于在中国上传/下载的带宽不同,因此才被称为非对称的环路。ADSL 同样使用调制解调器,只是它通过 PPPoE 的方法,将 PPP 仿真在以太网卡上,因此电脑需要通过一张网卡来连接到调制解调器,并通过拨号程序来取得新的接口(ppp0)。

  • 电缆调制解调器(Cable Modem)

    通过有线电视使用的缆线作为网络信号介质,同样需要具备调制解调器来连接到 ISP,以取得网络参数来上网。Cable Modem 的带宽主要是共享型,所以通常具有区域性。

局域网设备

局域网环境中,最常用的是以太网,其次还有光纤信道等。

早前 IEEE 所制定的以太网络标准为 802.3 的 IEEE 10BASE5,这个标准定义是:10 代表传输速度 10 Mbps,BASE 表示采用基带信号进行传输,5 表示每个网络节点之间最长可达 500 米。

传输介质也就是网线使用的是类似传统电话线的双绞线(Twisted Pair Ethernet),IEEE 将这种线路的以太网传输方式制定成 10BASE-T 的标准。10BASE-T 使用的是 10 Mbps 全速运行且采用非屏蔽双绞线(UTP)的网线。此外,10BASE-T 的 UTP 网线可以使用星形连接(Star),也就是以一个集线器为中心来连接各网络设备的方法。

后来 IEEE 制定了 802.3u 这个支持到 100 Mbps 传输速度的 100BASE-T 标准,这个标准同 10BASE-T 差异不大,只是双绞线制作需要更精良,同时也已经支持使用了四对绞线的网线,也就是目前很常见的 8 芯网线。这种网线常称为五类线(CAT5,Category 5)。这种传输速度的以太网就被称为 Fast Ethernet。

至于千兆网络 Gigabit Ethernet 使用的网线等级为 CAT5e 或 CAT6。每当传输速度增加,线材的电磁效应互相干扰会加强,因此对网线的要求更严格。

RJ-49 网络接口因为每条芯线的对应不同分为 568A 与 568B 接头:

接头/线序 1 2 3 4 5 6 7 8
568A 白绿 绿 白橙 白蓝 白棕
568B 白橙 白绿 白蓝 绿 白棕

对于 100 Mbps 网络,实际使用的只有 1、2、3、6 芯,根据网线连接不同设备线序不同,又分两种连接方式:

  • 交叉线:一边 568A 一边 568B 的接头时叫交叉线,用在直连两台主机的网卡。

  • 直连线:两头都是 568A 或 568B 时叫直连线,用来连接主机网卡与网络设备。

CSMA/CD

以太网的核心是以太网卡,每张网卡在生产时都会有一个 MAC 地址(Media Access Control),也称为硬件地址或物理地址。以太网卡之间的数据传输采用 CSMA/CD(Carrier Sense Multiple Access with Collision Detection)标准。

假设有主机 A 和主机 B 通过 10 Mbps 集线器(Hub)物理连接在一起,A 到 B 的数据传输流程如下:

  1. 监听介质使用情况(Carrier Sense):A 主机在发送网络数据包之前,需要先监听网络介质,确认没有其他设备正在使用才会发送数据。
  2. 多点传输(Multiple Access):A 主机发送的数据会被集线器复制一份,并发送给连接到该集线器的所有主机。但由于目标是主机 B,其他主机会丢弃这些数据帧。
  3. 冲突检测(Collision Detection):发送的数据帧附带有冲突检测功能。如果在数据发送过程中出现网络阻塞,导致数据帧损坏,A 主机会在等待超时时间后重新发送原始数据包。

MAC 封装格式

CSMA/CD 发送的数据帧实际上就是 MAC,它是在整个网络硬件上传输数据的最小单位。数据帧中包含两个非常重要的数据:目标网卡的 MAC 地址和来源网卡的 MAC 地址。MAC 数据帧的内容如下所示:

MAC数据帧

MAC 地址范围从 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF,这 6 Bytes 中,前 3 Bytes 为厂商代码,后 3 Bytes 是配置码。这个 MAC 地址直连仅在局域网内使用,在广域网中 MAC 地址会跟随网络设备变化。

数据帧内的数据大小范围为 46 Bytes 到 1500 Bytes。当最小为 46 Bytes 数据量时,加上包内其他固定 18 Bytes 数据量,则数据帧总大小最少为 64 Bytes。假如实际数据量不足 46 Bytes,则会填充到 46 Bytes。

MTU 最大传输单元

标准以太网数据帧所能传送的数据量最大值也叫最大传输单元(MTU,Maximum Transmission Unit)。标准定义为 1500 Bytes,不过每种网络接口的 MTU 都不相同,有定义为 1492 Bytes 的 MTU(802.2+802.3 组合封装)。超过 MTU 的数据包会被拆解分发。

在千兆网中另有一个参数叫巨帧(Jumbo Frame),等同于 MTU 的作用,一般定义到 9000 Bytes。但由于大多数网络设备都使用 MTU 标准,因此巨帧只用于内部网络传输数据,以此提高网速。

集线器与交换机

使用集线器的网络共享设备之间可能会发生冲突,交换机(Switch)可以解决这一问题。

在一个支持 OSI 第二层的交换机上,会有一个特别的内存,用来记录每个交换机端口与其连接的网卡 MAC 地址。当传输数据时直接通过交换机内存再转给目标主机,这样克服了数据包冲突问题。

交换机端口有全双工/半双工(full-duplex/half-duplex)两种工作模式,全双工表示端口上行和下行带宽可同时达到端口速度。半双工则是上行和下行共享端口速度,类似于集线器工作模式。

交换机拥有自动协调网口速度功能(Auto-negotiation,又叫 N-Way),可以自动协调出最高的传输速度来通信。此外,交换机还能自动识别交叉线或直连线来自适应。

TCP/IP 网络层相关数据包

Internet 其实就是 TCP/IP 这个通信协议的通称,由 Inter NIC 所管理。

IP 数据包封装

目前 IP 分为 IPv4 和 IPv6,IPv6 用来解决 IPv4 地址不足的问题,地址位可达 128 位。

IPv4 封装报头格式如下:

IP报头

下面分别说明:

  • 版本 (Version):

    声明这个 IP 数据包的版本,比如 IPv4 或 IPv6。

  • IP 报头长度 (IHL, Internet Header Length):

    告知这个 IP 数据包的报头长度,以 4 个字节为一个单位记录 IP 报头长度。

  • 服务类型 (Type Of Service):

    这个项目内容为 PPPDTRCU,表示这个 IP 数据包的服务类型:

    • PPP:表示这个数据包的优先级,目前很少使用。
    • D:若为 0 表示一般延迟 (Delay),若为 1 表示低延迟。
    • T:若为 0 表示一般传输量 (Throughput),若为 1 表示高传输量。
    • R:若为 0 表示一般可靠度 (Reliability),若为 1 表示高可靠度。
    • C:若为 0 表示选择一般路由 (Router),若为 1 表示选择最快路由。
    • U:保留未被使用。
  • 总长度 (Total Length):

    指这个 IP 数据包的总容量,包括报头与数据部分 (Data) 部分,最大可达 65535Bytes (64KB)。

  • 识别码 (Identification):

    当 IP 数据包太大进行分割后,这个字段用来标记分段的数据属于哪个 IP 数据包。

  • 特殊标志 (Flags):

    其字段为 0DM:

    • D:为 0 表示可以分段,为 1 表示不可分段。
    • M:为 0 表示此 IP 为最后分段,为 1 表示非最后分段。
  • 分段偏移 (Fragment Offset):

    表示这个 IP 分段在原始 IP 数据包中的位置,以 8 字节为 1 单位编号。有了总长度、识别码、特殊标志和分段偏移后,就能将 IP 分段重组为 IP 数据包了。

  • 生存时间 (TTL, Time to Live):

    指这个 IP 数据包的生存时间,范围为 0~255。当这个 IP 数据包通过一个路由器时,TTL 就会减 1,TTL 等于 0 时,数据包会被直接丢弃。

  • 协议代码(Protocol Number):

    IP 数据包中包含来自传输层和网络层本身的数据,此字段用于记录每种数据包的内容。具体的代码和对应的数据包协议名称如下表所示:

    IP 内代码 数据包协议名称
    1 ICMP(Internet Control Message Protocol)
    2 IGMP(Internet Group Management Protocol)
    3 GGP(Gateway-to-Gateway Protocol)
    4 IP(Internet Protocol)
    6 TCP(Transmission Control Protocol)
    8 EGP(Exterior Gateway Protocol)
    17 UDP(User Datagram Protocol)
  • 报头校验码(Header Checksum):

    用于检查 IP 报头是否存在错误。

  • 来源 IP 地址(Source Address):

    是一个长度为 32 位的 IP 地址。

  • 目标 IP 地址(Destination Address):

    对应于来源 IP 地址的目标 IP 地址。

  • 其他参数(Options):

    提供额外的功能,包括安全处理机制、路由记录、时间戳、严格和宽松的来源路由等。

  • 补齐项目(Padding):

    当 Options 的内容不足时,使用 Padding 来补足 32 位比特位。

IP 地址组成与分级

IP 地址由 32 位的 0 或 1 组成。为了便于记忆,将其分为 4 段,每段 8 位字节转换成十进制,能表示的范围是 0~255,这就是最常见的 IP 地址书写方式。

前三段数字称为网络号码(Net_ID),最后一段数字称为主机号码(Host_ID)。在同一网段内定义,意味着处于同一个物理网段内的主机 IP 具有相同的 Net_ID,并且具有唯一的 Host_ID。

在同一网段内,Host_ID 不能重复。此外,Host_ID=0 代表整个网段地址(网络 IP),而 Host_ID=255 表示广播地址(广播 IP)。

为了便于管理 IP 地址,国际互联网号码分配机构(Inter NIC)将整个 IP 网段分为五个类别:

  • A 类:0.0.0.0~127.255.255.255
  • B 类:128.0.0.0~191.255.255.255
  • C 类:192.0.0.0~223.255.255.255
  • D 类:224.0.0.0~239.255.255.255
  • E 类:240.0.0.0~255.255.255.255

其中,D 类用于组播(multicast),E 类保留未使用的网段。

IP 地址种类与获得

在 IPv4 中,IP 地址有两种类型:

  • 公共 IP(Public IP)

    这些 IP 地址是由 Inter NIC 统一规划的,只有这种 IP 地址才能连接到互联网。

  • 私有 IP(Private IP)

    也称为保留 IP,这些 IP 地址不能直接连接到互联网,主要用于局域网内的主机连接规划。私有 IP 地址共分为三段:

    • A 类:10.0.0.0~10.255.255.255
    • B 类:172.16.0.0~172.31.255.255
    • C 类:192.168.0.0~192.168.255.255

此外,还存在特殊的环回 IP 网段(127.0.0.0/8),也称为 “lo” 网络。最初它被用于测试操作系统内部循环所需的网络,同时也可供系统内部需要使用网络接口的服务使用。

例如,在没有安装网卡的情况下,想要测试已安装的服务是否正常工作,就可以使用这个内部环回网络。默认的主机(localhost)IP 是 127.0.0.1,因此如果启动了 WWW 服务器,只需在本机浏览器中使用 127.0.0.1 即可直接访问该服务。

获取 IP 地址的方式有两种:

  • 手动配置静态(Static)IP 地址

    直接编辑配置文件来指定 IP 相关参数。

  • 自动获取(DHCP)IP 地址

    在局域网内有一台主机或设备负责管理所有计算机的网络设备。客户端网络启动时主动向该服务器请求获取 IP 参数,并在获取后将其配置在本机上。

子网掩码

子网掩码(Netmask)用于将 IP 地址段划分为多个子网。它以位数的形式表示已被占用的地址。例如,占用 8 位用十进制表示就是 255.0.0.0,占用 23 位用十进制表示就是 255.255.254.0。

例如,192.168.1.0 255.255.255.0 表示此 IP 段的 Host_ID=192.168.1 已被占用且不可更改,只能修改 Net_ID,即 IP 的可用范围为 192.168.1.0~192.168.1.255。

再例如,192.168.1.0 255.255.255.128 同样表示此 IP 段的 Host_ID=192.168.1 已被占用且不可更改,剩下的 Net_ID 拆开来看:

  • 二进制 00000000 = 十进制 0,代表第一个可用的 Net_ID=0;
  • 二进制 10000000 = 十进制 128,也就是子网掩码占用了 25 位;
  • 二进制 01111111 = 十进制 127,代表能更改的 Net_ID 最大值为 127;

因此,整个网段的可用 IP 范围为 192.168.1.0~192.168.1.127。

对于第二个子网 192.168.1.128 255.255.255.128,同样将 Net_ID 拿出来看:

  • 二进制 10000000 = 十进制 128,代表第二个子网的 Net_ID 从 128 开始计算;
  • 二进制 10000000 = 十进制 128,子网掩码占用不可更改的位没有变化;
  • 二进制 11111111 = 十进制 255,代表第二个子网能更改的 Net_ID 最大值为 255;

因此,第二个网段的可用 IP 范围为 192.168.1.128~192.168.1.255。

再举个例子,假设 IP 地址和子网掩码设置为 192.168.1.43 255.255.255.240,计算 IP 段的范围:

  • 二进制 00101011 = 十进制 43,此为设置 IP 的 Net_ID 值;
  • 二进制 11110000 = 十进制 240,得到子网掩码占用的位数为 28 位;
  • 二进制 00100000 = 十进制 32,此为网段开始 IP 的 Net_ID 值;
  • 二进制 00101111 = 十进制 47,此为网段结束 IP 的 Net_ID 值;

可得此网段的 IP 范围为 192.168.1.32~192.168.1.47,除去表示网段的地址 192.168.1.32 和表示广播的地址 192.168.1.47 ,共 14 个可用地址。下一网段从 48 也就是二进制 00110000 开始。

总结一下,子网掩码位数和网段内可用 IP 数的关系为(子网掩码位数小于等于 30):IP 数=232-子网掩码位数-2

路由网关

在同一个局域网内,可以通过 IP 广播的方式来实现数据传输,而非局域网数据传输依靠路由器来协助。

网关(Gateway)/ 路由器(Router)的功能是负责在不同网络之间进行数据包传递(IP Forwarding),并且具有管理路由表的功能。因此,主机的 IP 和网关的 IP 必须在同一个网段内。

假设 network1(192.168.0.0/24)的 user1 需要与 network2(192.168.1.0/24)的 user2 进行通信,具体过程如下:

  1. 当 user1 有数据包需要发送时,主机会查阅 IP 数据包报头中的目标 IP 地址。
  2. 如果目标 IP 和本机 IP 在同一网段内,则直接通过局域网将数据传递给对方。
  3. 但是,user2 和 user1 不在同一个网络中,因此,user1 的主机会分析自己的路由表中是否存在其他符合条件的路由设置值。如果没有,则将 IP 数据包发送给默认路由器(Default Gateway)进行处理。
  4. 路由器接收到 user1 的数据包后,也会分析路由表,找到 user2 的地址信息,然后将 user1 的数据包发送给 user2。

ARP/RARP

以太网主要通过 MAC 地址传输数据,因此在局域网环境下使用网络地址解析协议(ARP,Address Resolution Protocol)。ARP 通过发送 ARP 数据包来查询目标 IP 对应的 MAC 地址,并将记录写入本机的 ARP 表中(保存在内存中,保留 20 分钟)。

RARP(Reverse ARP)是反向网络解析协议,它通过 MAC 地址获取目标 IP 地址。

可以使用 arp -n 命令查看本机已记录的 ARP 表数据:

[root@server201 ~]$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.2.1              ether   e0:4f:bd:b8:8b:e0   C                     ens33
192.168.2.102            ether   10:7b:44:91:aa:08   C                     ens33
192.168.2.101            ether   0c:9d:92:83:db:35   C                     ens33

还可以使用 -s-d 参数手动添加或删除记录:

[root@server201 ~]$ arp -s 192.168.2.202 05:3E:43:9B:AF:FD

由于 ARP 表会动态更新,通常不需要手动修改它。

ICMP 协议

ICMP,即因特网控制报文协议(Internet Control Message Protocol),用于在通过 IP 协议互联的主机和网关之间发送流量控制信息,它是一种错误检测与报告机制,主要用于确保网络的连接状态和连接的正确性。

ICMP 通过 IP 数据包进行数据传输,并有许多不同的类型用于检测和报告。以下是一些常见的类型:

代号 类别名称与意义
0 Echo Reply(表示响应信息)
3 Destination Unreachable(表示目的地不可达)
4 Source Quench(当路由器负载过高时,可使发送端停止发送)
5 Redirect(用于重定向路由路径信息)
8 Echo Request(请求响应信息)
11 Time Exceeded for a Datagram(当某些路由传输过程中超时时,通知源设备该数据包已被忽略)
12 Parameter Problem on a Datagram(当 ICMP 数据包重复之前的错误时,回复关于参数错误的信息)
13 Timestamp Request(请求对方发送时间信息,用于计算路由时间差异,以满足同步性协议的要求)
14 Timestamp Reply(响应 Timestamp Request 信息)
15 Information Request(在 RARP 协议应用之前,用于在开机时获取网络信息)
16 Information Reply(响应 Information Request 信息)
17 Address Mask Request(用于查询子网掩码的配置信息)
18 Address Mask Reply(响应子网掩码查询信息)

发送 ICMP 数据包最常用的命令是 pingtraceroute

TCP/IP 传输层相关数据包

网络层的 IP 数据包只负责将数据送到目标主机,数据包是否被接收成功是传输层来控制。

TCP 协议

传输层的数据打包成 TCP 数据包,报头内容如下:

TCP报头

下面分别说明:

  • 源端口和目标端口(Source Port & Destination Port)

    指定数据发送的端口和目标端口,可以说是 TCP 数据包上最重要的参数。由于是 16 位,因此端口最大可达 65535 号。服务器与客户端要达成连接的话,两边都要有一个对应端口建立连接信道,让数据通过这个信道进行沟通。

  • 数据包序号(Sequence Number)

    由于 TCP 数据包必须放入 IP 数据包中,如果 TCP 数据太大时,就需要进行分段,这个字段用来记录每个数据包的序号,可以让接收端将 TCP 的数据重组。

  • 回应序号(Acknowledgment)

    为了确认服务端确实收到了客户端的数据包,服务端会将回应序号响应给客户端。

  • 数据补偿(Data Offset)

    为了确认整个 TCP 数据包的大小,需要这个标志来说明数据包字段的起始位置。

  • 保留(Reserved)

    未使用的保留字段。

  • 控制标志码(Control Flag)

    用来说明连接的状态,整个字段有 6 个比特,分别代表 6 个标志位。若为 1 表示启用:

    • URG(Urgent):若为 1 代表该包为紧急数据包,接收端应该要紧急处理,同时会启用紧急指针。
    • ACK(Acknowledge):若为 1 代表该包为响应数据包。
    • PSH(Push Function):若为 1 代表要求对方立即传送缓冲区内的其他对应数据包,无需等待缓冲区满了才送。
    • RST(Reset):若为 1 代表连接会被立即结束,无需等待终止确认手续。这是个强制结束的连接,发送方已断线。
    • SYN(Synchronous):若为 1 表示发送端希望双方建立同步处理,也就是要求建立连接。
    • FIN(Finish):若为 1 表示传输结束,通知对方数据已完毕。是否立即断开连接取决于发送方是否还在等待对方的响应。
  • 滑动窗口(Window)

    用来控制数据包的流量,可以告知对方目前本机的接收缓冲区还可以接收多少数据包。当 Window = 0 时,代表缓冲区已满,所以要暂停传输数据。

  • 确认校验码(Checksum)

    在数据发送前,发送端会进行一次校验操作,并将校验值填入此字段。接收端收到数据包后会再次进行校验,对比校验和值,如果不一致,会认为数据包已损坏,要求发送端重新发送该数据包。

  • 紧急数据指针(Urgent Pointer)

    该字段仅在 URG = 1 时有效,用来指示紧急数据所在的位置。

  • 选项(Options)

    目前该字段主要用于指示接收端可接收的最大数据段容量。如果不使用该字段,则表示可以使用任意数据段大小。

  • 填充字段(Padding)

    类似于 IP 数据包需要固定的 32 位包头,由于选项字段长度不固定,所以需要使用填充字段来对齐。

在 Linux 下,启用小于 1024 的端口需要以 root 身份进行,因此也被称为特权端口。一般客户端会使用大于 1024 且未被使用的端口号来请求数据。

由于网络是双向的,要建立连接,服务器和客户端都需要提供 IP 地址和端口号。这对数据称为套接字对(Socket Pair),也就是来源 IP + 来源端口(Source Address + Source Port)对应目的 IP + 目的端口(Destination Address + Destination Port)。

TCP 三次握手

TCP 被称为可靠数据传输协议,是通过许多机制来实现,其中最重要的就是三次握手(Three-way Handshake)功能:

  • 数据包发起

    当客户端想要对服务端连接时,必须送出一个请求连接的数据包。客户端使用一个大于 1024 号的随机端口作沟通端口。在 TCP 报头当中带有 SYN=1Sequence=1001 的主动连接。

  • 数据包接收与确认数据包发送

    当服务器接到这个数据包,并确定要接收这个数据包后,就会开始制作一个同时带有 SYN=1ACK=1 的数据包。其中 Acknowledge 的号码是要给客户端确认用,所以该数字会比上一步骤里的 Sequence 号码加一 Acknowledge=1002。服务器也要确认客户端确实可以接收数据包才行,所以也会发送一个 Sequence=2001 的数据包给客户,并等待客户给服务端的回应。

  • 回送确认数据包

    当客户端收到来自服务器端的 Acknowledge=1002 后,就能够确认之前哪个请求数据包被正确接收。接下来如果客户端也同意与服务器端建立连接,会再次发送一个 ACK=1Acknowledge=2002 确认数据包给服务器。

  • 最后取得确认

    若一切顺利,服务端收到 ACK=1Acknowledge=2002 的数据包后,就能建立起这次连接了。

这就是网络双向确认。无论服务端还是客户端,都必须通过一次 SYNACK 来建立连接,总共三次会话。

UDP 协议

UDP 协议全称为 User Datagram Protocol,即用户数据报协议。UDP 不提供可靠的传输模式,接收端在接收到数据包后,不会回复响应数据包(ACK)给客户端。反过来说,这可以使希望自己进行流量控制的应用程序具有更大的灵活性。例如,NFS 的流量控制,以及 DNS 和 TRP 等协议的多播数据,可以向多个客户端同时进行广播。

报头数据内容如下:

UDP报头

由于无需确认对方是否正确收到数据,故报头数据较少,因此,UDP 可以在数据区填入更多内容。

路由

路由的主要功能是规划网络数据包的传递方式与方向。

路由器

路由器的主要功能是转发网络数据包。具体而言,路由器会分析来源端数据包的 IP 包头,在包头内找到要送达的目标 IP,通过路由器本身的路由表来将数据包传送到下一个目标(Next Hop)。

Linux 本身具备转发数据包的能力,因此也被称为软路由。转发功能默认情况下是关闭的,可以手动设置并启用:

[root@server201 ~]$ cat /proc/sys/net/ipv4/ip_forward
0
[root@server201 ~]$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@server201 ~]$ sysctl -p
net.ipv4.ip_forward = 1

路由表

在 Linux 系统下,路由表是按照小网络到大网络的顺序排列的。路由表主要根据以下几种情况进行设计:

  • 基于网络接口的路由

    当主机上存在多个网络接口时,就会存在相应的路由。这个路由用于指向与网络接口所在同一网段的网关或网口。

  • 手动或默认路由

    使用 route 命令添加路由时,规划的路径必须能够直达(Broadcast)到网口或 IP 的情况下才有效。例如,指定通过 ens37 端口访问 192.168.3.0/24 网段:

    [root@server201 ~]$ route add -net 192.168.3.0 netmask 255.255.255.0 dev ens37
    [root@server201 ~]$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 ens33
    192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
    192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 ens37

    只有在这样指定后,才能添加一条指向 192.168.3.110 的路由。

  • 动态路由

    除了使用命令添加和自动生成的路由,还可以通过路由器之间的协商来实现动态路由的环境。但是这需要额外安装软件,例如 zebraQuagga

Linux 的路由规则是通过内核实现的,所有路由表规则都在内核功能中,也就是在内存中运行。

网络地址转换

网络地址转换(NAT,Network Address Translation)可以实现 IP 共享的功能。NAT 服务器本身就是一个路由器,它比普通路由器多了一个 IP 转换功能。

路由器的 IP 转发负责让两个网段能够相互通信,而 IP 转换则负责在公共 IP 和私有 IP 之间进行通信。

Linux 的 NAT 服务器可以通过修改数据包的 IP 包头中的源 IP 或目标 IP,使来自私有 IP 的数据包转发到 NAT 服务器的公共 IP,从而直接连接到互联网。

单网卡绑多 IP

一个网卡具备多个 IP 的功能被称为 IP Alias。

IP Alias 功能的最大用途是应急情况下的应用。例如,当电脑前面连接了可配置交换机和路由器时,它们的 IP 不在同一个网段。默认情况下,使用本机 IP 只能访问其中一个设备。这时可以使用 IP Alias 创建一个虚拟端口,并配置另一个设备使用相同网段的 IP,从而在不修改主 IP 的情况下访问两个设备。

由于 IP Alias 是通过实体网卡进行仿真的,因此其状态也会随着实体网卡的变化而变化。如果希望保留虚拟网卡的设置,可以在 /etc/sysconfig/network-scripts 目录下创建相同名称的配置文件。