网络基础和 TCP、IP 协议

1、网络基本概念

1.1 什么是网络:一些网络设备按照一定的通讯规则(网络协议)进行通讯的系统。

1.2 VPN(虚拟私有网络)加密,相当于专线,从分支机构到总部。

1.3 资源共享的功能和特点:

  数据和应用程序
  资源
  网络存储
  备份设备

1.4 常见的网络物理组件:

1.5 用户应用程序对网络的影响:

  批处理应用程序:

    FTP、TFTP、库存更新
    无需直接人工交互
    带宽很重要,但并非关键性因素

  交互式应用程序:

    库存查询、数据库更新
    人机交互
    因为用户需等待响应,所以响应时间很重要,但并非关键性因素,除非要等待很长时间

  实时应用程序:

    VoIP、视频
    人与人的交互
    端到端的延时至关重要

1.6 网络的特征:

  速度、成本、安全性、可扩展性、可用性、可靠性、拓扑
  物理拓扑描述了物理设备的布线方式:总线拓扑(wall)、环装拓扑、星型拓扑、双环状拓扑、全网状拓扑、部分状拓扑
  逻辑拓扑描述了信息在网络中流动的方式
    逻辑组件:交换机(switch)、路由器(router)集线器(hub)、网桥(bridge)

1.7 了解主机到主机通信:

  旧模型:

    专有

  基于标准的模型:

    多厂家软件
    分层方法

1.8 OSI 模型(Open System Interconnection)

  物理层(physical):定义了物理连接设备的规范(有形:网线、无形:无线电)

  数据链路层(data link):格式化数据、链路连接、定义物理地址(定义网络设备的唯一标志)、错误校验

  网络层(network):路由功能,选择路径,支持逻辑寻址(名字、id)和路径选择

  传输层(transport):确保数据传输的可靠性;利用端口号定义应用程序

  会话层(session):会话管理

  表示层(presention):确保系统可以读出数据、格式化数据、构建数据、提供加密、压缩

  应用层(application):为应用程序进程提供网络服务

  PDU:协议数据单元是指对等层次之间传递的数据单位:

    物理层:bit(位)
    数据链路层:frame(帧)
    网络层:packet(数据包)
    传输层:segment(数据段)
    其他更高层:message(消息)

1.9 网络设备

  三种通信模式:

    单工:单向传输
    半双工 Half Duplex:轮流双向传输
    全双工 Full Duplex:同时双向传输

  网络中:

    单播 running:目标主机一台(通过目标地址传输)
    广播 broadcast:目标所有主机(所有主机都能发广播:存在干扰可能性)
    组播 multicast:即多播,目标一些主机(小组)

  局域网 Local Area Network

  非屏蔽式双绞线 UTP

  GBIC:转换光信号和电信号

  Ethernet Evolution(以太网):数据链路层

  MAC 地址

  Hub 集线器(物理层):物理连接,带宽共享,半双工

  冲突域:一个主机发其他人不能发,集线器越多冲突域越大

  广播域:当一个计算机发广播,只要计算机收到 就算在该广播域中

  wlan:wifi,wapi

  以太网桥或交换机 Switch 工作原理:

  以太网桥监听数据帧中源 MAC 地址,学习 MAC,建立 MAC 表;
  对于未知 MAC 地址,当网桥接到广播帧时候,它立即转发到除接收端口之外的所有其他端口;
  当网桥接到一个数据帧时,如果该帧的目的位于接收端口所在网段上,它就过滤掉该数据帧;如果目的 MAC 地址在位于另外一个端口,网桥就将该帧转发到该端口;
  以太网或交换机工作于数据链路层。

  集线器属于 OSI 模型的第一层物理层设备,而网桥属于 OSI 的第二层数据链路层设备。

  从工作方式来看,集线器是一种广 播模式,所有端口在一个冲突域里面。网桥可以通过端口隔离冲突域。
  Hub 是所有共享总线和共享带宽。网桥每个端口占一个带宽。

  路由器 Router:

  路由器隔开算一个网段,路由器上有路由表(路径),任何主机都有路由表;
  连接局域网和广域网,工作于网络层;

