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/
为什么需要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
二进制分帧
多路复用
流量控制
首部压缩
请求优先级
服务器推送