1. 程式人生 > >【2018深信服 醒獅計劃】《網路協議》學習筆記

【2018深信服 醒獅計劃】《網路協議》學習筆記

2018深信服“醒獅計劃”筆記

第3周(5.07-5.13)

課程 必修 選修 基本要求
網路基礎 TCP/IP模型,協議特點 《策略路由,Netfilter,iptables 開發知識培訓講義》 TCP、UDP、ARP、NAT、閘道器、網橋、VLAN、路由、抓包工具tcpdump/winshark

第一部分 Wireshark的使用

1. Wireshark安裝

Ubuntu 16.04下安裝網路流量分析工具 Wireshark 的方法

sudo apt-add-repository ppa:wireshark-dev
/stable sudo apt-get update sudo apt-get install wireshark

這裡寫圖片描述

如果沒有彈出上面視窗,就執行下面命令列

sudo dpkg-reconfigure wireshark-common

如果想要使用命令列版本時,需要安裝tshark

sudo apt-get install tshark

命令列抓取特定網絡卡和埠的包,

sudo tshark -i eth0 port 8080

現在是不成功的,需要先進行下面步驟,把許可權先設定好

2. 許可權/使用者組設定

GUI:普通使用者不能夠開啟網絡卡裝置進行抓包,Wireshark不建議使用者通過sudo在root許可權下執行

這裡寫圖片描述

解決方法

sudo vim /etc/group

“wireshark:x:130:”後面輸入當前登入的使用者名稱,我這裡為“luojie”。提示:按i為插入,然後輸入使用者名稱,按esc,然後輸入“:wq”進行儲存。完成以上步驟之後,需要登出後重新登入來使設定生效,再次開啟即可。

這裡寫圖片描述

重啟之後就能正常使用

這裡寫圖片描述

3. 開啟

鍵入wireshark就可以開啟

wireshark

這裡寫圖片描述

每次鍵入的話很不方便,所以可以右鍵圖示,lock from Launcher就可以固定在桌面上了

這裡寫圖片描述

4. Wireshark基本用法

Wireshark會捕捉系統傳送和接收的每一個報文。如果抓取的介面是無線並且選項選取的是混合模式,那麼也會看到網路上其他報文。

這裡寫圖片描述

TCP/IP通過三次握手建立一個連線。這一過程中的三種報文是:SYN,SYN/ACK,ACK,第一步是找到PC傳送到網路伺服器的第一個SYN報文,這標識了TCP三次握手的開始。
如果你找不到第一個SYN報文,選擇Display Filter,輸入過濾條件tcp.flags.syn==1,回車,顯示的就是篩選之後的內容了。

這裡寫圖片描述

因為學校限流量20G完全不夠用,窮逼沒錢上網,所以我的電腦配置了shadowsocks+ipv6來進行(免流量上網+同時還自帶梯子),所以截圖裡面的資料包都走的是本地ip,外部走的都是ipv6

第二部分 tcpdump的使用

0_0 不小心看岔了,Linux原來不用看wireshark…..

1. tcpdump -D 獲取網路介面卡列表

tcpdump -D

這裡寫圖片描述

2. 抓取所有資料

sudo tcpdump -i <需要監控的網路介面卡編號>

sudo tcpdump -i any

這裡寫圖片描述

tcpdump詳細命令

引數 命令
-i 引數指定監聽網口
-c 引數指定監聽的資料包數量
-s 引數指定監聽資料包大小
-w 引數指定監聽資料包寫入檔案

如果要監聽某幾臺主機資料包 例如10.10.10.1020.20.20.2030.30.30.30

tcpdump host 10.10.10.10 and \(20.20.20.20 or 30.30.30.30\)

試一下抓取一下網頁資料包,就拿

CSDN試一下 IP是47.95.47.253

這裡寫圖片描述

開始監聽

sudo tcpdump host 47.95.47.253

這裡寫圖片描述

重新整理一下頁面

這裡寫圖片描述

如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通訊的ip包

tcpdump ip host 210.27.48.1 and ! 210.27.48.2

如果獲取10.10.10.10:80發出去的資料包

tcpdump -i eth0 src host 10.10.10.10 and src port 80

如果獲取發往10.10.10.10:80的資料包