# route -n     # linux 中查看路由表

  路由器的功能:把一个数据报文从一个网段转发到另一个网段(靠路由表完成)

  VLAN(虚拟局域网)

    分隔广播域
    安全
    灵活管理
    两个 VLAN 之间通讯靠路由器(路由器连接交换机),有的交换机具有路由功能(连接多个交换机)
    VLAN = 广播域 = 逻辑网络

  分层的网络架构:

  

  交换机:生成树协议(stp)自动启用网卡,避免回环

 

2、TCP/IP 协议栈

传输控制协议/因特网互联协议

  TCP/IP 是一个 Protocol Stack,包括 TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP 等许多协议
  最早发源于美国国防部(缩写为 DoD)的因特网的前身 ARPA 网项目,1983 年 1 月 1 日,TCP/IP 取代了旧的网络控制协议 NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护。
  共定义了四层,和 OSI 参考模型的分层有对应关系。

TCP 协议:要先建立连接,在进行通讯(可靠、序列号)

UDP 协议:不需要建立连接,直接通讯(效率高、无序列号)

可靠性 VS 高效性:

2.1 TCP 协议

  工作在传输层
  面向连接协议
  全双工协议
  半关闭
  错误检查
  将数据打包成段,排序
  确认机制
  数据恢复,重传
  流量控制,滑动窗口
  拥塞控制,慢启动和拥塞避免算法
  更多关于 tcp 的内核参数,可参看 man 7 tcp

  2.1.1 TCP 协议

  传输层通过 port 号,确定应用层协议

  TCP:传输控制协议,面向连接的协议,通信前需要建立虚拟链路,结束之后拆除链路。

    0-65535

  UDP:User Datagram Protocol,无连接的协议

    0-65535

  IANA:互联网数字分配机构(负责域名,数字资源,协议分配)

    0-1023:系统端口或特权端口(仅管理员可用),众所周知,永久的分配给固定的系统应用使用。
      22/tcp(ssh),80/tcp(http),443/tcp(https)

    1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用。
      1433/tcp(SqlServer),1521/tcp(oracle),3306/tcp(mysql),11211/tcp/dup(memcached)

    49152-65535:动态端口或私有端口,客户端程序随机使用的端口。

    其范围定义:/proc/sys/net/ipv4/ip_local_port_range

