iptables
- http://luckylau.tech/2017/04/06/Linux%E7%9A%84iptables%E5%8E%9F%E7%90%86/
- https://bbs.huaweicloud.com/blogs/114066
三次握手,四次揮手
SYN cookies 算法
SYN Cookies
算法wiki可以解決上面的第1
個問題以及第2
個問題的一部分
我們知道,TCP
連接建立時,雙方的起始報文序號是可以任意的。SYN cookies
利用這一點,按照以下規則構造初始序列號:
- 設
t
為一個緩慢增長的時間戳(典型實現是每64s遞增一次) - 設
m
為客戶端發送的SYN
報文中的MSS
選項值 - 設
s
是連接的元組信息(源IP,目的IP,源端口,目的端口)和t
經過密碼學運算后的Hash
值,即s = hash(sip,dip,sport,dport,t)
,s
的結果取低 24 位
則初始序列號n
為:
- 高 5 位為
t mod 32
- 接下來3位為
m
的編碼值 - 低 24 位為
s
當客戶端收到此SYN+ACK
報文后,根據TCP
標準,它會回復ACK
報文,且報文中ack = n + 1
,那么在服務器收到它時,將ack - 1
就可以拿回當初發送的SYN+ACK
報文中的序號了!服務器巧妙地通過這種方式間接保存了一部分SYN
報文的信息。
接下來,服務器需要對ack - 1
這個序號進行檢查:
- 將高 5 位表示的
t
與當前之間比較,看其到達地時間是否能接受。 - 根據
t
和連接元組重新計算s
,看是否和低 24 一致,若不一致,說明這個報文是被偽造的。 - 解碼序號中隱藏的
mss
信息
到此,連接就可以順利建立了。
tcp和udp的區別
tcp是
面向連接
可靠
全雙工
流量控制,擁塞控制
面向字節流
停等協議(超時重傳,自動重傳請求)
udp是無連接
最大努力交付
沒有擁塞控制
面向報文,由IP分片,因此應用進程必須選擇合適大小的報文
多播(一對一,一對多,多對一,多對多)
端口不可達,發送ICMP差錯報文
tcp的擁塞控制,以及bbr
- https://juejin.im/post/6844904065759969287
-
http://www.taohui.pub/2019/08/07/%E4%B8%80%E6%96%87%E8%A7%A3%E9%87%8A%E6%B8%85%E6%A5%9Agoogle-bbr%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86/
image.png
為什么需要udp
IP是
盡力而為交付
不確保報文段交付
不保證報文段按序交付
不保證報文段中數據完整性
UDP是
進程到進程的數據交付
并且有差錯檢查
ping和traceroute的原理
使用的是ICMP協議,
差錯報告報文:終點不可達,參數問題,改變路由
詢問報文:回送請求
ping命令的功能
(1)能驗證網絡的連通性
(2)會統計響應時間和TTL(IP包中的Time To Live,生存周期)
那么如何驗證的呢?
(1)ping命令會先發送一個 ICMP Echo Request給對端
(2)對端接收到之后, 會返回一個ICMP Echo Reply
(3)若沒有返回,就是超時了,會認為指定的網絡地址不存在。
問題:
telnet是23端口,ssh是22端口,那么ping是什么端口?
答:ping命令是基于ICMP,是在網絡層。
而端口號,是傳輸層的內容。所以在ICMP中根本就不關注端口號這樣的信息。
- Traceroute程序
Traceroute是ICMP協議的另一個重要應用,主要用來偵測源主機到目的主機之間所經過的路由的情況。
Traceroute使用ICMP報文和IP首部中的TTL字段,其原理很簡單,
開始時發送一個TTL字段為1的UDP數據報,而后每次收到ICMP超時報文后,再發送一個TTL字段加1的UDP數據報,以確定路徑中的每個路由器,而每個路由器在丟棄UDP數據報時都會返回一個ICMP超時報文,
最終到達目的主機后,由于ICMP選擇了一個不可能的值作為UDP端口(大于30000)。這樣目的主機就會發送一個端口不可達的ICMP差錯報文。 - https://tonydeng.github.io/sdn-handbook/basic/icmp.html
cookie & session
HTTP 2.0
二進制分幀
多路復用
流量控制
首部壓縮
請求優先級
服務器推送