tcpdump -i eth0 dst host 10.10.10.10 and dst port 80

只抓取syn

tcpdump -i eth0 tcp[13]==2

只抓取fin

tcpdump -i eth2 tcp[13]==1

只抓取synack

tcpdump -i eth2 tcp[13]==18

抓取10.10.10.10:80synsynack

tcpdump -i eth2 tcp[13]==2 or tcp[13]==18 and port 80 and host 10.10.10.10

第三部分 TCP/IP Internals

1. IP

1.1 IP資料封裝圖

這裡寫圖片描述

1.2 IP包格式

這裡寫圖片描述

名稱 備註
version 4位版本號,目前為4
IHL 頭部長度,4位元組為單位
Tos 區分服務
TL 包括資料的總長度
Identification 標識
Flags 標記
Fragment Offset 分片偏移
TTL 資料包生存時間
Protocol 協議型別
checkSum 校驗和

1.3 Time To Live(TTL)

  • 防止資料包在網路上環回
  • 由時間值變化為路由的跳數
  • 當TTL變0時,資料包被丟棄,ICMP Time Exceeded messages包傳送給該資料包的源地址。

1.4 IP Fragment

  • MTU:鏈路層的特性決定了資料幀的最大長度
  • 標識:每個IP包的唯一值,相同的分片標識相同

    0 DF MF
  • DF: 0=可以分片 1=不可以分片出錯時傳送ICMP

  • MF: 0=最後一個分片 1=還有更多的分片在後面
  • 偏移:標識本包在整個包中的位置,以8位元組為單位
  • 任何一片資料的丟失需要上層重傳整個報文

1.5 Requirement in Transport Layer

  • 主機之間程序之間的傳輸 -支援多程序的併發
  • 保證可靠的資料分發
  • 必須按照上層傳送資料的順序有序傳送
  • 對每個報文最多拷貝一次
  • 必須在接收方和傳送方之間做到同步
  • 允許接收方對傳送方進行流控

2. TCP

  • TCP

    • 所提供的服務:程序到程序的通訊,基於位元組流的,面向連線的,全雙工的可靠的通訊服務。
    • 三次握手、序列號、校驗和、重傳、確認
    • 滑動視窗
    • 流量控制
    • 擁塞控制
    • RAP(positive acknowledgement with retransmission)

    如果在協議中,傳送方在準備下一個數據專案之前先等待一個肯定的確認,則這樣的協議稱為PAR

TCP provides reliability by doing the following:

  • The application data is broken down into what TCP considers the best sized chunks to send. The unit of information passed by TCP is called a segment
    • When TCP sends a segment it maintains a timer, waiting for the other end to acknowledge reception of the segment. If an acknowledgement is not received in time, the segment is retransmitted.
    • When TCP receives data from the other end of the connection, it sends an acknowledgement. This acknowledgement is normally not sent immediately but delayed a fraction of a second.
    • TCP maintains a checksum on its header and data. This is an end-to-end checksum whose purpose is to detect modification of the data in transit. If a segment arrives with an invalid checksum, TCP discards it and does not acknowledge receiving it.
    • Since TCP segments are sent as IP datagrams, and since IP datagrams can arrive out of order, TCP segments can arrive out of order. A receiving TCP resequences the data if necessary, passing the received data in the correct order to the application.
    • Since IP datagrams can be duplicated, a receiving TCP must discard duplicate data.
    • TCP also provides flow control.

2.1 TCP Model

這裡寫圖片描述

2.2 TCP header

這裡寫圖片描述