# cat /etc/services    # 常见服务端口号
#ss -ntul              # 查看我机器上跑的端口号
#ss -ntulp             # 查看我机器上跑的端口号对应应用
lsof -i :6010          # 查看端口号 6010 是哪个服务再使用

  2.1.2 TCP 包头

  窗口的大小:表示现在允许对方发送的数据量,也是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要 ACK 确认后才能再继续传输后面的数据,由 Window size value * Window size scaling factor(此值在三次握手阶段 TCP 选项 Window scale 协商得到)得出此值(固定窗口 → 滑动窗口)

  校验和:提供额外的可靠性

  紧急指针:标记紧急数据在数据字段中的位置

  选项部分:其最大长度可根据 TCP 首部长度进行推算。TCP 首部用 4 位表示,选项部分最长为:(2^4-1)*4-20=40 字节

    常见选项:

    最大报文段长度:Maxium Segment Size,MSS,通常 1460 字节

    窗口扩大:Window Scale

    时间戳:Timestamps

  URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgentpointer)只有当 URG=1 时才有效。

  ACK:确认报文段,表示是否前面确认号字段是否有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1,带 ACK 标志的 TCP 报文段称为确认报文段。

  PSH:如果为 1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在 TCP 接收缓冲区中。

  RST:如果收到一个 RST=1 的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带 RST 标志的 TCP 报文段称为复位报文段。

  SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才置为 1,带 SYN 标志的 TCP 报文段称为同步报文段。

  FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:”我的数据已经发送完毕,你可以释放连接了”,带 FIN 标志的 TCP 报文段称为结束报文段。

  2.1.3 TCP 的三次握手

  第一次握手:建立连接时,客户端发送 SYN 包(SYN=1,seq=x)到服务器,并进入 SYN_SENT(SYN 已发送)状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

  第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(ack=x+1),同时自己也发送一个 SYN 包(SYN=1,seq=y),和 ACK 包,此时服务器进入 SYN_RECV 状态。

  第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手。

  2.1.4 sync 半连接和 accept 全连接队列

  server 端的半连接队列(syn 队列):

  在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的 SYN 包开设一个条目,该条目表明服务器已收到 SYN 包并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV 状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED 状态。

  server 端的完全连接队列(accpet 队列):

  当第三次握手时,当 server 接收到 ACK 报文之后, 会进入一个新的叫 accept 的队列,该队列的长度为 min(backlog, somaxconn),默认情况下,somaxconn 的值为 128,表示最多有 129 的 ESTAB 的连接等待 accept(),而 backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,listen 里面的 backlog 可以有我们的应用程序去定义的。

  2.1.5 TCP 的四次挥手

  第一次挥手:A 数据传输完毕需要断开连接,A 的应用进程向其 TCP 发出连接释放报文段(FIN=1,序号 seq=u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN-WAIT-1 状态,等待 B 的确认

  第二次挥手:B 收到连接释放报文段后即发出确认报文段(ACK=1,确认号 ack=u+1,序号 seq=v),B 进入 CLOSE-WAIT 关闭等待状态,此时的 TCP 处于半关闭状态,A 到 B 的连接释放。而 A 收到 B 的确认后,进入 FIN-WAIT-2 状态,等待 B 发出的连接释放报文段。

  第三次挥手:当 B 数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq=w,确认号 ack=u+1),B进入 LAST-ACK(最后确认)状态,等待 A 的最后确认。

  第四次挥手:A 收到 B 的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A 进入TIME-WAIT(时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计时器设置的时间 2MSL 后,A 才进入 CLOSE 状态。

CLOSED       没有任何连接状态
LISTEN       侦听状态,等待来自远方 TCP 端口的连接请求
SYN-SENT     在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED  代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1   主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2   主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
TIME-WAIT    完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT   被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK     被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING      双方同时尝试关闭传输连接,等待对方确认

  有限状态机:

客户端先发送一个 FIN 给服务端,自己进入了 FIN_WAIT_1 状态,这时等待接收服务端的报文,该报文会有三种可能:
    ➢只有服务端的 ACK
    ➢只有服务端的 FIN
    ➢基于服务端的 ACK,又有 FIN
1、只收到服务器的ACK,客户端会进入FIN_WAIT_2状态,后续当收到服务端的 FIN 时,回应发送一个 ACK,会进入到 TIME_WAIT 状态,这个状态会持续 2MSL(TCP报文段在网络中的最大生存时间,RFC 1122 标准的建议值是2min),客户端等待 2MSL,是为了当最后一个 ACK 丢失时,可以再发送一次。 因为服务端在等待超时后会再发送一个 FIN 给客户端,进而客户端知道 ACK 已丢失。
2、只有服务端的 FIN 时,回应一个 ACK 给服务端,进入 CLOSING 状态,然后接收到服务端的 ACK 时,进入 TIME_WAIT 状态。
3、同时收到服务端的 ACK 和 FIN,直接进入 TIME_WAIT 状态。

  TCP 状态转换图:

  2.1.6 客户端的典型状态转移

  客户端通过 connect 系统调用主动与服务器建立连接 connect 系统调用首先给服务器发送一个同步报文段,使连接转移到 SYN_SENT 状态:
  此后 connect 系统调用可能因为如下两个原因失败返回:
  1、如果 connect 连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于 TIME_WAIT 状态的连接所占用,则服务器将给客户端发送一个复位报文段,connect 调用失败。
  2、如果目标端口存在,但 connect 在超时时间内未收到服务器确认报文段,则 connect 调用失败。

  Connect 调用失败将使连接立即返回到初始的 CLOSED 状态。如果客服端成功收到服务器的同步报文段和确认则 connect 调用你成功返回,连接转移至 ESTABLISHED 状态。

  当客户端执行主动关闭时,它将向服务器发送一个结束报文段,同时连接进入 FIN_WAIT_1 状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至 FIN_WAIT_2 状态。当客户端处于 FIN_WAIT_2 状态时,服务器处于 CLOSE_WAIT 状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入 TIME_WAIT 状态。

  客户端从 FIN_WAIT_1 状态可能直接进入 TIME_WAIT 状态(不经过FIN_WAIT_2 状态),前提是处于 FIN_WAIT_1 状态的服务器直接受到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段)

  处于 FIN_WAIT_2 状态的客户端需要等待服务器发送结束报文段,才能转移至 TIME_WAIT 状态,否则它会一直停留在这个状态如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在 FIN_WAIT_2 状态并无益处。连接停留在 FIN_WAIT_2 转台的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)

  Linux 为了防止孤儿连接长时间存留在内核中,定义了两个啮合参数:

