【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
+ 重新進入慢啓動過程。

原文:https://www.cnblogs.com/gofighting/p/5411702.html

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?

詳情參考:https://www.atlantis-press.com/proceedings/meita-15/25838470

6.8 顯式擁塞通告(ECN)

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

詳情參考:http://network.51cto.com/art/200901/107005.htm

6.9 前向糾錯編碼(FEC)

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

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

詳情參考:https://blog.csdn.net/u013566722/article/details/48374219

7. UDP

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

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

8. Linux下TCP實現分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章