名稱 備註
源埠/目地埠 各16位,標識應用程式的埠號,取值範圍:0~65535。
序列號 這個32位欄位定義本報文段第一個資料位元組的序列號。TCP對每個資料位元組都有一個編號,初始序列號(ISN)在連線建立的時候隨機產生。
確認號 這個32位欄位定義了接收端期望從對方接收的序號。確認號可以和資料捎帶在一起傳送。
頭部長度 表示頭部4位元組為單位的長度,頭部最長為15*4=60位元組。
保留 6位,在當前的Linux實現中只有4位。
控制位
–> URG 緊急指標有效
–> ACK 確認欄位有效
–> PUSH 立即推送資料,大多數情況被忽略
–> RST 連線復位
–> SYN 連線建立的復位
–> FIN 終止連線
–> ECE(ECN-Echo) 標識支援顯示擁塞通知(RFC3168)
–> CWR(Congestion Window Reduced) 視窗降低標記,表明自己已經降低了傳送速度(RFC3168)
視窗值 16位,表明接收方的接收視窗大小,用於流控
校驗和 強制性使用,覆蓋TCP頭部和資料
緊急指標 當URG有效時,該16位有效。把緊急指標+序列號可以得到報文段中最後一個緊急資料位元組。
可選項 最多40個位元組,常見的有時間戳選項、視窗擴大選項、最大報文長度選項、SACK選項。

2.3 Handshake

這裡寫圖片描述

2.4 Closing A Connection

這裡寫圖片描述

16:02:47.162871 IP 59.66.122.66.23 > 59.66.24.89.49219: F 11540:11540(0) ack 97 win 5792 <nop,nop,timestamp 35945029 949674616>
16:02:47.162936 IP 59.66.24.89.49219 > 59.66.122.66.23: . ack 11541 win 65535 <nop,nop,timestamp 949674616 35945029>
16:02:47.164937 IP 59.66.24.89.49219 > 59.66.122.66.23: F 97:97(0) ack 11541 win 65535 <nop,nop,timestamp 949674616 35945029>
16:02:47.166552 IP 59.66.122.66.23 > 59.66.24.89.49219: . ack 98 win 5792 <nop,nop,timestamp 35945029 949674616> 

ack=F+1

2.5 half-close

這裡寫圖片描述

2.6 TCP State Machine

這裡寫圖片描述

  • TCP options
  • 選項最長只能是40位元組
  • 選項必須4位元組對齊
  • 格式:
Kind(8位) Length(8位) Content
型別 備註
kind=0 EOP選項結束標記
kind=1 NOP無操作,用於4位元組對齊的填充
kind=2 MSS選項
kind=3 視窗擴大選項
kind=4 SACK Permitted選項
kind=5 SACK資料選項
king=8 時間戳選項
kind-19 MD5簽名

3. 流控

3.1 流量控制的兩個極端

  • 一次傳送一個位元組(停等協議,效率極低)
  • 傳送擁有的所有資料(可能使接收方來不及接收,原端也無法儘快知道資料包的丟失)

3.2 滑動視窗協議

  • 保證資料的可靠傳遞
    • 未確認的資料必須被髮送方快取起來
  • 保證資料的有序傳輸
    • 亂序的資料必須被接收方快取起來
  • 提供End-to-End的流控機制
    • 傳送方傳送太快就必須阻塞等待

3.3 sliding windows

這裡寫圖片描述

3.4 Nagle演算法:

  • 傳送端把從應用層收到的第一個資料傳送出去
  • 傳送完第一個後,傳送端緩衝資料並等待,直到:a 收到上一次的確認;b 積累到MSS大小的資料。
  • 重複步驟2

這裡寫圖片描述

3.5 Clark演算法

  • 在快取空間超過MSS之前或者快取空間的一半變空之前,一直宣佈視窗為0.

4. 差錯控制

  • 通過校驗和、確認和重傳三個機制來保證
  • ACK:不消耗序列號,不需要確認
  • 原則:
    • 在傳送資料時捎帶確認,減少通訊量
    • 延遲確認原則,同樣是避免ACK報文段產生的過多報文段
    • 在任何時候不能有兩個以上的按序的未被確認的報文段
    • 收到亂序報立即傳送ACK
    • 當丟失的報文段到達時立即傳送ACK
    • 收到重複的報文段立即傳送ACK

4.1 重傳

  • 重傳定時器到或者3個重複ACK(快速重傳)

4.2 Karn演算法

  • 對重傳的報文段不計算RTT

5. 擁塞控制

5.1 擁塞控制時的演算法:

  • 慢啟動
  • 擁塞避免
  • 快速重傳

5.2 ACK原則之一:

  • 每一個亂序包均需要立即傳送一個重複的ACK
  • 如果連續收到3個或以上的重複ACK,那麼很有可能是有資料包丟失了