/proc/sys/net/ipv4/tcp_max_orphans     # 指定内核能接管的孤儿连接数目
/proc/sys/net/ipv4/tcp_fin_timeout     # 指定孤儿连接在内核中生存的时间

  2.1.7 三次握手和四次挥手的状态切换

  2.1.8 TCP超时重传

  异常网络状态下(开始出现超时或丢包),TCP 控制数据传输以保证其承诺的可靠服务。TCP 服务必须能够重传超时时间内未收到确认的 TCP 报文段。为此,TCP 模块为每个 TCP 报文段都维护一个重传定时器,该定时器在 TCP 报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP 模块将重传 TCP 报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是 TCP 的重传策略。

  与 TCP 超时重传相关的两个内核参数:

/proc/sys/net/ipv4/tcp_retries1   # 指定在底层IP接管之前TCP最少执行的重传次数,默认为 3
/proc/sys/net/ipv4/tcp_retries2   # 指定连接放弃前 TCP 最多可以执行的重传次数,默认值 15(一般对应 13~30min)

tcpdump -i eth0 -nn 80 # 抓包,指定网卡 以数字方式抓包

  2.1.9 拥塞控制:根据网络状况自动调整传输速度

  网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏,此情况称为拥塞。

  TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,即所谓的拥塞控制。

  TCP 拥塞控制的标准文档是 RFC 5681,其中详细介绍了拥塞控制的四个部分:
  慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)

  拥塞控制算法在 Linux 下有多种实现,比如 reno 算法、vegas 算法和 cubic 算法等。它们或者部分或者全部实现了上述四个部分。

# 当前所使用的拥塞控制算法:
/proc/sys/net/ipv4/tcp_congestion_control

 

2.2 UDP 协议(用户数据报协议)

  工作在传输层
  提供不可靠的网络访问
  非面向连接协议
  有限的错误检查
  传输性能高
  无数据恢复特性
  更多关于 udp 的内核参数,可看 man 7 udp

  2.2.1 报文头部

 

  2.2.2 Internet 层

 

2.3 ICMP 协议

  ICMP(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

# cat /proc/sys/net/ipv4/ip_default_ttl
64
# ping 192.168.129.142
PING 192.168.129.142 (192.168.129.142) 56(84) bytes of data.
64 bytes from 192.168.129.142: icmp_seq=1 ttl=64 time=4.85 ms

# ttl=64
# 距离目标的路由器数量,每经过一个路由器 64-1;操作系统不同 ttl 不同
ping www.baidu.com PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data. 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=43.0 ms

 

2.4 Address Resolution Protocol(ARP 协议:地址解析协议)

  作用:把 Ip 地址转换为 mac 地址

  ARP 第一次通讯要通过广播,所以只在一个网段通讯。跨网段通讯需要路由器

  看地址明显不在同一网段,所以要通过路由器接口的 IP 地址(网关),进而通讯。

  网关和你的地址一定在一个网段

route -n     # 或 ip neigh 查看网关

  ARP 允许手工绑定:防止广播欺骗冒充网关

  反向 ARP:我的 MAC 是这个,谁能给我一个 IP

  Internet 层:
    IP PDU 报头

 

 3、IP 地址

  它们可唯一标识 IP 网络中的每台设备
  每台主机(计算机、网络设备、外围设备)必须具有唯一的地址
  IP 地址由两部分组成:
    网络 ID:
      标识网络
      每个网段分配一个网络 ID
    主机 ID:
      标识单个主机
      由组织分配给各设备

  IP 地址分类:

 

  同一个网段:网络 ID 相同

  A 类:前 8 位网络 ID,后 24 位主机 ID

0-127.X.X.Z 1-126.X.X.Z
网络数=2^可变的网络 ID 位
主机数=2^主机 ID 位-2=2^24-210.0.0.0,表示 10 网络 和 10.255.255.255,表示广播 除外)

  B 类:前 16 位网络 ID,后 16 位是主机 ID

