網路基礎和 TCP、IP 協議

我聽過發表於2020-07-01

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 網路屬性配置

   

 

相關文章