5.3 快速重傳:

  • 當收到3個重複ACK時的措施
    • ssthresh=min(cwnd/2, 2)
    • cwnd=ssthresh+3
    • 如果再收到重複的ACK,cwnd+=1MSS,如果收到新資料的ACK,那麼cwnd=ssthresh,重新進入加法增大的過程

5.4 恢復

  • 在快速恢復的狀態中,收到新的資料ACK就退出快速恢復階段。
  • Reno
    • 新的ACK表示不是和之前的ACK是同一個即可。
  • NewReno
    • 新的ACK是把所有的在進入快速恢復階段的資料段全部確認。

5.5 RTT

  • RTT的真正含義:一個報文段從傳送出去到收到確認的時間。

5.6 PAWS:(Protection Against Wrapped Seuence numbers)

  • 用時間戳和序列號兩個標記來表示連線,相當於序列號從32位空間擴大到64位,防止在高速鏈路上序列號環繞

5.7 慢啟動

這裡寫圖片描述

6. 效能問題

T=1.2MSSPRTT

Avg(cwnd)=1.2P
+ T:吞吐量
+ p:丟包率
+ RTT:時延

6.1 影響效能

  • 1.視窗不夠大,受頭部16位限制
    • BDP=10Mbps*100ms=122.07KB,遠遠大於2^16=65536位元組,極端下去就是停等協議。
  • 解決方法:

    • 視窗擴大選項,新增1個位元組的移位計數器,實際視窗大小=16位的視窗值左移移位計數。
  • 2.視窗增長方式:加法增大,乘法減小

    • 1Gbps,100ms,BDP=12,500,000位元組,按MSS 1500位元組計算,需要增長到8333個包的擁塞視窗,也就是8333個RTT的時間。
    • 一旦出現丟包,視窗減半,那麼又得重新開始增長,顯然難以充分利用網路頻寬。
  • 解決方法:TCP變種(HSTCP,BICTCP/CUBIC,FastTCP)

6.1 BIC TCP (Binary Increase Congestion control)

BIC TCP is one of the congestion control algorithms that can be used for Transmission Control Protocol (TCP). BIC is optimized for high speed networks with high latency: so-called “long fat networks”.

BIC has a unique congestion window (cwnd) algorithm. This algorithm tries to find the maximum where to keep the window at for a long period of time, by using a binary search algorithm.

6.2 慢啟動

最初的TCP在連線建立成功後會向網路中傳送大量的資料包,這樣很容易導致網路中路由器快取空間耗盡,從而發生擁塞。因此新建立的連線不能夠一開始就大量傳送資料包,而只能根據網路情況逐步增加每次傳送的資料量,以避免上述現象的發生。具體來說,當新建連線時,cwnd初始化為1個最大報文段(MSS)大小,傳送端開始按照擁塞視窗大小發送資料,每當有一個報文段被確認,cwnd就增加1個MSS大小。這樣cwnd的值就隨著網路往返時間 (Round Trip Time,RTT)呈指數級增長,事實上,慢啟動的速度一點也不慢,只是它的起點比較低一點而已。我們可以簡單計算下:


  • 開始 —> cwnd = 1
  • 1RTT —> cwnd = 2*1 = 2
  • 2RTT —> cwnd = 2*2 = 4
  • 3RTT —> cwnd = 4*2 = 8
如果頻寬為W,那麼經過RTT*log2W時間就可以佔滿頻寬

6.3 擁塞避免

從慢啟動可以看到,cwnd可以很快的增長上來,從而最大程度利用網路頻寬資源,但是cwnd不能一直這樣無限增長下去,一定需要某個限制。TCP使用了一個叫慢啟動門限(ssthresh)的變數,當cwnd超過該值後,慢啟動過程結束,進入擁塞避免階段。對於大多數TCP實現來說,ssthresh的值是 65536(同樣以位元組計算)。擁塞避免的主要思想是加法增大,也就是cwnd的值不再指數級往上升,開始加法增加。此時當視窗中所有的報文段都被確認時,cwnd的大小加1,cwnd的值就隨著RTT開始線性增加,這樣就可以避免增長過快導致網路擁塞,慢慢的增加調整到網路的最佳值。