128-191.X.Y.Z
网络数=2^14=16384
主机数=2^16-2=65534

  C 类:前 24 位网络 ID,后 8 位是主机 ID

192-223.X.Y.Z
网络数=2^21=2097152
主机数=2^8-2=254

  D 类:多播,组播

224-239.X.Y.Z

  E 类:保留

240-254.X.Y.Z

  后期不分类(五类):网络 ID,主机 ID 任意位
  表示主机 IP:CIDR 表示法(无类域间路由)
  IP/网络 ID 位数

  netmask:子网掩码
  功能:确定网络 ID 位数
  32 位二进制,对应 IP 网络 ID 位为 1,对应 IP 中主机 ID 为 0

10.0.0.0/8      255.0.0.0
172.16.0.100/16 255.255.0.0
192,168,37,7/24 255.255.255.0

 

  判断主机是否在同一网段:判断网络 ID 是否相同,用自己的 IP 和自己的 netmask 相与,在用自己的 netmask 和对方 IP 相与,比较结果:
  网络 ID=IP 与运算 netmask

# 例:
A:10.0.0.123/24
B:10.0.1.200/24

10.0.0.123
255.255.255.0

00001010.00000000.00000000.01111011
11111111.11111111.11111111.00000000

与运算结果:00001010.00000000.00000000.00000000 即 10.0.0.0


10.0.1.200
255.255.255.0

00001010.00000000.00000001.00001000
11111111.11111111.11111111.00000000

与运算结果:00001010.00000000.00000001.00000000 即 10.0.1.0

所以,不在同一个网段

  公共地址:

 

  私有地址:

 

  特殊地址:

0.0.0.0
0.0.0.0 不是一个真正意义上的 IP 地址。它表示所有不清楚的主机和目的网络

255.255.255.255
限制广播地址,对本机来说,这个地址指本网段内(同一广播域)的所有主机

127.0.0.1 ~ 127.255.255.254
本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为 "127.0.0.1" 的数据包

224.0.0.0239.255.255.255
组播地址,224.0.0.1 特指所有主机,224.0.0.2 特指所有路由器。224.0.0.5 指 OSPF路由器,地址多用于一些特定的程序以及多媒体程序

169.254.<.x
如果 Windows 主机使用了 DHCP 自动分配 IP 地址,而又无法从 DHCP 服务器获取地址,系统会为主机分配这样地址

  可变长度子网掩码:

  划分子网:将大网络(主机多,主机 ID 多)分隔成多个小网络(主机少,主机 ID 少)
  原有的网络 ID 位变多,原有的主机 ID 变少,网络 ID 向主机 ID 借位

172.16.0 0000000.00000000/16
借一位变成两个网络:
172.16.0 0000000.00000000/16  即:172.16.0.1~172.16.127.254
172.16.1 0000000.00000000/16  即:172.16.128.1~172.16.255.254

子网数
=2^网络ID向主机ID借的位数
例:中国移动:10.0.0.0/832 省,每个省分配独立网络
1、每个省的子网络对应 netmask?
255.11111 000.0.0255.248.0.0/13

2、 每个省的子网络主机多少?
2^(32-13)-2=524286

3、 最小的子网络的网络 ID?
10.00000 000.010.0.0.0/13

4、 最大的子网络的 IP 范围?
10.11111 000.0→IP 10.11111 000.0.1~10.11111 111.255.25410.248.0.1~10.255.255.2545、将第十个子网分配给河南省,再分 18 个子网给各个地级市使用
10.01001 000.00 000000.0

  合并子网:将多个子网合并成一个大网,也成超网,主机 ID 向网络 ID 借位

