本书强调的是技巧教学,顺便科普知识点
知识点包括tcp交互,tcp拥堵算法,窗口和rto调优(backlog调优没讲)
http, dns ,udp,arp, ip的identification, kerberos,ftp
这些知识都是通过抓包学习的。
尤其tcp的知识,通过统计分析,重传的细节等观察网路的质量。
【实用技巧】做实验的时候,用ping ip -l 1来分割每一个试验步骤,避免所有试验步骤的包丢在意思影响分析。(类似debug的埋点)
想要优化网速可以通过调RTO的重传时间和拥堵窗口优化网络(拥堵默认64k,有时通过窗口因子调大,在系统配置即可)
mss正常是1k左右,也可以通过端到端调节“LSO,LRO,TSO,UFO,GRO等扩大”,但网络质量不好,会影响性能。
tcp会累计ack,还会延迟ack。
RST包出现,意味着网络存在严重问题。
如果不用三次握手,容易产生很多没有对端的链接浪费资源。
由于规定一个tcp segment可以过活2分钟(MSL为2分钟),主动关闭要等time wait是要等一个包的往返,需要2MSL,但实际上不用那么长时间,一般都设置为1分钟或者30秒。当初这设4分钟是担心端口同时被两个链接复用了。(SO_REUSEADDR一般在服务器用,导致重启后出现timewait端口冲突异常)。
接收窗口可以自己调。
接收窗口需要结合拥堵与接收窗口决定。
每次发送都会开重传定时器(默认1000ms,最小调成200ms).
为了防止等太久重传定时器,可以通过收到3次重复Dack后快速重传(为什么要3次,而不是2次?因为避免把延迟误认为丢包,触发频繁的快速重传浪费流量)
重传的三种方案:1.整组flight包都重传(已发未ack都叫flight)。2.收一个ack补发一个(这个叫newreno,如果丢太多,性能差)。3.目前比较流行的SACK,每个ack会携带一个收已收区间,只需把丢包区间重发即可(RFC2018)。
重传定时器等ack期间不能川数据,而且影响拥堵窗口,对性能影响要命。
“慢启动”并不慢,如果网速好,提高临界窗口延长慢启动的时间有时候挺好的(也就是调大拥堵窗口)。
如果能够触发快速重传,说明并不拥堵,这个时候拥堵会触发“快速恢复”(了解一下就好,没啥意义)
作者说没见过nagle算法(“那哥算法”)出现过线上问题。
但延迟确认会导致 “拖延拥堵慢启动” “触发RTO” (如果开启SACK,RTO的问题会好转)
延迟确认不是错误,所以很难发现,可以用“tcp.analysis.ack_rtt > 0.2”初步过滤。
作者说如果用udp发大datagram会很恶心,理由:1.超过mtu导致ip层分组排序重组,性能差。2.组中有丢帧,会导致整组重传(tcp的话丢哪个传重哪个,很人性)。3.发大包时,黑客可以发more fragment为1的包,让包组装不了,消耗内存,影响会话。
所以别用udp传大包。
NAT会导致基于ip的各种白名单黑名单失效。(所以租IP池生意很好,一个月几十块)
LSO,NIC teaming等offload技术会导致乱序(毕竟网卡重组大包没小包那么快,所以乱序是正常的)
快速重传和SACK是优化拥堵网络的神器,尤其是记得把SACK开起来。
对awk和sed很熟?那把tshark也学一下,成为抓包高手,网络geek无敌手。
从DNS学到了递归与迭代的区别(递归就是你找我解决问题,我找别人帮你。迭代就是,你找我解决问题,我告诉你找谁可以帮到你。)
DNS的cname可以方便我们给多个同IP的域名改IP,A记录的A是address的意思。
《对林沛满先生两本“Wireshark秘籍”的摘要与总结》https://zhuanlan.zhihu.com/p/137044525
《wireshark网络分析就是这么简单》林沛满