6.4 檢測擁塞

首先來看TCP是如何確定網路進入了擁塞狀態的,TCP認為網路擁塞的主要依據是它重傳了一個報文段。上面提到過,TCP對每一個報文段都有一個定時器,稱為重傳定時器(RTO),當RTO超時且還沒有得到資料確認,那麼TCP就會對該報文段進行重傳,當發生超時時,那麼出現擁塞的可能性就很大,某個報文段可能在網路中某處丟失,並且後續的報文段也沒有了訊息,在這種情況下,TCP反應比較“強烈”
+ 把ssthresh降低為cwnd值的一半
+ 把cwnd重新設定為1
+ 重新進入慢啟動過程。

6.5 時延的判斷

時延:是資料(一個報文或分組,甚至位元)從網路或鏈路的一段傳送到另一端所需要的時間。

傳送時延:是從傳送資料幀的第一個位元算起,到該幀的最後一個位元傳送完畢所需的時間。
傳送時延=資料幀長度(b) /通道頻寬(b/s) [通道頻寬就是資料率]
傳播時延:電磁波在通道中需要傳播一定的距離而花費的時間。
傳播時延=通道長度(m)/電磁波在通道上的傳播速率(m/s)
處理時延:主機或路由器處理所收到的分組的時間。
排隊時延:分組在輸入佇列中排隊等待處理,在輸出佇列中等待轉發,就形成了排隊時延。
總時延=傳送時延+傳播時延+處理時延+排隊時延

6.6 速率的計算方法

我們知道1個千兆埠的線速包轉發率是1.4881MPPS,

百兆埠的線速包轉發率是0.14881MPPS,這是國際標準,但是如何得來的呢?

具體的資料包在傳輸過程中會在每個包的前面加上64個(前導符)preamble也就是一個64個位元組的資料包,原本只有512個bit,但在傳輸過程中實際上會有512+64+96=672bit,也就是這時一個數據包的長度實際上是有672bit的千兆埠線速包轉發率=1000Mbps/672=1.488095Mpps,約等於1.4881Mpps,百兆除於10

為0.14881Mpps那麼以後很簡單了,其實直接用裝置引數中的pps數值乘以672那麼就轉化成我們比較能理解的大眾化的bps概念了。

一般銷售為了方便大家計算和整數化的理解就改672為500。

傳輸速率

bps(bits per second)
1M頻寬的意思是1Mbps注意是bps而不是Bps

換算吧,1Bps=8bps;

所以1Mbps=128KBps;

所以下載速度最高為128KBps

1Mbps=1024KBps/8=128KBps

6.7 DAIMD

DAIMD: An Improved Multimedia Stream Congestion Control Algorithm?

6.8 顯式擁塞通告(ECN)

為了避免因為路由器擁塞而帶來的丟包而產生的一系列問題,TCP/IP的設計者們建立了一些用於主機和路由器的標準。這些標準描述了在IP路由器上進行的主動佇列管理演算法(AQM)(RFC 2309),使得路由器能夠監控轉發佇列的狀態,以提供一個路由器向傳送端報告發生擁塞的機制,讓傳送端在路由器開始丟包前降低傳送速率。這種路由器報告和主機響應機制被稱為顯式擁塞通告(ECN)(RFC 3168)

6.9 前向糾錯編碼(FEC)

前向糾錯編碼(FEC),技術通過在傳輸碼列中加入冗餘糾錯碼,在一定條件下,通過解碼可以自動糾正傳輸誤碼,降低接收訊號的誤位元速率(BER)。在WDM系統中,衡量FEC糾錯能力的指標稱為“FEC編碼增益”,該增益越強表示糾錯效能越強。

前向糾錯技術(Forward Error Correction)在確保訊號的長距可靠傳輸方面也起著非常重要的作用。相比於10G系統,100G的OSNR需要提高10倍,這需要多種技術的組合應用才能實現,其中就包括FEC。

7. UDP

特徵:
+ 提供給應用傳送不可靠報文的選項,通常用於多播
+ 無需連線的概念,提供快速的資料傳送
沒有流控和擁塞控制

應用:TFTP、SNMP、DHCP、DNS、RIP、RTP

8. Linux下TCP實現分析