220.78.168.0   220.78.10101 000.0   220.78.10101 000.0
220.78.169.0   220.78.10101 001.0   220.78.168.0/21
220.78.170.0   220.78.10101 010.0
220.78.171.0   220.78.10101 011.0
220.78.172.0   220.78.10101 100.0
220.78.173.0   220.78.10101 101.0
220.78.174.0   220.78.10101 110.0
220.78.175.0   220.78.10101 111.0

 

4、配置网络

  跨网络通讯:路由

  路由分类:

    主机路由
    网络路由
    默认路由

  优先级:精度越高,优先级越高

  动态主机配置协议 DHCP

 

4.1 基本网络配置

  将 Linux 主机接入到网络,需要配置网络相关设置,一般包括如下内容:

  主机名
  IP/netmask(子网掩码)
  路由:默认网关
  DNS 服务器:
    主 DNS 服务器
    次 DNS 服务器
     第三 DNS 服务器

  网络配置方式:

    静态指定:

ifconfig,route,netstat
ip:object {link,addr,route},ss,tc
system-config-network-tui,setup    # 进入图形修改网络设置配置文件

    动态分配:

DHCP:Dynamic Host Configuration Protocol
# ifconfig 命令
ifconfig                      # 默认显示启用网卡信息
ifconfig eth1 down            # 禁用 eth1 网卡;up 启用网卡,相当于数据链路层的 downifconfig -a     # 查看所有网卡
ifdown eth1                   # 相当于网络层的 down,ifconfig 能看到却看不到地址,数据链路层通着,只是网络层地址丢了
ifconfig eth1 1.1.1.1/24      # 临时配地址
ifconfig eth1:123 1.1.1.1/24  # 在原有地址临时虚拟添加地址

  route 路由管理命令:

查看 route -n
添加 route add
删除 route del … route add –[net
|-host] target [netmask Nm] [gw Gw] [[dev] If] 目标:192.168.1.3 网关:172.16.0.1 route add -host 192.168.1.3 gw 172.16.0.1 dev eth0
目标:192.168.0.0 网关:172.16.0.1 route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0 route add -net 182.168.0.0/24 gw 172.16.0.1 dev eth0

  网关:下一个路由器临近我的接口的 ip,下一跳(next hop)

  路由表:

默认路由,网关:172.16.0.1
route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1
route add default gw 172.16.0.1

删除:route del route del [
-net|-host] target [gw Gw] [netmask Nm] [[dev] If] 目标:192.168.1.3 网关:172.16.0.1 route del -host 192.168.1.3 目标:192.168.0.0 网关:172.16.0.1 route del -net 192.168.0.0 netmask 255.255.255.0
cat /etc/sysconfig/network-scripts/ifcfg-ens32
DEVICE=eth0             # 设备名
NAME=eth0               # 标识
BOOTPROTO=dhcp          # dhcp:自动获取地址;none 或 static:手工配置地址
IPADDR=192.168.12.3     # 手工配置地址
PREFIX=24               # 子网掩码相当于:NETMASK=255.255.255.0
ONBOOT=yes              # 网卡是否禁用
GATEWAY=192.168.37.200  # 网关

cat /proc/sys/net/ipv4/ip_forward # 该内核参数改为 1,开启内核转发
traceroute [目标主机 IP] # 或 mtr [目标主机 IP]追踪路由

位于中间的路由器不能加默认路由

  配置动态路由:

  通过守护进程获取动态路由
    安装 quagga 包
    支持多种路由协议:RIP、OSPF 和 BGP
    命令 vtysh
    RIP 协议:由经过的路由器少的路线生成路由记录
    OSPF 协议:判断带宽生成路由记录

4.2 网络配置和故障排错

  netstat 命令:显示网络连接

netstat -[t|u|w|l|a|n|e|p]
  -t tcp # 协议相关   -u udp # 协议相关   -w raw socket # 相关   -l # 处于监听状态**   -a # 所有状态   -n # 以数字显示 IP 和端口   -e # 扩展格式   -p # 显示相关进程及 PID**
推荐使用 ss 命令代替 netstat 命令
常用组合:
  -tan -uan -unl
显示路由表:route -n 等价于 netstat -nr
  -r 显示内核路由表
  -n 数字格式
显示接口统计数据:
  netstat -i
  netstat -I=IFACE
  ifocnfig -s eth0
watch -n1 netstat -Iens32    # watch -n1 一秒查看一次 netstat -l ens32 命令结果

  ip 命令:配置 Linux 网络属性

ip addr { add | del } IFADDR dev STRING
    [label LABEL]:添加地址时指明网卡别名
    [scope {global|link|host}]:指明作用域
        global:全局可用
        link:仅链接可用
        host:本机可用
    [broadcast ADDRESS]:指明广播地址
ip address show - look at protocol addresses
    [dev DEVICE]
    [label PATTERN]
    [primary and secondary]
ip addr flush 使用格式同show
    ip addr add 172.16.100.100/16 dev eth0 label eth0:0
    ip addr del 172.16.100.100/16 dev eth0 label eth0:0
    ip addr flush dev eth0 label eth0:0

例:
ip { link | addr | route } # 链路层、网络层、路由 ip addr add 1.1.1.1/24 dev ens34 # 添加地址,del 删除地址 ip a a 3.3.3.3/24 dev ens34 label ens34:2 # 添加别名(a a:addr add) ip addr del 3.3.3.3/24 dev ens34 # 删除 ip a flush dev ens34 # 将该网卡上的 Ip 信息都删了

  改网卡名:

先禁用网卡:
ip link set eth1 down
再更改网卡名称:
ip link set eth1 name heiehi

  配置路由:

ip route - routing table management
    添加路由:ip route add
    ip route add TARGET via GW dev IFACE src SOURCE_ IP
        TARGET:
            主机路由:IP
            网络路由:NETWORK/MASK
        ip route add 192.168.0.0/24 via 172.16.0.1
        ip route add 192.168.1.13 via 172.16.0.1
        添加网关:ip route add default via GW dev IFACE
        ip route add default via 172.16.0.1
    删除路由:ip route del TARGET
    显示路由:ip route show|list
    清空路由表:ip route flush [dev IFACE] [via PREFIX]
        ip route flush dev eth0

例:
加路由:
ip route add 10.0.0.0/8 via 172.16.0.123

加默认路由:
ip route add default via 172.16.0.123

加 metric(走路由的费用)
ip route add default via 172.16.0.123 metric 200 # 相当于优先级,路由优先走低的

  ss 命令:

格式:ss [OPTION]...[FILTER]
netstat 通过遍历 proc 来获取 socket 信息,ss 使用 netlink 与内核 tcp_diag 模块通信获取 socket 信息
选项:
    -t tcp        # 协议
    -u udp        # 协议相关
    -w            # 裸套接字相关
    -x unix sock  # 相关
    -l listen     # 状态的连接
    -a            # 所有
    -n            # 数字格式
    -p            # 相关的程序及 PID
    -e            # 扩展的信息
    -m            # 内存用量
    -o            # 计时器信息

FILTER: [ state TCP-STATE ] [ EXPRESSION ]
TCP的常见状态:
  tcp finite state machine:
    LISTEN:监听
    ESTABLISHED:已建立的连接
    FIN_WAIT_1
    FIN_WAIT_2
    SYN_SENT
    SYN_RECV
    CLOSED
EXPRESSION:
  dport =
  sport =
  示例:'(dport=:sshorsport=:ssh)'


常见用法:
ss -l      # 显示本地打开的所有端口
ss -pl    # 显示每个进程具体打开的 socket
ss -t -a  # 显示所有 tcp socket
ss -u -a # 显示所有的 UDP Socekt
ss -o state established '( dport = :ssh or sport = :ssh )'    # 显示所有已建立的 ssh 连接
ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的 HTTP 连接
ss -s # 列出当前 socket 详细信息

常见组合:
ss -nt # 正处于连接状态的 tcp
-tan, -tanl, -tanlp, -uan

  网络配置文件:

IP、MASK、GW、DNS 相关配置文件:
/etc/sysconfig/network-scripts/ifcfg-<name>

路由相关的配置文件:
/etc/sysconfig/network-scripts/route-<name>/etc/sysconfig/network-scripts/ifcfg-<name>

说明参考/usr/share/doc/initscripts/-9.49.30/sysconfig.txt
    DEVICE:此配置文件应用到的设备
    HWADDR:对应的设备的 MAC 地址
    BOOTPROTO:激活此设备时使用的地址配置协议,常用的 dhcp、static、none、bootp
    NM_CONTROLLED:NM 是 NetworkManager 的简写,此网卡是否接受 NM 控制;建议 CentOS6 为“no
    ONBOOT:在系统引导时是否激活此设备
    TYPE:接口类型;常见有的 Ethernet,Bridge
    UUID:设备的唯一标识
    IPADDR:指明 IP 地址
    NETMASK:子网掩码
    GATEWAY:默认网关
    DNS1:第一个 DNS 服务器指向
    DNS2:第二个 DNS 服务器指向
    USERCTL:普通用户是否可控制此设备
    PEERDNS:如果 BOOTPROTO 的值为 "dhcp",YES 将允许 dhcp server 分配的 DNS 服务器信息直接覆盖至/etc/resolv.conf 文件,NO 不允许修改 resolv.conf

网卡配置文件实例:

  DNS 服务器:

  路由设置永久生效:

/etc/sysconfig/network-scripts/route-IFACE
注意:需service network restart 生效
两种风格:
1、TARGET via GW
如:10.0.0.0/8 via 172.16.0.1

2、每三行定义一条路由
ADDRESS#=TARGET
NETMASK#=mask
GATEWAY#=GW

  网卡别名永久有效:

vim ifcfg-ens34:2
DEVICE=ens34:2


对虚拟主机有用
将多个 IP 地址绑定到一个 NIC 上
    eth0:1、eth0:2、eth0:3

ifconfig 命令:
    ifconfig eth0:0 192.168.1.100/24 up
    ifconfig eth0:0 down

ip命令:
    ip addr add 172.16.1.2/16 dev eth0
    ip addr add 172.16.1.1/16 dev eth0 label eth0:0
    ip addr add 172.16.1.2/16 dev eth0 label eth0:0
    ip addr del 172.16.1.1/16 dev eth0 label eth0:0
    ip addr flush dev eth0 label eth0:0

  CentOS6 建议停掉 NetworkManager 服务

service NetworkManager stop
chkconfig NetworkManager off     # 下次开机不启动

  网络接口配置-bonding

  将多块网卡绑定同一 IP 地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一 Ip 地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的 MAC 地址。

  企业服务器内置多块网卡,CPU 很快、固态硬盘速度也快,相对来说网卡成为瓶颈,也为了网卡容错,进而推进多网卡绑定。

  Bonding 工作模式:
  Mode 0(balance-rr)
  轮转(Round-robin)策略:假设有三块网卡,第一个数据包第一个网卡处理,第二个数据包第二个网卡处理…轮着来,网卡分担流量,本模式提供负载均衡和容错的能力。

  Mode 1(active-backup)
  活动-备份(主备)策略:主网卡工作,备网卡不工作,当主网卡出现故障时,备网卡工作。为了避免交换机发生混乱,此时绑定的 MAC 地址只有一个外部端口上可见。

  Mode 3(broadcast)
  广播策略:在所有的 slave 接口上传送所有的报文,提供容错能力

  Active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需要交换机以便整合链接。如:Cisco 交换机需要在模式 0/2 和 3 中使用 EnterChannel,但在模式 4 需要 LACP 和 EnterChannel。

  Bonding 配置

创建 bonding 设备的配置文件:
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BONDING_OPTS= "miimon=100 mode=0"    # 监控间隔,100 毫秒
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no

查看 bond0 状态:
/proc/net/bonding/bond0

两块网卡都进行配置:

重启网络服务

  CentOS7 网络属性配置